我现在如何使用反讽中的AST?

Chr*_*per 8 c# compiler-construction abstract-syntax-tree irony

我有一个语法可以在Irony控制台中正常工作和解析,但我在AST树视图中没有得到任何东西.我跟随在这里找到的BASIC-> Javascript文章:http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler,但似乎Ast的东西都是移动/删除.我找到了Irony.Interpreter .dll,里面有一些Ast内容,但它似乎都在Expression示例实现中.

我在这里错过了什么?我想走我的树并生成源代码,我不知道从哪里开始.

我已经看到一些提到使用访问者模式,我很好,但我不知道如何实现它并以Irony喜欢的方式运行它.

Jay*_*ker 6

查看适当命名的Sarcasm项目,以获得基于Irony构建的语法,解析器和AST的参考实现.我发现作者的这篇博客文章有助于构建AST.

以下是启动和运行AST的通用指南.

  1. 定义你的语法(例子)
  2. 创建一个MyBaseNode派生自AstNode(example)的抽象基类().复制/粘贴示例中的方法
  3. 为每个终端和非终端创建一个派生自MyBaseNode和的新类

    1. 覆盖 Accept方法(示例):

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

    1. 覆盖 Init(主要在终端上)或InitChildren(非终端).这就是AST魔法发生的地方.
  4. 添加界面 IMyNodeVisitorVisit为上一步(示例)中定义的每个类添加方法:

    void Visit(MyDerivedNode1 node);

  5. 设置ASTNodeType步骤1为每个终端和非终端的在你的语法.

    1. 对于终端 - (示例)

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. 对于非终端 - (示例)

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

  6. 在语法中启用AST创建:( 示例)

    LanguageFlags = LanguageFlags.CreateAst;