2017-05-29 2 views
0

J'ai la grammaire suivante pour mes expressions, je voudrais évaluer mes expressions avec mon interprète mais je ne comprends pas comment le faire.Xtext évaluer les expressions

Declarations: 
    Text | Real | CurveCollection | Interval | Boolean; 

Text: 
    ("String" | "Text") name=ID (value=STRING)?; 

Real: 
    ("Double" | "Real") name=ID (array=isarray)? (value+=Double*)? ; 

Atomic returns Expression: 
    {IntConstant} value=Double | 
    {StringConstant} value=STRING | 
    {BoolConstant} value=('true'|'false') | 
    {Declarations} variable=[Declarations] 
; 
Expression : Or; 

Or returns Expression: 
    And({Or.left=current}"||" right=And)* 
; 
And returns Expression: 
    Equality({And.left=current}"&&"right=Equality)* 
; 
Equality returns Expression: 
    Comparison(
     {Equality.left=current} op=("=="|"!=") 
     right=Comparison 
    )* 
; 
Comparison returns Expression: 
    PlusOrMinus(
     {Comparison.left=current} op=(">="|"<="|">"|"<") 
     right=PlusOrMinus 
    )* 
; 

PlusOrMinus returns Expression: 
    MulOrDiv(
     ({Plus.left=current} '+' | {Minus.left=current} '-') 
     right=MulOrDiv 
    )* 
; 
MulOrDiv returns Expression: 
    Primary(
     ({MulOrDiv.left=current} op=('*'|'/')) 
     right=Primary 
    )* 
; 
Primary returns Expression: 
    '(' Expression ')' | 
    {function} expression=functions | 
    {Not} "!" expression=Primary | 
    Atomic 
; 

Dans mon interprète quand je trouve un « Si », qui a une expression à évaluer (l'exp variable ne doit pas a des méthodes pour évaluer l'expression):

if(element instanceof If){ 
    Expression exp = ((If)element).getIfcondition(); 

mais dans ce point Je ne sais pas comment évaluer les expressions récursives par exemple les éléments suivants:

if (5 < 10)&&(2==max w[2])||(n>2) then 

c'est seulement un exemple du genre d'expressions à évaluer (max est une fonction qui renvoie une double valeur). Une idée de comment le faire? Je fais l'interprète en Java avec Xtext et eclipse. Merci beaucoup -> bien un autre problème est quand la variable {Declarations} atomique = [Déclarations] quand je reçois dans mon expressionhandler (ma classe xtend) y obtient une valeur nulle et je ne sais pas pourquoi.

def dispatch Object interpret(Expression e,Scope scope) { 
     switch (e) { 
          IntConstant: 
       e.value 
      BoolConstant: 
       Boolean.parseBoolean(e.value) 
      StringConstant: 
       e.value 
      Declarations:{ 
       //scope.getRealValueOf(e.name) 
       e.toString() 

      } 

i besoin le nom de la variable mais je peux voir la sortie suivante de la toString:

[email protected] (name: null) 

pourquoi le null nom? quelque chose ne va pas dans ma grammaire?

Répondre

0

Vous devriez avoir une fonction récursive qui accepte une expression et un contexte d'évaluation, par ex. pour refléter les variables sémantiques et stockées, et renvoie un résultat d'évaluation. La fonction doit appliquer une logique différente en fonction du type d'une expression, donc pour If, elle doit invoquer elle-même récursivement sur if.gtIfCondition().

Voyez comment cela se fait pour Xbase: https://github.com/eclipse/xtext-extras/blob/master/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java#L187

La mise en œuvre des interprètes et compilateurs Java est fastidieux, utilisez Xtend pour elle. Il est conçu pour de telles tâches et a des caractéristiques soignées comme dispatch methods et powerful switch expressions.

+0

mais ... comment puis-je utiliser Xtend dans mon interpréteur Java? – Aikas

+0

d'abord, vous pouvez facilement combiner le code java et xtend, puisque xtend compile à java –

+0

deuxième, je ferais tout l'interprète dans Xtend –