我想从ANTLR3词法分析器中的'..'
创建一个令牌,该令牌将用于将诸如
a..b // [1]
c .. x // [2]
1..2 // [3]
3 .. 4 // [4]
所以,我补充说,
DOTDOTSEP : '..'
;
问题是我已经有了一条规则:
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f'))
;
在上面的示例[3]中,
1..2
被匹配为FLOAT
(我不确定为什么,因为跟随第一个.
是另一个.
而不是INT,而是这样)。我想知道是否有一种方法可以更改词法分析器规则的优先级,以使
DOTDOTSEP
首先匹配,然后再匹配FLOAT
。看起来here我似乎输给了
"The rule having the greatest count is the winner.",
,但想知道是否有办法解决它。附言INT定义如下...
fragment DIGIT
: '0'..'9'
;
INT : DIGIT+
;
编辑。
进一步的测试使我认为这并不像直接匹配
FLOAT
规则那么简单。 (我打算更改问题,但由于现在已经有了答案,所以我不会。)(我认为)问题仍然在于词法分析器规则的优先级,因此问题仍然相同。 最佳答案
您看过http://sds.sourceforge.net/src/antlr/doc/lexer.html吗?
一种可能的解决方案是定义以下内容:
fragment
INT : DIGIT+
;
fragment
RANGE : INT DOTDOTSEP INT
;
fragment
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f'))
;
NUMBER
: (INT '.') => FLOAT { $type=FLOAT; }
| (INT DOTDOTSEP) => RANGE { $type=RANGE; }
| INT { $type=INT; }
;