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

前端之家收集整理的这篇文章主要介绍了c# – 反讽:评估AST节点的教程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 Irony中定义了一个简单的语法,并生成了一个很好的紧凑型AST.

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

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

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

然后this one替换数据堆栈中的单个值…但并没有真正解释如何输出或任何东西.

为了清楚起见,我特别想知道如何覆盖Irony.Ast.AstNode中的EvaluateNode方法来做我想要的.

好的,我已经跟踪了这一行的结尾:

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

这包含在默认评估例程中….也许它适用于计算器应用程序,但在我的计算机应用程序中并不是很好.试图找出如何绕过脚本解释器,但后来我不知道如何设置全局变量.

解决方法

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

也许这link可以帮到你.

猜你在找的C#相关文章