次の ANTLR 4 結合文法があります。
grammar Example;
fieldList: field* ;
field: 'field' identifier '{' note '}' ;
note: NOTE ;
identifier: IDENTIFIER ;
NOTE: [A-Ga-g] ;
IDENTIFIER: [A-Za-z0-9]+ ;
WS: [ \t\r\n]+ -> skip ;
これは以下を解析します:
field x { A }
field x { B }
これはしません:
field a { A }
field b { B }
解析が失敗した場合、レクサーが混乱し、IDENTIFIER トークンを発行したい場所で NOTE トークンを発行していると思います。
編集:
lexer から出力されるトークンでは、パーサーが「IDENTIFIER」を予期している場所に「NOTE」トークンが表示されます。'NOTE' は文法で最初に表示されるため、優先順位が高くなります。したがって、これを修正するには 2 つの方法が考えられます...まず、文法を変更して「NOTE」と「IDENTIFIER」を明確にすることができます (「NOTE」の前に「$」を追加するなど)。または、メモを使用する場所で「IDENTIFIER」を使用して、解析ツリーをたどるときの問題の検出に対処することもできます。どちらも最適ではありません。確かにこれを修正する方法があるはずですか?