反讽:评估AST节点的教程?

时间:2011-02-14 08:06:19

标签: c# irony

我在Irony中定义了一个简单的语法,并生成了一个很好的紧凑型AST。

现在我正在试图弄清楚如何评估它。问题是,我找不到任何关于如何做到这一点的教程。

我只定义了两个AST节点:

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,ParseTreeNode treeNode)
    {
        base.Init(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));
    }
}

这将生成以下输出:

 <html><head><title></title></head><body><h1></h1><p></p><p></p></body></html>3.14159265358979

而我想要的输出是:

<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种不同类型的内容:另一种标签,字符串文字,变量或数字。我应该在if(node is StringLiteral) ....方法中编写EvaluateNode之类的内容还是什么?


我找到了this one但他们只是循环了AST并且没有利用EvaluateNode

然后this one 替换数据堆栈中的单个值...但是并没有真正解释这是如何输出的。


要明确,我特别想知道如何覆盖EvaluateNode中的Irony.Ast.AstNode方法来做我想做的事。


好的,我已经在这一行的末尾追踪了这一点:

    if (EvaluationContext.HasLastResult)
      EvaluationContext.Write(EvaluationContext.LastResult + Environment.NewLine);

默认评估例程中包含哪些内容....也许它适用于计算器应用程序,但在我的计算机应用程序中效果不是很好。试着弄清楚如何绕过脚本解释器,但后来我不知道如何设置全局变量。

1 个答案:

答案 0 :(得分:0)

迭代AST结构的最佳方法是实现访问者pattern

也许这link会帮助你。