В случае, если 2 или более правила лексера совпадают с одинаковым количеством символов, первое правило будет побеждать. Другими словами, для ввода or
, bot могут быть сопоставлены правила WORDS
и OR
. А так как WORDS
определяется первым, он выигрывает.
Своп заказ:
conjunction : WORDS OR WORDS ;
OR: ' or ' ;
WORDS: [A-Za-z ]+ ;
Однако лексический Antlr совпадает как можно больше. Таким образом, вышесказанное будет работать, только если вы отметите or
. Если вы попытаетесь tokenize John Smith or apple sauce
, правило WORDS
будет соответствовать всем!
Вы не должны включать в себя пространство:
conjunction : WORDS+ OR WORDS+ ;
OR: 'or' ;
WORDS: [A-Za-z]+ ;
SPACES: [ \t\r\n] -> skip ;
Когда я проверить ввод John or apple
с анализатором генерируемого из приведенных выше грамматиков, я получаю это:
и для ввода John Smith or apple sauce
это:
Удалите пробел из регулярного выражения WORDS ('СЛОВА: [A-Za-z] +;'). – Phylogenesis
Но я хочу, чтобы он мог сопоставлять пробелы. См. Мой отредактированный пост. – RaptorDotCpp
Работает ли использование неживого оператора? ('СЛОВА: [A-Za-z] +?;') – Phylogenesis