首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >讽刺的是,现在我该如何使用AST?

讽刺的是,现在我该如何使用AST?
EN

Stack Overflow用户
提问于 2013-02-22 05:47:58
回答 2查看 6K关注 0票数 8

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-22 13:47:26

查看命名恰当的Sarcasm项目,其中包含构建在Irony上的语法、解析器和AST的参考实现。我发现作者的这个blog entry对构建AST很有帮助。

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

定义您的语法(example)

  • Create一个从AstNode (example)派生的抽象基类(MyBaseNode)。为每个终端和非终端复制/粘贴示例

  • 中的方法,创建一个从MyBaseNode

派生的新类

代码语言:javascript
复制
1. Override `Accept` method ([example](https://github.com/akfish/Sarcasm/blob/38f1555b756c30cd66a2bbda523e51db3c6b9033/Sarcasm/Ast/SarcasmNode.cs#L135)):        

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

代码语言:javascript
复制
1. Override [`Init`](https://github.com/akfish/Sarcasm/blob/38f1555b756c30cd66a2bbda523e51db3c6b9033/Sarcasm/Ast/SarcasmNode.cs#L363) (mostly on terminals) or [`InitChildren`](https://github.com/akfish/Sarcasm/blob/38f1555b756c30cd66a2bbda523e51db3c6b9033/Sarcasm/Ast/SarcasmNode.cs#L344) (non-terminals) as appropriate. **This is where the AST magic happens.**

  1. 为上一步(example)中定义的每个类添加一个接口IMyNodeVisitor并添加一个Visit方法:

从步骤1开始,在语法中void Visit(MyDerivedNode1 node);

  • Set每个终端和非终端的ASTNodeType

代码语言:javascript
复制
1. For terminals - ([example](https://github.com/akfish/Sarcasm/blob/38f1555b756c30cd66a2bbda523e51db3c6b9033/Sarcasm/Parser/SarcasmGrammar.cs#L40)) 

MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

2.对于非终端- (example)

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

语法中的

  1. 启用AST创建:(example)

LanguageFlags = LanguageFlags.CreateAst;

票数 7
EN

Stack Overflow用户

发布于 2013-10-18 18:08:50

具有讽刺意味的是,解析分两个阶段完成。首先,它创建一个解析树,然后创建你的AST树。

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

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

例如,看看讽刺文法示例ExpressionEvaluatorGrammar,我们会看到:

var BinExpr = new NonTerminal(" BinExpr ",typeof( BinaryOperationNode ));`这里我们告诉Irony将BinExpr NonTerminal映射到我们的BinaryOperationNode节点。

  • 让它在解析时生成AST:

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

this.LanguageFlags = LanguageFlags.CreateAst;

然后,AST树的根将是:

代码语言:javascript
复制
parseTree.Root.AstNode

我发现this源代码是一个很好的起点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15012865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档