Mam dziwny efekt uboczny zasady lexer Antlr i stworzyłem (prawie) minimalny przykład pracy, aby to zademonstrować. W tym przykładzie chcę na przykład dopasować ciąg [0..1]
. Ale kiedy debuguję gramatykę, strumień tokenów docierający do parsera zawiera tylko [..1]
. Pierwsza liczba całkowita, bez względu na to, ile cyfr zawiera, jest zawsze zużywana i nie mam pojęcia, jak to się dzieje. Jeśli usunę regułę, wszystko będzie dobrze, więc domyślam się, że błąd leży gdzieś w tej zasadzie. Ale ponieważ w ogóle nie pasuje do niczego w [0..1]
, jestem całkiem zaintrygowany.Reguła lexera ANTLR zużywa znaki, nawet jeśli nie są dopasowane?
Byłbym szczęśliwy z powodu wszelkich wskazówek, które mogły mi się nie udać. To jest mój przykład:
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');
To było (przynajmniej dla mnie) nieoczekiwane zachowanie. Dziękuję za kompleksowy przykład, mam wszystko uruchomione teraz :-) – Lichtblitz
@Lichtblitz, nie ma za co, i tak, tokenizacja '..' (w połączeniu z tokenami INT i FLOAT) jest trudna ! :) –