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  
    };
}

またはimplode、タイプを指定したADTに入る唯一の方法はありますか?

4

1 に答える 1

2

あなたの質問にはさまざまな答えがあります:

  1. を使用implodeすると、解析ツリーを抽象ツリーに変換できます。ターゲット抽象言語のコンストラクターが を期待する場合、intたまたま一致する字句ツリー[0-9]+は自動的に変換されます。たとえば、 の構文ツリーはsyntax Exp = intValue: IntValue;コンストラクターに変換できdata Exp = intValue(int i);、実際にはi.
  2. 一般に、Rascal であるタイプの値を別のタイプに変換するには、 および のように (相互に) 再帰関数を記述しint eval (MyTree t)ますint (Leaf l)
  3. リーフ値の構文表現を実際にインクリメントしたい場合は、結果intからLeaf.

例:

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

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

最初に字句が string に変換され"<l>"、これが using として解析され、 1 intusingtoInt()を追加してから stringに+ 1マップします。その後、パーサー using を呼び出すことができます。int"< ... >"Leaf[Leaf]

于 2016-06-28T18:22:59.330 に答える