Xtext计算表达式

时间:2017-05-29 20:30:18

标签: java expression interpreter 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
;

在我的翻译中找到&#34; If&#34;它有一个要评估的表达式(变量exp不具有评估表达式的方法):

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

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

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

它只是要评估的表达式的一个示例(max是返回double值的函数)。知道怎么做吗?我使用Xtext和eclipse在Java中进行解释。非常感谢 - &GT;另一个问题是当原子{Declarations}变量= [声明]当我进入我的expressionshandler(我的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的以下输出:

org.xtext.energy.impl.DeclarationsImpl@1f1f1a2f (name: null)

为什么名称为null?我的语法有问题吗?

1 个答案:

答案 0 :(得分: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等简洁功能。