2010-04-11 17 views
2

Pour des expressions comme 3 + 4, j'utiliserais la valeur 7 dans un arbre de représentation intermédiaire.Expressions ANTLR réécrire l'arborescence intermédiaire

Je n'arrive pas à déterminer comment obtenir la valeur de retour dans une règle de réécriture.

expression retourne [int v]: etc.

Comment puis-je obtenir expression.v dans WR? En ce moment, je reçois (+ 3 4), je veux (7)

|^(ECRITURE c = expression) ->^(WRINT^(INTC^($ c))

l'étape suivante est pour émettre 7 dans un assembleur.

Répondre

1

Je pense que vous voulez savoir comment utiliser la syntaxe de réécriture pour construire un jeton numérique unique avec la valeur de c $, plutôt qu'un autre arbre? Si tel est le cas, vous pouvez faire avec

^(WRITE c=expression) -> INT[$c.v] ; 

en supposant que INT est le type de jeton pour les entiers.

Cela suppose que votre règle d'expression évalue réellement et renvoie un résultat entier. Si ce n'est pas le cas et que vous voulez savoir comment faire un pliage constant, c'est un sujet beaucoup plus vaste. Jetez un oeil à la polynomial example dans la collection d'exemples ANTLR; il montre comment faire une certaine simplification de base. Vous pourriez probablement le faire avec un réécrivain d'arbre en utilisant des règles comme

^('+' a=INT b=INT) -> INT[String.valueOf($a.int+$b.int)] ;