2011-10-26 3 views
3

J'ai la grammaire ANTLR suivante:Ignorer les espaces blancs ANTLRworks

grammar mygrammar; 

ASSIGNMENT 
    : ID '=' INT 
    ; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 

INT : '0'..'9'+ 
    ; 

WS : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     ) {$channel=HIDDEN;} 
    ; 

Seule la règle de CESSION est en fait le mien, le reste sont par défaut ajoutés par ANTLRWorks 1.4.3. Quand j'arrive à essayer la grammaire dans l'interpréteur, les chaînes comme "a = 5" réussissent, mais les chaînes comme "b [espace] = [espace] 6" échouent: j'obtiens une exception MismatchedTokenException à cause des espaces :

Picture of the interface with a MismatchedTokenException

à la lecture du site ANTLR, et la règle

Ignore rules: WS
et
{$channel=HIDDEN}
texte/grammaire, il semble les espaces blancs doit être ignorée, mais ce n'est pas le cas.

Qu'est-ce que je fais mal?

+0

La spécification de "affectation" au lieu de "ASSIGNMENT" l'a corrigé. – checkers

Répondre

6

Je sais que vous avez déjà trouvé la réponse, mais laissez-moi vous expliquer pourquoi en changeant ASSIGNMENT à assignment l'a résolu. Parce que les règles qui commencent par une capitale sont des règles lexer (c'est-à-dire des jetons). Et {skip();} ou {$channel=HIDDEN;} provoquer des règles lexer à ignorer (ou masqué) des règles de l'analyseur, pas de règles lexer. C'est pourquoi ASSIGNMENT (règle lexer) n'acceptait aucun espace blanc et assignment (règle de l'analyseur) les ignore.