antlr lexerルールの奇妙な副作用があり、それを示すために(ほぼ)最小限の作業例を作成しました。この例では、たとえば文字列と一致させたいと思い[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');