我现在如何在Irony中使用AST

本文关键字:AST Irony | 更新日期: 2023-09-27 18:00:31

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

我在这里错过了什么?我想遍历我的树并生成源代码,但我不确定从哪里开始。

我看到有人提到使用访问者模式,我对此很满意,但我不知道如何实现它,并以Irony喜欢的方式运行它。

我现在如何在Irony中使用AST

查看命名恰当的Sarcasm项目,了解基于Irony的语法、语法分析器和AST的参考实现。我发现作者的这篇博客文章对构建AST很有帮助。

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

  1. 定义语法(示例)
  2. 创建一个从AstNode派生的抽象基类(MyBaseNode)(示例)。复制/粘贴示例中的方法
  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. 从步骤1开始,为语法中的每个终端和非终端设置ASTNodeType

    1. 对于终端-(示例)

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

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

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

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

    LanguageFlags = LanguageFlags.CreateAst;

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

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

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

    例如,查看Irony示例语法表达式EvaluatorGrammar,我们会看到:

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

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

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

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

    this.LanguageFlags = LanguageFlags.CreateAst;
    

然后你的AST树的根将是:

parseTree.Root.AstNode

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