1

给定一些具体的语法值,我如何将它映射到不同类型的值(在本例中为 an 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您可以将解析树转换为抽象树。如果目标抽象语言的构造函数是 expect int,那么恰好匹配的词汇树[0-9]+将被自动转换。例如,syntax Exp = intValue: IntValue;可以将语法树转换为构造函数data Exp = intValue(int i);,它实际上会构建一个i.
  2. 通常,在 Rascal 中将一种类型的值转换为另一种类型的值,您需要编写(相互)递归函数,如int eval (MyTree t)int (Leaf l).
  3. 如果要实际增加 Leaf 值的语法表示,则必须将结果转换回(解析或通过具体模式)int返回到Leaf.

例子:

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

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

首先将词法转换为字符串"<l>",然后将其解析为intusing ,然后toInt()将 using 加 1 + 1,然后将其映射int回字符串"< ... >",之后我们可以调用Leaf解析器 using [Leaf]

于 2016-06-28T18:22:59.330 回答