如何使用JavaCC/JJTree存储令牌?

如何使用JavaCC/JJTree存储令牌?,java,parsing,compiler-construction,javacc,Java,Parsing,Compiler Construction,Javacc,我已经为一种DSL编写了一个JJTree(JavaCC)配置,它成功地标记了给定格式的文件,并将在请求时转储AST 问题是树中的每个节点都是空的,因为我当前没有存储令牌(我无法理解示例) 以下是我的.jjt文件的一部分: SimpleNode Start() #Root : {} { ( ( Section1() )? ( Section2() )? ( Section3() )* ) { return jjtThis; } } void Sect

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

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

以下是我的.jjt文件的一部分:

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

void Section3() #Section3 : {}
{
  < SECTION_3 > Identifier() <LBRACE >
    Header()
        (Details() < SEMICOLON > )*
  < RBRACE >
}
SimpleNode Start()#根:{}{
(
(第1节())?
(第2节())?
(第3节()*
)  {
将此返回jjt;
}
}
无效部分3()#部分3:{}
{
标识符()
标题()
(详细信息()<分号>)*

}
我希望根节点存储对Section1、Section2的引用以及对Section3的引用列表。我希望Section3节点存储标识符、标题块并保留详细信息块的列表

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


谢谢。

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

或者,如果您厌倦了这种简单的节点迭代和toString检查,您可以定义自己的节点类型,而不是依赖SimpleNode实现。在下面的示例中,Start()现在返回一个自定义根节点,而不是普通的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);
  }
}
如果您正在遍历解析树并对节点执行复杂的操作,那么最好将其中的一部分移动到一个位置,以便您对节点执行的操作与节点类本身分离。您可能会得到几个访问者类,每个类在解析树上执行一个函数,并为每种类型的节点提供访问方法重载


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

谢谢您提供的信息。如果可能,您可以向我展示如何在不定义自定义节点类的情况下处理此示例(如何在预先存在的JJTree定义的节点类型中添加字段以保存自定义标记)?也就是说,请举例说明您在第一段中解释的方法。