2010-02-11 7 views
3

J'ai une AST sortie pour du code Lua par mon fichier de grammaire, qui fait actuellement l'analyse et le lexique pour moi. Je veux ajouter une grammaire d'arbre à ceci, mais puisque j'emploie C# je ne suis pas sûr comment le faire. Quel est le processus de base pour générer le code grammatical de l'arborescence lorsque vous avez déjà un analyseur et un lexer écrits?ANTLR - Ecrire une grammaire d'arbre pour un AST

MISE À JOUR: Je le fichier de grammaire suivante:

tree grammar LuaGrammar; 

options { 
    backtrack=true; 
    language=CSharp2; 
    //output=AST; 
    tokenVocab=Lua; 
    filter=true; 
    ASTLabelType=CommonTree; 
} 
@lexer::namespace{/*my namespace*/} 
@parser::namespace{/*my namespace*/} 

dummyRule 
    : ^('=' x=. y=.) {}; 

placé dans le même répertoire que mon fichier de grammaire principale, qui génère bien. Cependant, lorsque vous essayez de compiler ce que je reçois les erreurs suivantes:

[02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:12:18: unknown or invalid action scope for tree grammar: lexer 
[02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:13:19: unknown or invalid action scope for tree grammar: parser 

Suis-je sur la bonne voie ou totalement hors?

+0

quelle version de Antlr vous utilisez – chollida

+0

? Version 3.() ( – RCIX

Répondre

1

Je ne l'ai pas rencontré cette erreur, mais il y a 2 choses que je voudrais essayer.

1) supprimer les lignes et espaces de noms @lexer de @parser.

2) Si elles sont nécessaires puis les déplacer jusqu'à ce que les Tokens {...} section de votre grammaire, soit juste avant les règles.

+0

Ok, mais vous pouvez éditer dans vos nouvelles informations :) J'ai probablement besoin de trouver la déclaration équivalente pour la grammaire de l'arbre règles ... – RCIX

+0

1) réparé, je vais embrouiller loin d'ici :) – RCIX

2

bien revenir à mon exemple habituel d'une grammaire de la calculatrice :)

Voici comment vous déclarer votre arbre Walker classe

class CalcTreeShaker extends TreeParser; 

expr returns [float r] 
{ 
float a,b; 
r=0; 
} 
: #(PLUS a=expr b=expr) {r = a+b;} 
| #(STAR a=expr b=expr) {r = a*b;} 
| i:INT   {r = Convert.ToSingle(i.getText());} 
; 

Ici, nous avons une règle d'arbre appelé expr. Les marcheurs d'arbres sont très similaires aux grammaires de parser.

La grande différence est que, même si une grammaire de l'analyseur doit correspondre exactement à une arborescence, la grammaire ne doit correspondre qu'à une partie de l'arbre.

Dans la règle expr nous pouvons le voir correspond à tout arbre qui a les jetons PLUS ou STAR ou INT.

Nous pouvons voir que nous faisons correspondre les arbres parce que nous utilisons la syntaxe Tree d'Antlr #(...).

Les arborescences PLUS et STAR correspondent également à 2 règles expr. Chaque règle expr est assignée à un nom afin que nous puissions l'utiliser pour évaluer l'expression. Semblable aux grammaires de parser nous pouvons mettre le code de C# dans des blocs defiend par {...}.

Notez également que dans cet exemple, nous montrons comment retourner une valeur à partir d'une règle TreeWalker, nous utilisons la syntaxe return [...].

Pour appeler l'arborescence, vous devez le créer et appeler sa règle de premier niveau. Je "vais copier l'exemple de ce Antlr :)

// Get the ast from your parser. 
CommonAST t = (CommonAST)parser.getAST(); 

// Create the Tree Shaker 
CalcTreeWalker walker = new CalcTreeWalker(); 
CalcParser.initializeASTFactory(walker.getASTFactory()); 

// pass the ast to the walker and call the top level rule. 
float r = walker.expr(t); 
+0

C'est très utile mais à ce stade je suis tryi ng pour obtenir un fichier valide que je peux persuader ANTLR de compiler dans un code, peut-être que je manque quelque chose ... – RCIX

Questions connexes