Xtext 评估表达式
Xtext evaluate 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
;
在我的解释器中,当我找到一个 "If" 时,它有一个要计算的表达式(变量 exp 没有计算表达式的方法):
if(element instanceof If){
Expression exp = ((If)element).getIfcondition();
但在这一点上我不知道如何计算递归表达式,例如以下内容:
if (5 < 10)&&(2==max w[2])||(n>2) then
这只是要计算的表达式类型的一个示例(max 是一个函数,return 是一个双精度值)。知道怎么做吗?我在 Java 中用 Xtext 和 eclipse 做解释器。非常感谢
-> 另一个问题是当原子 {Declarations} 变量 = [Declarations] 当我进入我的 expressionshandler (我的 xtend class )你得到一个空值,我不知道为什么。
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)
为什么名称为空?我的语法有问题吗?
你应该有一个接受表达式和求值上下文的递归函数,例如反映作用域语义和存储变量,returns 评估结果。该函数应根据表达式的类型应用不同的逻辑,因此对于 If
它应该在 if.gtIfCondition()
.
上递归调用自身
用Java实现解释器和编译器很乏味,用Xtend吧。它专为此类任务而设计,并具有 dispatch methods and powerful switch 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
;
在我的解释器中,当我找到一个 "If" 时,它有一个要计算的表达式(变量 exp 没有计算表达式的方法):
if(element instanceof If){
Expression exp = ((If)element).getIfcondition();
但在这一点上我不知道如何计算递归表达式,例如以下内容:
if (5 < 10)&&(2==max w[2])||(n>2) then
这只是要计算的表达式类型的一个示例(max 是一个函数,return 是一个双精度值)。知道怎么做吗?我在 Java 中用 Xtext 和 eclipse 做解释器。非常感谢 -> 另一个问题是当原子 {Declarations} 变量 = [Declarations] 当我进入我的 expressionshandler (我的 xtend class )你得到一个空值,我不知道为什么。
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)
为什么名称为空?我的语法有问题吗?
你应该有一个接受表达式和求值上下文的递归函数,例如反映作用域语义和存储变量,returns 评估结果。该函数应根据表达式的类型应用不同的逻辑,因此对于 If
它应该在 if.gtIfCondition()
.
用Java实现解释器和编译器很乏味,用Xtend吧。它专为此类任务而设计,并具有 dispatch methods and powerful switch expressions.
等简洁的功能