2017-05-29 115 views
0

我对我的表达式有以下语法,我想用我的解释器评估我的表达式,但我不知道如何去做。Xtext评估表达式

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 
; 

在我的翻译,当我找到一个“如果”已经被评估一个表达式(变量EXP不会有方法来计算表达式):

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

但在这一点上我不知道如何评估以下例如递归表达式:

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

这只是那种表达的一个例子进行评估(max是什么函数返回一个双精度值)。任何想法如何做到这一点?我正在用Xtext和eclipse在Java中进行解释器。非常感谢 - >另一个问题是当原子{Declarations}变量= [声明]当我进入我的表达式处理程序(我的xtend类)时,得到一个空值,我不知道为什么。

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() 

      } 

我需要的变量的名字,但我能看到的toString的输出如下:

[email protected] (name: null) 

为什么是空的名字?我的语法错了吗?

回答

0

您应该有一个递归函数接受一个表达式和一个评估上下文,例如,以反映范围的语义和存储变量,并返回评估结果。该函数应根据表达式的类型应用不同的逻辑,因此对于If,它应该在if.gtIfCondition()上递归调用自身。

看看它是如何进行的Xbase做到:https://github.com/eclipse/xtext-extras/blob/master/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java#L187

实现翻译和编译器与Java是乏味的,使用的Xtend它。它被设计用于这样的任务,并具有整齐的功能,如dispatch methodspowerful switch expressions

+0

但是......我如何在我的基于Java的解释器中使用Xtend? – Aikas

+0

首先,你可以很容易地结合java和xtend代码,因为xtend编译为java –

+0

秒,我会在Xtend中做整个解释器 –