2016-05-24 102 views
1

好的,所以我想在訪問它時訪問節點的註釋。舉個例子:Rascal AST訪問訪問註釋

visit (myAST) { 
    case someNode(str name): { 
    // How do I now access the @src annotation of someNode here? 
    } 
}; 

我已經嘗試了以下但這不起作用:

visit (myAST) { 
    case someNode(str name): { 
    parents = getTraversalContext(); 

    iprintln(parents[0]); // This print shows someNode with the @src annotation. 
    iprintln(parents[0]@src); // This gives the error: get-annotation not supported on value at... 
    } 
}; 

什麼我錯在這裏做什麼?我的方法錯了嗎?

+1

如果您將'parents [0]'與聲明註釋的類型或針對'node'匹配,則第二種解決方案將起作用。這是因爲'getAnnotation'函數只爲'node'定義,而不是'value'。然而,保羅的解決方案是優先於使用'getTraversalContext' – jurgenv

回答

2

好問題,要做到這一點的最好辦法是引入一個變量,比如在模式sn,並用它來獲取註釋

visit (myAST) { 
    case sn:someNode(str name): { 
    // Access the @src annotation of someNode here by [email protected] 
    } 
}; 

作爲一個方面說明:您使用的功能getTraversalContext但我強烈建議您避免使用它,因爲它是實驗性的,未來很可能會發生變化。承認:我們應該標記爲這樣。

+0

完美!奇蹟般有效。 – Nicasso