Java 如何使用JJTree中的AST重现原始代码
我被指派了一个任务,在这个任务中,我必须使用JavaCC解析器来生成编译器。我有一个合成语言的语法,我们称之为K。给定一个输入程序,我必须能够读入该程序,创建一个AST,然后遍历该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等元素组成 但是我需要能够得到代码
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
- 将
方法放入SimpleNode类中buildString
- 使用您自己的类为SimpleNode创建子类,该类具有id的访问器,并确保解析器通过使用
选项来使用该类。还要更改buildString参数的类型NODE\u class
static void buildString( SimpleNode n, String indentation, StringBuilder out ) {
swtich( n.id ) {
...
case ID: out.append( n.jjtGetValue() ) ; break ;
...
}
}