我现在如何在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喜欢的方式运行它。
查看命名恰当的Sarcasm项目,了解基于Irony的语法、语法分析器和AST的参考实现。我发现作者的这篇博客文章对构建AST很有帮助。
以下是启动和运行AST的通用指南。
- 定义语法(示例)
- 创建一个从
AstNode
派生的抽象基类(MyBaseNode
)(示例)。复制/粘贴示例中的方法 -
对于每个终端和非终端,创建一个从
MyBaseNode
和派生的新类- 覆盖
Accept
方法(示例):
public override void Accept(IMyNodeVisitor visitor) { visitor.Visit(this); }
- 根据需要覆盖
Init
(主要在端子上)或InitChildren
(非端子)这就是AST魔法发生的地方
- 覆盖
-
为上一步中定义的每个类添加一个接口
IMyNodeVisitor
和一个Visit
方法(示例):void Visit(MyDerivedNode1 node);
-
从步骤1开始,为语法中的每个终端和非终端设置
ASTNodeType
。-
对于终端-(示例)
MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);
-
对于非终端-(示例)
var MyNonTerminal2 = new NonTerminal("MyNonTerminal2", typeof(MyDerivedNode2));
-
-
在语法中启用AST创建:(示例)
LanguageFlags = LanguageFlags.CreateAst;
在Irony中,解析分为两个阶段。首先,它创建一个解析树,然后创建您的AST树。
你只看到了第一步。为了让Irony创建AST,您可以:
-
告诉它如何将您的NonTerminals映射到AST节点:
例如,查看Irony示例语法表达式EvaluatorGrammar,我们会看到:
var BinExpr = new NonTerminal("BinExpr", typeof(BinaryOperationNode));`
在这里,我们告诉Irony将BinExpr NonTerminal映射到BinaryOperationNode,这是我们的AST节点。
-
使其在解析时生成AST:
当您设置此标志时,解析时将生成AST树。
this.LanguageFlags = LanguageFlags.CreateAst;
然后你的AST树的根将是:
parseTree.Root.AstNode
我发现这个来源是一个很好的起点。