0

私は本当に単純な ANTLR 文法を手に入れようとしていますが、現時点では惨めに失敗しています。これに関するいくつかの指針を本当に感謝します...

root    :   (keyword|ignore)*;
keyword :    KEYWORD;
ignore  :    IGNORE;

KEYWORD : ABBRV|WORD;   

fragment WORD : ALPHA+;
fragment ALPHA : 'a'..'z'|'A'..'Z';
fragment ABBRV : WORD?('.'WORD);

IGNORE  : .{ Skip(); };

次のテスト入力を使用します。

"some ASP.NET and .NET stuff. that work."

キーワード ノードの単なるリストであるツリーが必要です。

"some", "ASP.NET", "and", ".NET", "stuff", "that", "work"

私が得る瞬間に

"some", "ASP.NET", "and", ".NET", "stuff. that",

(なぜか最後のキーワード内に「.」があり、「work」が抜けている)

ABBRV 句を次のように変更すると、

fragment ABBRV : ('.'WORD);

それはうまくいきますが、キーワード(asp)とキーワード(.net)を別々に取得しますが、それらは単一のトークンとして必要です。

あなたが与えることができるどんな助けも大歓迎です。

4

2 に答える 2

0

いくつかのことがあります。まず、無視パーサールールがトリガーされることはなく、この文法に表示される必要もありません(ルートルールからも除外されます)。もちろん、デバッグしていて無視ルールがあったので、テストするのははるかに簡単です(IGNOREレクサールールでskip();を削除することによって)。

次に、テストデータについて説明します。これは、どのレクサートークンもWORD'。'と一致しないためです。テキストの直後のピリオドのため、テストデータの終了は無視されます。'work'とピリオドの間にスペースを入れると、最後の単語が表示され、ピリオドは表示されません。これが必要なものです。レクサーは「作業」をどうするかを知りません。それが終わるとき。最後に別の単語を追加する場合(ピリオドと新しい単語の間にスペースを入れる)、「動作します」。レクサールールから1つのIGNOREトークンとして渡されます。私はその単語が渡され、ピリオドはIGNOREトークンのみにあるべきだと思っていたでしょう。

于 2010-02-05T03:45:10.687 に答える