gpt4 book ai didi

java - antlr4 - 解析函数调用

转载 作者:行者123 更新时间:2023-11-30 05:17:43 25 4
gpt4 key购买 nike

我有以下规则:

functionInv
: NAME paramInvList #functionInvStmt
;
paramInvList
: BRO BRC
| BRO expression (',' expression )* BRC
;

以及相应的 Ast 类:

public class FunctionInvocationExpr implements Ast {
private final String target;
private final List<Ast> arguments;

public FunctionInvocationExpr(String target, List<Ast> arguments) {
this.target = target;
this.arguments = arguments;
}

@Override
public <T> T accept(AstVisitor<T> visitor) {
return visitor.visitFunctionInvocationExpr(this);
}
}

问题是,我如何从一种转到另一种。谷歌搜索根本没有帮助。有人能指出我正确的方向吗?我使用访问者代码生成。

最佳答案

生成词法分析器和解析器类时,需要添加参数 -visitor这样 ANTLR 就会为您生成一些默认访问者:

java -jar antlr-4.8-complete.jar -visitor Test.g4

这将创建一个 TestBaseVisitor<T>适合你的类(class):

public class TestBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements TestVisitor<T> {

@Override
public T visitFunctionInvStmt(TestParser.FunctionInvStmtContext ctx) { return visitChildren(ctx); }

@Override
public T visitParamInvList(TestParser.ParamInvListContext ctx) { return visitChildren(ctx); }

@Override
public T visitExpression(TestParser.ExpressionContext ctx) { return visitChildren(ctx); }

// ...
}

您可以扩展它并使其返回您自己的 Ast节点:

class AstVisitorBuilder extends TestBaseVisitor<Ast> {

@Override
public Ast visitFunctionInvStmt(TestParser.FunctionInvStmtContext ctx) {

final String functionName = ctx.NAME().getText();
final List<Ast> arguments = new ArrayList<>();

if (ctx.paramInvList().expression() != null) {
for (TestParser.ExpressionContext expression : ctx.paramInvList().expression()) {
arguments.add(this.visitExpression(expression));
}
}

return new FunctionInvocationExpr(functionName, arguments);
}

@Override
public Ast visitExpression(TestParser.ExpressionContext ctx) {
return null; // TODO return your expression AST node here
}

// ...
}

可以按如下方式调用它:

TestLexer lexer = new TestLexer(new ANTLRInputStream("your source code"));
TestParser parser = new TestParser(new CommonTokenStream(lexer));
Ast ast = new AstVisitorBuilder().visit(parser.functionInv());
// ...

关于java - antlr4 - 解析函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60117155/

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