2010-10-15 74 views
5

我想创建'..'在ANTLR3词法分析器一个令牌,该令牌将被用来串这样的表达式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.",,但不知道是否有解决方法。

P.S. INT的定义如下...

fragment DIGIT 
    : '0'..'9' 
    ; 

INT : DIGIT+ 
    ; 

编辑。 稍微进一步的测试让我觉得它不像它直接匹配FLOAT规则那么简单。 (我想改变这个问题,但是因为我现在已经有了答案,所以我不会这样做)。问题(我相信)仍然存在于词法分析规则优先级中,所以问题仍然是一样的。

回答

7

你看过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; } 
    ; 
+0

这让我非常接近,只是一点点更多的调整需要。我没有找到的链接,但看起来很棒;只是我应该阅读的东西,所以我现在就要去做。谢谢。 – tjm 2010-10-15 13:59:24

+0

我现在很好,只是几个笔记给其他任何人可能会来此。在ANTLRWorks v1.4中,解释器无法处理谓词,所以在没有(这会减慢我的速度)的时候看起来有错误,而且我必须将'$ settype(TYPE);'更改为' $ type = TYPE;' – tjm 2010-10-15 16:06:50

+0

@tjm,我稍微编辑了ANTLR示例。它现在是v3兼容吗? – 2010-10-15 18:01:29