2

私は Irony を初めて使用し (約 10 年前に大学で BNF を学びました)、準実数の座標パーサーを作成することから始めています。

以下は、入力を解析できるはずだと私が信じてい た文法クラスです (完全なコードはhttps://github.com/spadger/notam-visualiserにあります)。

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

ただし、文法エクスプローラーで実行すると、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;
    }
}
4

1 に答える 1

1

修正しました!

私は手動でスペースを期待していましたが、文法は「スペース」文字を空白マーカーとして扱うように (デフォルトで) 既に構成されていました。非ターミナル ルールを以下に更新すると、問題が解決しました。

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;
于 2013-03-09T19:03:00.753 に答える