2017-05-29 17 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 

それが評価される式の種類の唯一の例です(最大は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) 

なぜ名前のヌルがあるの?文法に間違っていますか?

答えて

0

式と評価コンテキストを受け入れる再帰関数が必要です。スコープセマンティクスとストア変数を反映し、評価結果を返します。関数は式の型に応じて異なるロジックを適用する必要があるため、Ifの場合はif.gtIfCondition()で再帰的に呼び出す必要があります。

は、それがのXbaseのためにどのように行われるかを参照してください:Javaので通訳やコンパイラの実装https://github.com/eclipse/xtext-extras/blob/master/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java#L187

はそれのためXTENDを使用し、面倒です。このようなタスクのために設計されており、dispatch methodspowerful switch expressionsのようなきれいな機能を備えています。

+0

しかし、どうすればXtendをJavaベースのインタプリタの中で使うことができますか? – Aikas

+0

最初に、xtendがJava –

+0

にコンパイルするので、簡単にjavaとxtendコードを組み合わせることができます.Xtendでインタープリタ全体を実行します –