私の式には以下の文法がありますが、私はインタープリタで式を評価したいと思いますが、どうやってそれをするのか分かりません。私の通訳で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
それが評価される式の種類の唯一の例です(最大はdouble値を返すどのような機能であります)。どのようにそれを行うかの任意のアイデア?私はXtextとEclipseでJavaでインタプリタをやっています。ありがとうございました - >別の問題は、atomic {Declarations} variable = [Declarations]が式ハンドラ(my xtendクラス)に入ったときにnull値を取得し、その理由を知らないときです。
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は変数の名前を必要とするが、私はのtoStringの次の出力を参照することができます
[email protected] (name: null)
なぜ名前のヌルがあるの?文法に間違っていますか?
しかし、どうすればXtendをJavaベースのインタプリタの中で使うことができますか? – Aikas
最初に、xtendがJava –
にコンパイルするので、簡単にjavaとxtendコードを組み合わせることができます.Xtendでインタープリタ全体を実行します –