gpt4 book ai didi

java - 如何使用 JavaCC/JJTree 来存储 token ?

转载 作者:行者123 更新时间:2023-11-30 09:52:29 24 4
gpt4 key购买 nike

我已经为一种 DSL 编写了一个 JJTree (JavaCC) 配置,它成功地标记了给定格式的文件,并在请求时转储 AST。

问题是树中的每个节点都是空的,因为我当前没有存储 token (我无法理解示例)。

这是我的 .jjt 文件的一部分:

SimpleNode Start() #Root : {} {
(
( Section1() )?
( Section2() )?
( Section3() )*
) {
return jjtThis;
}
}

void Section3() #Section3 : {}
{
< SECTION_3 > Identifier() <LBRACE >
Header()
(Details() < SEMICOLON > )*
< RBRACE >
}

我希望根节点存储对第 1 节、第 2 节的引用以及对第 3 节的引用列表。我希望 Section3 节点存储标识符、 header block 并保留详细信息 block 的列表。

我的 fill .jjt 文件有几百行,但我觉得如果我能理解这两部分,那么我就能理解 JJTree 是如何工作的。请让我知道如何正确使用 JJTree。

谢谢。

最佳答案

如果您查看 SimpleNode 类,您会注意到它的实例会自动存储对其父节点和子节点的引用(除非使用 #void 抑制了它们的创建)。例如,您的根节点将包含对 0..1 Section1 节点、0..1 Section2 节点和 0..* Section3 节点的引用,并且可以使用返回 Node 对象的 jjtGetChild() 方法访问它们。要确定此子节点是 Section1、Section2 还是 Section3 节点,您可以调用其 toString() 方法(就像 dump() 一样)。

或者,如果您厌倦了这种朴素的 Node 迭代和 toString 检查,您可以定义自己的节点类型,而不是依赖于 SimpleNode 实现。在我下面的示例中,Start() 现在返回自定义 RootNode 而不是普通的 SimpleNode。 RootNode 包含对其子节点的特定引用(根据需要为它们定义 getter)。请注意,我的简短代码片段假设 Section1/2/3() 全部返回自定义节点,但事实并非如此......根据您所说的,您需要一个自定义节点对于 Section3() 但如果 Section1/2 是微不足道的,您可以将它们保留为 SimpleNodes。

RootNode Start() : 
{
Section1Node s1Node = null;
Section2Node s2Node = null;

List s3Nodes = new LinkedList();
Section3Node s3Node = null;
}
{
(
( s1Node = Section1() )?
( s2Node = Section2() )?
( s3Node = Section3() {s3Nodes.add(s3Node); } )*
) {

return new RootNode(s1Node, s2Node, s3Nodes);
}
}

如果您正在遍历解析树并对节点执行复杂的操作,那么将其中一些移动到 Visitor class 可能是个好主意。这样您对节点所做的操作就与节点类本身分离了。您最终可能会得到几个访问者类,每个访问者类都在解析树上执行一个函数,并为每种类型的节点重载访问方法。

如果有什么不明白的,请告诉我。我不是 JavaCC 专家(我曾在大学使用过它)但我应该可以帮助你 :)

关于java - 如何使用 JavaCC/JJTree 来存储 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4247440/

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