2016-06-28 36 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 
    }; 
} 

或者是implode的唯一途径进入,我指定类型的ADT?

回答

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. 如果您想实际增加Leaf值的语法表示形式,则必须将结果int转回(解析或通过具体模式)返回到Leaf

实施例:

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

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

首先词法被转换成一个字符串"<l>",这然后使用toInt()解析为int,我们1使用+ 1然后映射int回字符串"<...>"添加之后,我们可以使用[Leaf]调用Leaf解析器。

相关问题