2013-02-21 59 views
8

我有一個在Irony控制檯中工作和解析的語法就好了,但是我沒有在AST樹視圖中看到任何東西。我跟着BASIC-> Javascript這篇文章發現在這裏:http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler,但似乎Ast的東西全部被移動/刪除。我發現了Irony.Interpreter.dll,裏面有一些Ast的東西,但似乎所有的東西都捆綁在Expression示例實現中。現在我如何在反諷中使用AST?

我在這裏錯過了什麼?我想走我的樹並生成源代碼,我不知道從哪裏開始。

我見過使用訪客模式的一些提及,我很好,但我不知道如何實現它,並以Irony喜歡的方式運行它。

+2

我剛剛切換到ANTLR,所以我想這是現​​在所有的模擬。這麼少的幫助,它傷害了。哦,謝謝你花時間看看! – 2013-09-25 18:11:51

回答

5

查看適當命名的Sarcasm項目,瞭解構建於Irony上的語法,解析器和AST的參考實現。筆者發現這個blog entry有助於構建AST。

以下是啓動並運行AST的通用指南。

  1. 定義你的語法(example
  2. 創建一個抽象基類(MyBaseNode)從AstNodeexample)獲得。從示例
  3. 複製/粘貼的方法的每一個終端和非終端創建從MyBaseNode

    1. 覆蓋Accept方法(example)衍生的新類:

    public override void Accept(IMyNodeVisitor visitor) { visitor.Visit(this); }

    1. 替代Init(主要在終端上)或InitChildren(非終端如適用)。 這是AST魔法發生的地方。
  4. 添加的接口IMyNodeVisitor並添加Visit方法用於在前面的步驟中定義的每個類(example):

    void Visit(MyDerivedNode1 node);

  5. 設置ASTNodeType爲每個終端和非終端在你的文法從第1步。

    1. 對於端子 - (example

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. 對於非終端 - (example

      var MyNonTerminal2 = new NonTerminal("MyNonTerminal2", typeof(MyDerivedNode2));

  6. 在語法使AST創建:(example

    LanguageFlags = LanguageFlags.CreateAst;

+0

神聖煙。 Sarcasm不僅僅是一個參考實現,它是'Sarcasm,一種類EBNF的DSL,可以產生Irony'!這就像ouroboros混合起來一樣。 – fostandy 2016-12-28 07:04:46

+0

與Sarcasm項目的鏈接已經死亡。 (或者是某種有意的「誰是第一個」的笑話,我沒有得到?) – alx9r 2017-01-23 02:36:35

3

在反語分析分兩階段完成。首先它創建一個分析樹,然後創建你的AST樹。

您只看到第一步。爲了反諷創建AST,您可以:

  1. 告訴它如何給你的終結符號映射到AST節點:

    例如看反諷樣本語法ExpressionEvaluatorGrammar我們看到:

    var BinExpr = new NonTerminal("BinExpr", typeof(BinaryOperationNode));`  
    

    在這裏,我們告訴反諷的BinExpr非終結符號映射到BinaryOperationNode這是我們的AST節點。

  2. 作出解析時,它產生的AST:

    設置此標誌時,解析AST樹將會產生。

    this.LanguageFlags = LanguageFlags.CreateAst; 
    

您的AST樹的根將爲:

parseTree.Root.AstNode 

我發現this源一個很好的起點。