Во-первых, я знаю, что эта грамматика не имеет смысла, но она была создана для проверки поведения приоритета правила ANTLR
grammar test;
options
{
output=AST;
backtrack=true;
memoize=true;
}
rule_list_in_order :
(
first_rule
| second_rule
| any_left_over_tokens)+
;
first_rule
:
FIRST_TOKEN
;
second_rule:
FIRST_TOKEN NEW_LINE SECOND_TOKEN NEW_LINE;
any_left_over_tokens
:
NEW_LINE
| FIRST_TOKEN
| SECOND_TOKEN;
FIRST_TOKEN
: 'First token here'
;
SECOND_TOKEN
: 'Second token here';
NEW_LINE
: ('\r'?'\n') ;
WS : (' '|'\t'|'\u000C')
{$channel=HIDDEN;}
;
Когда я даю этой грамматике ввод «Первый токен здесь \ nВторой токен здесь», он соответствует второму правилу.
Я ожидал, что оно будет соответствовать первому правилу, а затем any_left_over_tokens, потому что first_rule появляется перед вторым правилом в rule_order_list, который является начальной точкой. Кто-нибудь может объяснить, почему это происходит?
Ура