2012-12-16 4 views
1

J'ai une règle antlr simple pour attraper une phrase comme "running.exception = 2.j = 15" et je veux identifier la valeur est initialisée à 2 dans ce cas.ANTLR mélange INT avec FLOAT

Toutefois, ANTLR considère 2. comme un flottant. Y at-il de toute façon pour l'identifier comme un int?

Ma règle:

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

essayé d'ajouter (('0'. .'9 ')'. 'CHAR) {$ type = INT;} pour flotter mais il considérait 2.j comme INT! –

+0

mais parfois 2.5 est un flottant mais 2.j est 2 comme INT et j comme ID. La règle précédente, j'ai ajouté à FLOAT et il a attrapé 2.j comme INT. Aucune suggestion? –

+0

Ah, je vois ce que tu veux dire. Voyez si ma réponse résout le problème. –

Répondre

3

Essayez quelque chose comme ceci:

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 : ; 

qui analyser l'entrée "0.12 .34 56. 78" comme ceci:

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

a fonctionné parfaitement :) Merci –

+0

Cool, vous êtes les bienvenus @Syntax_Error. –