У меня появился странный побочный эффект правила лексера antlr, и я создал (почти)минимальный рабочий пример, чтобы продемонстрировать его. В этом примере я хочу, например, сопоставить строку [0..1]
. Но когда я отлаживаю грамматику, поток токенов, который достигает синтаксического анализатора, содержит только [..1]
. Первое целое число, независимо от того, сколько цифр оно содержит, всегда потребляется, и я понятия не имею, как это происходит. Если я уберу правило FLOAT
, все будет в порядке, поэтому я предполагаю, что ошибка кроется где-то в этом правиле. Но так как это вообще не должно соответствовать чему-либо в [0..1]
, я весьма озадачен.
Буду рад любым указаниям, где я мог ошибиться. Это мой пример.:
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');