2016-06-28 52 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解析器。

相關問題