我有一個antlr詞法分析規則的一個奇怪的副作用,我創建了一個(幾乎)最小的工作示例來演示它。 在這個例子中,我想匹配字符串[0..1]
例如。但是當我調試語法時,到達解析器的令牌流只包含[..1]
。第一個整數,無論它包含多少個數字總是被消耗,我不知道如何發生。如果我刪除FLOAT
規則,一切都很好,所以我猜這個錯誤在某個地方。但由於它不應該匹配[0..1]
中的任何內容,所以我很困惑。即使不匹配,ANTLR詞法分析器規則也會消耗字符嗎?
我很樂意爲任何可能出錯的指針。這是我的例子:
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 2012-04-13 07:45:35
@Lichtblitz,不客氣,是的,標記'..'(與INT-和FLOAT-令牌結合使用)很棘手! :) – 2012-04-13 08:54:33