2011-02-14 71 views
7

我在Irony中定義了一個簡單的語法,並生成了一個很好的緊湊AST。反諷:評估AST節點的教程?

現在,我試圖找出如何評價它。問題是,我找不到關於如何做到這一點的任何教程。

我定義了僅有2 AST節點:

class TagListNode : AstNode 
{ 
    public override void Init(ParsingContext context, ParseTreeNode treeNode) 
    { 
     base.Init(context, treeNode); 
     AsString = "TagList"; 
     foreach (var node in treeNode.ChildNodes) 
      AddChild(null, node); 
    } 

    public override void EvaluateNode(Irony.Interpreter.EvaluationContext context, AstMode mode) 
    { 
     foreach (var node in ChildNodes) 
      node.EvaluateNode(context, AstMode.Read); 
    } 
} 

class TagBlockNode : AstNode 
{ 
    public AstNode Content; 

    public override void Init(ParsingContext context,ParseTreeNode treeNode) 
    { 
     base.Init(context, treeNode); 
     AsString = treeNode.ChildNodes[0].FindTokenAndGetText(); 
     Content = AddChild(null, treeNode.ChildNodes[1]); 
    } 

    public override void EvaluateNode(EvaluationContext context, AstMode mode) 
    { 
     context.Write(string.Format("<{0}>", AsString)); 
     Content.EvaluateNode(context, AstMode.Read); 
     context.Write(string.Format("</{0}>", AsString)); 
    } 
} 

,這將產生以下輸出:

<html><head><title></title></head><body><h1></h1><p></p><p></p></body></html>3.14159265358979 

而我想要的輸出是:

<html> 
    <head> 
     <title>page title</title> 
    </head> 
    <body> 
     <h1>header</h1> 
     <p>paragraph 1</p> 
     <p>3.14159265358979</p> 
    </body> 
</html> 

我不不認爲我應該使用Context.Write()。示例顯示將內容推送到context.Data並將其彈出...但我不太確定這是如何工作的。

我在猜測pi最終會加固,因爲它會自動推送到context.Data,然後一個元素在最後彈出?我不太確定。

有些指針或指向教程的鏈接會很好。

另外,我該如何處理不同的節點類型?每個「標籤」可以有4種不同類型的內容:另一個標籤,一個字符串文字,一個變量或一個數字。我是否應該在EvaluateNode方法中寫入諸如if(node is StringLiteral) ....的東西或什麼?


我發現this one,但他們只是在AST循環,不採取EvaluateNode優勢。

然後this one其中取代在數據堆棧中的單個值...但並沒有真正解釋如何輸出或任何東西。


要清楚,我特別想知道如何重寫EvaluateNode方法Irony.Ast.AstNode做我想做的。


好啦,我已經跟蹤該珍聞在結束這一行:這是包含在默認的評估程序

if (EvaluationContext.HasLastResult) 
     EvaluationContext.Write(EvaluationContext.LastResult + Environment.NewLine); 

....也許它運作良好的計算器應用程序,但不是我的。試圖找出如何繞過腳本解釋器,但是我不知道如何設置全局變量。

回答

0

遍歷AST結構的最好方法是實現訪問者pattern

也許這個link可以幫到你。

+1

對不起,這些鏈接都不是非常有用...可以肯定的是,Irony已經採用了訪客模式,而mgrammar!=諷刺。 – mpen 2011-02-14 08:42:38