gpt4 book ai didi

c# - 具有讽刺意味的是:关于评估 AST 节点的教程?

转载 作者:太空狗 更新时间:2023-10-29 20:42:17 26 4
gpt4 key购买 nike

我在 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,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 种不同类型的内容:另一个标签、字符串文字、变量或数字。我应该在 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# - 具有讽刺意味的是:关于评估 AST 节点的教程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com