2016-06-28 8 views
1

いくつかの具体的な構文値が与えられたら、別のタイプの値(この場合はint)にマップする方法を教えてください。具体的な構文値を他の種類の値に変換する方法はありますか?

// Syntax 
start syntax MyTree = \node: "(" MyTree left "," MyTree right ")" 
        | leaf: Leaf leaf 
        ; 

layout MyLayout = [\ \t\n\r]*; 

lexical Leaf = [0-9]+; 

これは、残念ながら動作しません:

public Tree increment() { 
    MyTree tree = (MyTree)`(3, (1, 10))`; 

    return visit(tree) { 
     case l:(Leaf)`3` => l + 1 
    }; 
} 

または私は種類を指定ADTにimplodeへの唯一の方法ですか?

答えて

2

あなたの質問は異なる可能な答えを持っている:implodeを使用して

  1. あなたは抽象ツリーに解析木を変換することができます。ターゲット抽象言語のコンストラクタでintが使用されていると、[0-9]+に一致するレキシカルツリーが自動的に変換されます。たとえば、syntax Exp = intValue: IntValue;の構文ツリーはコンストラクタdata Exp = intValue(int i);に変換され、実際にはiが作成されます。
  2. 一般的には、ラスカルであるタイプの値を別のタイプに変換する場合は、int eval (MyTree t)int (Leaf l)のように(相互に)再帰関数を記述します。
  3. リーフ値の構文表現を実際に増やしたい場合は、結果のintからLeafに戻す(解析するか、具体的なパターンを使用する)必要があります。

例:最初の字句はストリング"<l>"に変換さ

import String; 
MyTree increment() { 
    MyTree tree = (MyTree)`(3, (1, 10))`; 

    return visit(tree) { 
     case Leaf l => [Leaf] "<toInt("<l>") + 1>"; 
    }; 
} 

、これは、次いで、toInt()を用いintとして解析我々は+ 1を使用して1を追加し、バック文字列にintをマッピングさ"<...>"その後、[Leaf]を使用してLeafパーサーと呼ぶことができます。

関連する問題