2013-03-09 10 views
2

아이러니 (나는 약 10 년 전 유니온에서 BNF를 배웠다.)를 처음 접했고, 준 실제 좌표 파서를 만드는 것으로 시작했다. 다음은 아이러니 문법 사양 오류

가 나는 문법 탐색기를 실행할 때, 그러나 입력을

70 50' 44" N 1 13' 66" E 

을 구문 분석 할 수 있었어야했는데 생각 문법 클래스 (https://github.com/spadger/notam-visualiser에서 전체 코드), 난 1에서 구문 오류 : 4 "expected : space"

내 코드에 어떤 문제가 있는지 알 수 있습니까?

감사합니다,

[Language("Simple non-real coordinates", "0.1", "A grammar to parse an imaginary coordinate system")] 
public class CoordinateGrammar : Grammar 
{ 
    //70 50' 44" N 1 13' 66" E 
    public CoordinateGrammar() 
    { 
     #region Terminals 
     var integer = new NumberLiteral("integer", NumberOptions.IntOnly); 
     var space = ToTerm(" ", "space"); 
     var point = ToTerm(".", "dot"); 
     var lat = ToTerm("N", "north") | ToTerm("S", "south"); 
     var lon = ToTerm("E", "east") | ToTerm("W", "west"); 
     var minuteMarker = ToTerm("'", "minute"); 
     var secondMarker = ToTerm("\"", "second"); 
     #endregion 

     #region Non-Terminals 
     var decimalAmount = new NonTerminal("decimalAmount", typeof(DecimalAmountNode)); 
     var minute = new NonTerminal("minute", typeof(MinuteNode)); 
     var second = new NonTerminal("second", typeof(SecondNode)); 

     var imperialMagnitude = new NonTerminal("decimalMagnitude", typeof (ImperialMagnitudeNode)); 

     var imperialLatitude = new NonTerminal("imperialLatitude", typeof (ImperialLatitudeNode)); 
     var imperialLongitude = new NonTerminal("imperialLongitude", typeof (ImperialLongitudeNode)); 
     var imperialCoordinate = new NonTerminal("imperialCoordinate", typeof(ImperialCoordinateNode)); 
     #endregion 

     #region Rules 
     decimalAmount.Rule = integer | integer + point + integer; 

     minute.Rule = integer + minuteMarker; 
     second.Rule = integer + secondMarker; 
     imperialMagnitude.Rule = integer + space + minute + space + second; 
     imperialLatitude.Rule = imperialMagnitude + space + lat; 
     imperialLongitude.Rule = imperialMagnitude + space + lon; 
     imperialCoordinate.Rule = imperialLatitude + space + imperialLongitude; 
     #endregion 

     Root = imperialCoordinate; 
    } 
} 

답변

1

그것을 고정!

수동으로 공백을 예상했지만 '공백'문자를 공백으로 처리하도록 문법이 이미 구성되어 있습니다. non-termanal 규칙을 아래로 업데이트하면 문제가 해결됩니다.

decimalAmount.Rule = integer | integer + point + integer; 

minute.Rule = integer + minuteMarker; 
second.Rule = integer + secondMarker; 
imperialMagnitude.Rule = integer + minute + second; 
imperialLatitude.Rule = imperialMagnitude + lat; 
imperialLongitude.Rule = imperialMagnitude + lon; 
imperialCoordinate.Rule = imperialLatitude + imperialLongitude;