2010-02-14 6 views
2

Je suis en train d'écrire une règle de correspondance de commentaire dans ANTLR, qui est actuellement le suivant:problème de commentaire ANTLR

LINE_COMMENT 
    : '--' (options{greedy=false;}: .)* NEWLINE {Skip();} 
    ; 

NEWLINE : '\r'|'\n'|'\r\n' {Skip();}; 

Ce code fonctionne bien, sauf dans le cas où un commentaire est les derniers caractères d'un fichier, Dans ce cas, il déclenche une exception NoViableAlt. Comment puis-je réparer cela?

Répondre

2

Pourquoi ne pas:

LINE_COMMENT  : '--' (~ NEWLINE)* ; 
fragment NEWLINE : '\r' '\n'? | '\n' ; 

Si vous n'êtes pas encore rencontré ce, règles lexicales (toutes les majuscules) ne peut consister en des constantes et des jetons, pas d'autres lexèmes. Vous avez besoin d'une règle d'analyseur pour cela.

+0

Ne vous dire 'fragment NEWLINE' au lieu de' NEWLINE' jeton? Et puisque 'NEWLINE' existe potentiellement de plus d'un caractère, la négation fonctionne-t-elle toujours dans la règle' LINE_COMMENT'? –

+0

à l'exception de la modification de 'fragment' et une modification du fragment NEWLINE, cela fonctionne. Merci! Je ne peux pas croire que je n'y ai pas pensé ... – RCIX

+0

@RCIX: correction de la partie 'fragment'. Désolé, un peu rouillé. Content que ça a marché. – cletus

0

Je vais pour:

LINE_COMMENT 
    : '--' ~('\r' | '\n')* {Skip();} 
    ; 

NEWLINE 
    : ('\r'? '\n' | '\r') {Skip();} 
    ;