Java 如何使用JJTree中的AST重现原始代码

Java 如何使用JJTree中的AST重现原始代码,java,compiler-construction,abstract-syntax-tree,javacc,Java,Compiler Construction,Abstract Syntax Tree,Javacc,我被指派了一个任务,在这个任务中,我必须使用JavaCC解析器来生成编译器。我有一个合成语言的语法,我们称之为K。给定一个输入程序,我必须能够读入该程序,创建一个AST,然后遍历该AST,以更干净的形式复制原始程序 例如,给定代码: begin a := 2 s := 0 while - a 12 begin s := + s * a a a := + a 2 end end 一旦我把这个输入到我的程序中,我将得到一个AST,它由Op、Const、ID等元素组成 但是我需要能够得到代码

我被指派了一个任务,在这个任务中,我必须使用JavaCC解析器来生成编译器。我有一个合成语言的语法,我们称之为K。给定一个输入程序,我必须能够读入该程序,创建一个AST,然后遍历该AST,以更干净的形式复制原始程序

例如,给定代码:

begin a := 2
s := 0 while - a
12 begin
    s := + s * a a a := + a 2
end end
一旦我把这个输入到我的程序中,我将得到一个AST,它由Op、Const、ID等元素组成

但是我需要能够得到代码中使用的实际数字和变量,这样我才能像这样重现代码:

begin
  a := 2
  s := 0
  while - a 12
    begin
      s := + s * a a
      a := + a 2
    end
end
我已经通读了演示如何制作AST的示例,据我所知,我已经成功了。我困惑的是如何从AST中获取生成节点的实际文本。这个问题中的人使用了dump方法,但这只能返回节点的类型。我只需要了解如何在遍历节点时从节点获取实际标识符


我非常感谢这里的一些建议。

SimpleNode
类中有一个名为
value
的字段,您可以将其用于任何需要的用途。在Bart Kiers的回答中,您可以看到他使用值字段存储标识符名称和常量等信息

例如,他写作

void id() #ID :
{Token t;}
{
  t=<ID> {jjtThis.value = t.image;}
}
由于
id
字段受到保护,因此不会编译上述内容。您可以执行以下操作之一:

  • id
    更改为
    public
    。(最好添加一个公共访问器并使用它。)
  • buildString
    方法放入SimpleNode类中
  • 使用您自己的类为SimpleNode创建子类,该类具有id的访问器,并确保解析器通过使用
    NODE\u class
    选项来使用该类。还要更改buildString参数的类型

也许你可以看看这个链接:尽管这个链接很酷,但我只是想弄清楚如何从JJTree的AST中获取与令牌关联的ID。Javascript在这里对我没有多大帮助。
static void buildString( SimpleNode n, String indentation, StringBuilder out ) {
    swtich( n.id ) {
        ...
        case ID: out.append( n.jjtGetValue() ) ; break ;
        ...
    }
}