给定一些具体的语法值,我如何将其映射到不同类型的值(在本例中为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的唯一方法是什么?
答案 0 :(得分:2)
您的问题有不同的答案:
implode
可以将解析树转换为抽象树。如果目标抽象语言的构造函数期望int
,那么恰好匹配[0-9]+
的词汇树将被自动转换。例如,syntax Exp = intValue: IntValue;
的语法树可以转换为构造函数data Exp = intValue(int i);
,它实际上会构建一个i
。int eval (MyTree t)
和int (Leaf l)
。int
转换回(解析或通过具体模式)返回Leaf
。示例:
import String;
MyTree increment() {
MyTree tree = (MyTree)`(3, (1, 10))`;
return visit(tree) {
case Leaf l => [Leaf] "<toInt("<l>") + 1>";
};
}
首先将词法转换为字符串"<l>"
,然后使用int
将其解析为toInt()
,然后使用+ 1
添加1,然后映射{{ 1}}返回字符串int
,之后我们可以使用"< ... >"
调用Leaf
解析器。