次の非常に単純な文法の例は、私が期待したように (まったく) lex しません。
Declaration : 'VAR';
Letter: ('A'..'Z');
message : Declaration Letter+;
結果として私が期待したのは、文字のシーケンスは個々の文字として lex され、シーケンス 'VAR' は単一のトークンとして lex されることです。
ANTLRWorksインターパーターを見ると、次の結果が表示されます。
VARA
に解析しますmessage -> "VAR", "A"
(期待)VARVA
(MismatchedTokenException(-1 != 5) を解析しません。レクサーは 2 番目にヒットし、VA
トークン化を試みDeclaration
ます。期待される:message -> "VAR", "V", "A"
VARVPP
に解析しますmessage -> "VAR", "V", "P", "P"
(期待)VARVALL
に解析しmessage -> "VAR", "VALL"
ます。
この動作を理解するための助けと、これを修正する方法を提案したいと思います。
具体的には:
- lexer が で始まるすべての文字列を
VA
Declaration にトークン化しようとするのはなぜですか? - lexer が a で始まるすべての文字列でこれを実行しようとしないのはなぜ
V
ですか? - そこに追加の文字がある場合、レクサーがこれを実行しようとしないのはなぜですか?
- この文法を変更して、期待どおりに解析するにはどうすればよいですか?