2009-11-12 2 views
1

J'ai une grammaire ANTLR pour un DSL simple, et tout fonctionne à la légère lorsqu'il n'y a pas d'erreurs de syntaxe. Maintenant, cependant, je dois supporter un mécanisme d'auto-complétion, où je dois obtenir des compléments possibles de mes grammaires d'arbre qui effectuent une vérification de type basique sur les attributs, les fonctions, etcTolérance des instructions malformées avec ANTLR (par exemple, pour l'achèvement de code)

Le problème est, ANTLR n'est pas signaler les erreurs de syntaxe au niveau local statement, mais plus loin dans l'arbre d'analyse, par exemple, au niveau program ou function. Par conséquent, au lieu d'un AST qui ressemble à

   program 
       | 
      function 
      / | \ 
     / |  \ 
     stat hosed stat 

Je reçois des nœuds de déchets à travers le sommet de l'arbre, comme un échec pour correspondre à la règle statement « bulles » et empêche la règle function de correspondance.

Existe-t-il un moyen d'écrire une règle qui a une clause "attrape-tout" pour manger des jetons inattendus?

Je pense à quelque chose comme:

statement 
    : var_declaration 
    | if_statement 
    | for_loop 
    | garbage 
    ; 

garbage 
    : /* Match unexpected tokens, etc. (not actual statements, or closing 
     parens, braces, etc.). Maybe just consume one input token and let 
     the parser try again? */ 
    ; 

Il peut y avoir un certain nombre de noeuds de déchets dans l'AST, mais tout avant (et de préférence après) la poubelle doit être sain d'esprit.

J'apprécierais n'importe quels conseils/suggestions/pointeurs/etc. J'utilise ANTLR v3, cible Java.

Répondre

1

Jetez un oeil à http://www.antlr.org/wiki/display/ANTLR3/Error+reporting+and+recovery

BTW: Si vous ciblez éclipse, vous devriez regarder xtext (http://www.eclipse.org/Xtext/) - il est basé sur ANTLR 3 et génère un éditeur agréable avec la syntaxe hilighting et assistant de code.

+0

J'ai une clause catch, comme décrit dans le wiki, mais l'exception, de manière compréhensible, se déclenche sur la règle de fonction globale, et non sur l'instruction ourdée particulière. Ma grammaire a besoin (je suppose) de supporter des déclarations partielles, mais je n'ai pas réussi à les bidouiller ensemble ... Xtext est une alternative intéressante, cependant. Merci pour le lien. –

Questions connexes