假设我有这样的规则:
rule : '(' rule ')' | '!' rule '!';
现在在我的运行时中,我有这种方法:
antlrcpp::Any runtimeVisitor::visitRule(tinycParser::RuleContext *ctx) {
...
}
如何检查我是握拳还是在第二种情况下?这样的东西可能有效吗?
if(ctx->rule(0)) visitRule(ctx->rule(0))
您可以像这样标记您的替代方案:
rule
: '(' rule ')' #ParenthesizedRule
| '!' rule '!' #ExclamationMarkRule
| ...
;
然后,您可以为每个替代方案定义特定的访问者方法(即visitParenthesizedRule
、visitExclamationMarkRule
等(而不是visitRule
.
如果您不想在语法中添加任何内容,也可以只检查规则的第一个子项是左括号还是感叹号:
if (ctx.children[0].getText() == "(") {
...
} else if (ctx.children[0].getText() == "!") {
...
} else {
...
}