У меня есть следующие ANTLR 4 в сочетании Грамматика:Перекрытие Лексемы в 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 }
В случае, когда разбор сбой, я думаю, что лексер запутался и выпустил маркер NOTE, где я хочу, чтобы он выдал токен IDENTIFIER.
Edit:
В токенах выходит из лексера, «Примечание» маркер появляется, когда анализатор ожидает «IDENTIFIER». «ПРИМЕЧАНИЕ» имеет более высокий приоритет, потому что он показан сначала в грамматике. Итак, я могу придумать два способа исправить это ... во-первых, я мог бы изменить грамматику, чтобы устранить неоднозначность «NOTE» и «IDENTIFIER» (например, добавить «$» перед «NOTE»). Или я мог бы просто использовать «IDENTIFIER», где я буду использовать заметку, а затем заниматься обнаружением проблем, когда я иду по дереву разбора. Ни один из них не чувствует себя оптимально. Неужели должен быть способ исправить это?
Возможно, вы можете использовать лексические режимы для решения проблемы, но это работает не в комбинированных грамматиках. См. Здесь: http://www.antlr.org/wiki/display/ANTLR4/Lexer+Rules – FunThomas424242
ANTLR работает должным образом. Когда токен может соответствовать нескольким правилам лексера (при прочих равных условиях) первое правило сопоставляется первым. Поэтому «a» должен соответствовать NOTE, а не IDENTIFIER. –