Antlr4 C++访问模糊分支

Antlr4 C++ visit ambiguous branch

假设我有这样的规则:

rule : '(' rule ')' | '!' rule '!';

现在在我的运行时我有这个方法:

antlrcpp::Any runtimeVisitor::visitRule(tinycParser::RuleContext *ctx) { 
     ...
}

如何判断自己是第一种还是第二种?这样的东西可能有用吗?

if(ctx->rule(0)) visitRule(ctx->rule(0))

您可以这样标记您的备选方案:

rule
    : '(' rule ')' #ParenthesizedRule
    | '!' rule '!' #ExclamationMarkRule
    | ...
    ;

然后您可以为每个备选方案定义特定的访问者方法(即 visitParenthesizedRulevisitExclamationMarkRule 等)而不是 visitRule.

如果您不想在语法中添加任何内容,您也可以只检查规则的第一个子项是左括号还是感叹号:

if (ctx.children[0].getText() == "(") {
    ...
} else if (ctx.children[0].getText() == "!") {
    ...
} else {
    ...
}