【问题标题】:Xtext evaluate expressionsXtext 计算表达式
【发布时间】:2017-06-02 06:40:35
【问题描述】:

我的表达式有以下语法,我想用我的解释器评估我的表达式,但我不知道该怎么做。

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
;

在我的解释器中,当我找到一个“If”,它有一个要评估的表达式(变量 exp 没有评估表达式的方法):

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

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

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

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

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)

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

【问题讨论】:

    标签: java expression interpreter xtext


    【解决方案1】:

    您应该有一个接受表达式和评估上下文的递归函数,例如反映范围语义和存储变量,并返回评估结果。该函数应根据表达式的类型应用不同的逻辑,因此对于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 等简洁的功能。

    【讨论】:

    • 但是...我如何在基于 Java 的解释器中使用 Xtend??
    • 首先,你可以很容易地结合java和xtend代码,因为xtend编译成java
    • 第二,我会在 Xtend 中做整个解释器
    • @Aikas 这个答案对你有帮助吗?
    • Kosykov 我现在在我的 Java 解释器中创建了一个 Xtend 类(用于表达式),我认为两者结合起来效果很好,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2011-09-05
    • 2017-06-19
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多