我在
Irony中定义了一个简单的语法,并生成了一个很好的紧凑型AST.
现在我想弄清楚如何评估它.问题是,我找不到任何关于如何做到这一点的教程.
我只定义了2个AST节点:
@H_301_6@class TagListNode : AstNode { public override void Init(ParsingContext context,ParseTreeNode treeNode) { base.Init(context,treeNode); AsString = "TagList"; foreach (var node in treeNode.ChildNodes) AddChild(null,node); } public override void EvaluateNode(Irony.Interpreter.EvaluationContext context,AstMode mode) { foreach (var node in ChildNodes) node.EvaluateNode(context,AstMode.Read); } } class TagBlockNode : AstNode { public AstNode Content; public override void Init(ParsingContext context,treeNode); AsString = treeNode.ChildNodes[0].FindTokenAndGetText(); Content = AddChild(null,treeNode.ChildNodes[1]); } public override void EvaluateNode(EvaluationContext context,AstMode mode) { context.Write(string.Format("<{0}>",AsString)); Content.EvaluateNode(context,AstMode.Read); context.Write(string.Format("</{0}>",AsString)); } } @H_301_6@<html><head><title></title></head><body><h1></h1><p></p><p></p></body></html>3.14159265358979而我想要的输出是:
@H_301_6@<html> <head> <title>page title</title> </head> <body> <h1>header</h1> <p>paragraph 1</p> <p>3.14159265358979</p> </body> </html>我不认为我应该使用Context.Write().样本显示推送到context.Data并弹出它们…但我不太确定它是如何工作的.
我猜猜pi会在最后被添加,因为它会被自动推送到context.Data然后一个元素在最后弹出?我不太确定.
一些指针或指向教程的链接会很好.
另外,我该如何处理不同的节点类型?每个“标签”可以有4种不同类型的内容:另一种标签,字符串文字,变量或数字.我应该在EvaluateNode方法中编写if(node is StringLiteral)….或者是什么?
我找到了this one,但它们只是循环了AST并且没有利用EvaluateNode.
然后this one替换数据堆栈中的单个值…但并没有真正解释如何输出或任何东西.
为了清楚起见,我特别想知道如何覆盖Irony.Ast.AstNode中的EvaluateNode方法来做我想要的.
好的,我已经跟踪了这一行的结尾:
@H_301_6@if (EvaluationContext.HasLastResult) EvaluationContext.Write(EvaluationContext.LastResult + Environment.NewLine);这包含在默认评估例程中….也许它适用于计算器应用程序,但在我的计算机应用程序中并不是很好.试图找出如何绕过脚本解释器,但后来我不知道如何设置全局变量.