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.
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. –