У меня странный побочный эффект от правила lexer от antlr, и я создал (почти) минимальный рабочий пример, чтобы продемонстрировать его. В этом примере я хочу, например, сопоставить String [0..1]
. Но когда я отлаживаю грамматику, поток токенов, который достигает синтаксического анализа, содержит только [..1]
. Первое целое число, независимо от того, сколько цифр оно содержит, всегда потребляется, и я не знаю, как это происходит. Если я удалю правило FLOAT
, все будет хорошо, поэтому я предполагаю, что ошибка лежит где-то в этом правиле. Но, поскольку он не должен ничего соответствовать в [0..1]
, я совершенно озадачен.ANTLR lexer rule потребляет символы, даже если они не совпадают?
Я был бы рад за любые указатели, где я, возможно, ошибся. Это мой пример:
grammar min;
options{
language = Java;
output = AST;
ASTLabelType=CommonTree;
backtrack = true;
}
tokens {
DECLARATION;
}
declaration : LBRACEVAR a=INTEGER DDOTS b=INTEGER RBRACEVAR -> ^(DECLARATION $a $b);
EXP : 'e' | 'E';
LBRACEVAR: '[';
RBRACEVAR: ']';
DOT: '.';
DDOTS: '..';
FLOAT
: INTEGER DOT POS_INTEGER
| INTEGER DOT POS_INTEGER EXP INTEGER
| INTEGER EXP INTEGER
;
INTEGER : POS_INTEGER | NEG_INTEGER;
fragment NEG_INTEGER : ('-') POS_INTEGER;
fragment POS_INTEGER : NUMBER+;
fragment NUMBER: ('0'..'9');
Теперь это было (для меня как минимум) неожиданным поведением. Спасибо за исчерпывающий пример: у меня все в порядке и сейчас :-) – Lichtblitz
@ Lichtblitz, приветствую вас, да, токенизация '..' (в сочетании с INT- и FLOAT-токенами) сложна ! :) –