5

次の 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」を使用して、解析ツリーをたどるときの問題の検出に対処することもできます。どちらも最適ではありません。確かにこれを修正する方法があるはずですか?

4

2 に答える 2