我有一个语法可以在Irony控制台中正常工作和解析,但我在AST treeview中没有得到任何东西。我正在跟随这里的BASIC->Javascript文章:http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler,但似乎所有的Ast东西都被移动/删除了。我找到了Irony.Interpreter .dll,其中包含一些Ast内容,但它似乎都与表达式示例实现捆绑在一起。
这里我漏掉了什么?我想遍历我的树并生成源代码,但我不确定从哪里开始。
我看到一些人提到使用访问者模式,我对此没有意见,但我不知道如何实现它,并以Irony喜欢的方式运行它。
发布于 2015-09-22 13:47:26
查看命名恰当的Sarcasm项目,其中包含构建在Irony上的语法、解析器和AST的参考实现。我发现作者的这个blog entry对构建AST很有帮助。
下面是启动和运行AST的通用指南。
定义您的语法(example)
AstNode (example)派生的抽象基类(MyBaseNode)。为每个终端和非终端复制/粘贴示例
MyBaseNode和派生的新类
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); }
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.**
IMyNodeVisitor并添加一个Visit方法:从步骤1开始,在语法中void Visit(MyDerivedNode1 node);
ASTNodeType。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));
语法中的
LanguageFlags = LanguageFlags.CreateAst;
发布于 2013-10-18 18:08:50
具有讽刺意味的是,解析分两个阶段完成。首先,它创建一个解析树,然后创建你的AST树。
你只是看到了第一步。为了让Irony创建AST,您可以:
例如,看看讽刺文法示例ExpressionEvaluatorGrammar,我们会看到:
var BinExpr = new NonTerminal(" BinExpr ",typeof( BinaryOperationNode ));`这里我们告诉Irony将BinExpr NonTerminal映射到我们的BinaryOperationNode节点。
当您设置此标志时,将在解析时生成AST树。
this.LanguageFlags = LanguageFlags.CreateAst;
然后,AST树的根将是:
parseTree.Root.AstNode我发现this源代码是一个很好的起点。
https://stackoverflow.com/questions/15012865
复制相似问题