Java 使用ANTLR 4构建AST

Java 使用ANTLR 4构建AST,java,compiler-construction,antlr4,abstract-syntax-tree,Java,Compiler Construction,Antlr4,Abstract Syntax Tree,我正在创建一个DSL,它最终必须被翻译成Java源代码。我正在使用Antlr4生成一个解析树(使用访问者树遍历方法)来解析基于语法文件在DSL中编写的代码片段。我正在visit方法中直接创建一个javaast 有人能确认/拒绝这是否是一种良好的做法吗?或者,如果我在将AST转换为Java之前为DSL构建了一个AST,这是否有益 示例(直接构建Java AST): 使用以下语法规则: printExp:'print('exp') 提议: @Override public DSLNode visit

我正在创建一个DSL,它最终必须被翻译成Java源代码。我正在使用Antlr4生成一个解析树(使用访问者树遍历方法)来解析基于语法文件在DSL中编写的代码片段。我正在visit方法中直接创建一个javaast

有人能确认/拒绝这是否是一种良好的做法吗?或者,如果我在将AST转换为Java之前为DSL构建了一个AST,这是否有益

示例(直接构建Java AST):

使用以下语法规则:

printExp:'print('exp')

提议:

@Override
public DSLNode visitPrintExp(PrintExpContext ctx) {
    DSLExprNode den = (DSLExprNode) visit(ctx.exp());
    DSLPrintNode dpn = new DSLPrintNode(den);
    return dpn;
}

这可能有点太基于观点了。我的意见是:这是完美的。ANTLR正在为您的DSL构建自己的AST;不需要另一个。走在ANTLR的树上很好。我读了下面的帖子后感到困惑。本质上,我不知道是否值得“重复”构建一个直观的AST,而不是使用生成的解析树来生成Java源代码。文章:博客所说的是,自动生成的AST将具有语法结构,如果您想要更易于处理的不同结构,您必须自己创建它。但事实是,大多数时候自动生成的语法都很好:大多数语法远没有C声明那么难看!
@Override
public DSLNode visitPrintExp(PrintExpContext ctx) {
    DSLExprNode den = (DSLExprNode) visit(ctx.exp());
    DSLPrintNode dpn = new DSLPrintNode(den);
    return dpn;
}