У меня есть определение правила, как это:Antlr маркер приоритета
reference: volume':'first_page'-'last_page ;
volume: INTEGER;
first_page: INTEGER;
last_page: INTEGER;
INTEGER: [0-9]+;
FREE_TEXT_WORD: NON_SPACE+;
fragment NON_SPACE : ~[ \r\n\t];
Учитывая вход «168: 321-331», я думал, что это будет соответствовать ссылочный правило. Но на самом деле вся строка обозначается как FREE_TEXT_WORD.
Как я могу сделать INTEGER токенов предпочтение взять на себя FREE_TEXT_WORD в этом случае?
Спасибо.
-1: Это не делает то, что похоже на то, что он делает. То, что вы на самом деле сделали, преобразует правило в 'FREE_TEXT_WORD: NON_SPACE;', что позволяет правилу 'INTEGER' соответствовать вводу путем принуждения правила' FREE_TEXT_WORD' к * never * соответствовать более одного символа. –
@ 280Z28 Спасибо за комментарий. У меня действительно сложилось впечатление, что это проблема жадности, и мой быстрый тест решил проблему OP, поэтому я представил ответ. Однако вчера я купил книгу, поэтому дайте мне немного переварить ее. Я сохраню ответ здесь и в конечном итоге обновит его или удалю. – auselen