gpt4 book ai didi

c# - 我现在如何在 Irony 中使用 AST?

转载 作者:太空狗 更新时间:2023-10-29 18:27:18 29 4
gpt4 key购买 nike

我有一个语法可以在 Irony 控制台中正常工作和解析,但我在 AST TreeView 中没有得到任何东西。我正在关注此处找到的 BASIC->Javascript 文章:http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler , 但似乎 Ast 的东西都被移动/删除了。我找到了 Irony.Interpreter .dll,里面有一些 Ast 的东西,但它似乎都与表达式示例实现有关。

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

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

最佳答案

查看恰当命名的 Sarcasm一个基于 Irony 的语法、解析器和 AST 的引用实现项目。我找到了这个 blog entry由作者帮助构建 AST。

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

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

    的新类
    1. 覆盖 Accept 方法 ( example ):

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

    1. 覆盖 Init (主要在终端上)或 InitChildren (非终端)视情况而定。 这就是 AST 魔术发生的地方。
  4. 添加接口(interface) IMyNodeVisitor 并为上一步 (example) 中定义的每个类添加 Visit 方法:

    void Visit(MyDerivedNode1 节点);

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

    1. 对于终端 - ( example )

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. 对于非终端 - ( example )

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

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

    LanguageFlags = LanguageFlags.CreateAst;

关于c# - 我现在如何在 Irony 中使用 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15012865/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com