Antlr4 如何使用ANTLR访问者处理可选语法块?

Antlr4 如何使用ANTLR访问者处理可选语法块?,antlr4,optional,visitor-pattern,Antlr4,Optional,Visitor Pattern,这个问题以前可能有人问过,但我找不到。所以如果你们发现类似的东西,请告诉我 根据以下规则: fix_body : ident binders (annotation)? (':' term)? ':=' fix_body_term; 我有一个可选的注释和一个可选的术语。相应的visitorRule如下所示: public FixBody visitFix_body(coqParser.Fix_bodyContext ctx) 我的问题是,我如何发现,是否有一个术语 有一种通过使用ctx.t

这个问题以前可能有人问过,但我找不到。所以如果你们发现类似的东西,请告诉我

根据以下规则:

fix_body : ident  binders (annotation)? (':' term)? ':=' fix_body_term;
我有一个可选的注释和一个可选的术语。相应的visitorRule如下所示:

public FixBody visitFix_body(coqParser.Fix_bodyContext ctx)
我的问题是,我如何发现,是否有一个术语


有一种通过使用
ctx.term()
获取术语的方法,但是当没有给定术语时,该方法是否返回
null
?还是有完全不同的方法来解决这个问题?因为我正在使用一个大语法,所以我需要一段时间来测试这个,否则我会这样做的

那里没有陷阱

如果该术语是可选的,则只需在调用
accept(visitor)
方法之前对其进行测试即可

就你而言

if(ctx.term() != null) ctx.term().accept(new TermVisitor())
例如:


好的,很高兴知道这一点。不过,我只是想澄清一下。在我看来,ctx.term().accept(new TermVisitor())和(new TermVisitor()).visit(ctx.term())之间没有区别。我说得对吗?我想你是对的。都是设计模式的东西。我习惯了accept()方法,ANTLR提供了它,所以我使用了它(它显然被称为访问者模式双分派方法)。如果你对visit()更满意,那就去吧。