次の非常に単純な文法の例は、私が期待したように (まったく) 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 が で始まるすべての文字列を
VADeclaration にトークン化しようとするのはなぜですか? - lexer が a で始まるすべての文字列でこれを実行しようとしないのはなぜ
Vですか? - そこに追加の文字がある場合、レクサーがこれを実行しようとしないのはなぜですか?
- この文法を変更して、期待どおりに解析するにはどうすればよいですか?



