8

I have a grammar that works and parses in the Irony console just fine, but I don't get anything in the AST treeview. I was following along with the BASIC->Javascript article found here: http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler, but it seems that the Ast stuff has all been moved/removed. I found the Irony.Interpreter .dll, which has some Ast stuff in it, but it seems all tied up in the Expression sample implementation.

What am I missing here? I want to walk my tree and generate source code, and I'm not sure where to start.

I've seen some mention of using the visitor pattern, which I'm fine with, but I don't know how to implement it and run it in a way that Irony likes.

4

2 回答 2

7

查看恰当命名的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. 为上一步中定义的每个类添加一个接口IMyNodeVisitor并添加一个Visit方法(示例):

    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;

于 2015-09-22T05:47:26.393 回答
4

在 Irony 中,解析分两个阶段完成。首先它创建一个解析树,然后它创建你的 AST 树。

你只看到了第一步。为了使 Irony 创建 AST,您可以:

  1. 告诉它如何将您的 NonTerminals 映射到 AST 节点:

    例如,查看 Irony 示例语法 ExpressionEvaluatorGrammar 我们看到:

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

    在这里,我们告诉 Irony 将 BinExpr NonTerminal 映射到 BinaryOperationNode,这是我们的 AST 节点。

  2. 使其在解析时生成 AST:

    当您设置此标志时,将在您解析时生成 AST 树。

    this.LanguageFlags = LanguageFlags.CreateAst;
    

您的 AST 树的根将是:

parseTree.Root.AstNode

我发现这个来源是一个很好的起点。

于 2013-10-18T10:08:49.623 回答