2012-12-16 80 views
1

我有一個簡單的antlr規則來捕捉像「running.exception = 2.j = 15」這樣的短語,並且我想確定在此情況下初始化值爲2。ANTLR將INT與FLOAT混合在一起

但是,ANTLR將2.看作是一個浮點數。無論如何可以將它識別爲int嗎?

我的規則:

exception 
    : 
    (
    ID* 
    '.exception=' 
    INT 
    '.' 
    ID* 
    ); 
+0

試圖添加(( '0'。 '''''''CHAR){$ type = INT;}來浮動,但它認爲2.j是INT! –

+0

但有時2.5是一個浮點數,但2.j是2作爲INT和j作爲ID。我之前添加到FLOAT的規則,它將2.j作爲INT。有什麼建議麼? –

+0

啊,我明白你的意思了。看看我的答案是否能解決它。 –

回答

3

嘗試是這樣的:

grammar T; 

parse 
: (t=. {System.out.printf("\%-10s '\%s'\n", tokenNames[$t.type], $t.text);})* EOF 
; 

FLOAT 
: DIGIT+ (('.' DIGIT)=> '.' DIGIT+ 
      | {$type=INT;} 
     ) 
| '.' DIGIT+ 
; 

DOT 
: '.' 
; 

SPACE 
: ' ' {skip();} 
; 

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

這將解析輸入"0.12 .34 56. 78"這樣的:

FLOAT  '0.12' 
FLOAT  '.34' 
INT  '56' 
DOT  '.' 
INT  '78'
+0

完美工作:)謝謝 –

+0

很酷,歡迎您@Syntax_Error。 –