2012-02-13 6 views
1

J'ai une grammaire simple pour analyser les fichiers contenant des identifiants et mots-clés entre parenthèses (je l'espère):grammaire simple ne fonctionne pas

grammar Keyword; 

// PARSER RULES 
// 
entry_point : ('['ID']')*; 

// LEXER RULES 
// 
KEYWORD  : '[Keyword]'; 

ID  : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*; 
WS  : (' ' | '\t' | '\r' | '\n' | '\r\n') 
      { 
       $channel = HIDDEN; 
      }; 

Il fonctionne pour l'entrée:

[Hi] 
[Hi] 

Il renvoie une erreur de NoViableAltException pour entrée:

[Hi] 
[Ki] 

Si je commente KEYWORD, alors cela fonctionne très bien. Aussi, si je change ma grammaire à:

grammar Keyword; 

// PARSER RULES 
// 
entry_point : ID*; 

// LEXER RULES 
// 
KEYWORD  : '[Keyword]'; 

ID  : '[' ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ']'; 
WS  : (' ' | '\t' | '\r' | '\n' | '\r\n') 
      { 
       $channel = HIDDEN; 
      }; 

Ensuite, cela fonctionne. Pourriez-vous m'aider s'il vous plaît à comprendre pourquoi?

Cordialement.

Répondre

1

Le 1 er grammaire échoue parce que chaque fois que le lexer voit"[K", le lexer entrera la règle KEYWORD. S'il rencontre alors quelque chose d'autre que "eyword]", "i" dans votre cas, il essaie de revenir à une autre règle que peut correspondre "[K". Mais il n'y a pas d'autre règle lexer qui commence par "[K" et va donc lancer une exception. Notez que le lexer ne supprime pas "K" et essaie ensuite de faire correspondre à nouveau (le lexer est un muet machine)!

Votre 2 ème travaux de grammaire, parce que le lexer maintenant peut trouver quelque chose à se replier quand "[Ki" ne sont pas abondés par l'KEYWORD depuis ID comprend maintenant le "[".

+0

Merci! Y a-t-il une raison théorique ou architecturale pour laquelle le lexer ne «revient» pas avant de trouver une correspondance? – Korchkidu

+0

@Korchkidu, pas que je sache. Je crois que la prochaine version d'ANTLR (v4), la lexer deviendra "plus intelligente" et est capable de revenir en arrière de # 1 (pas sûr à 100% si ...) –

+0

merci beaucoup pour votre aide! – Korchkidu