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
| ...
;
然后您可以为每个备选方案定义特定的访问者方法(即 visitParenthesizedRule
、visitExclamationMarkRule
等)而不是 visitRule
.
如果您不想在语法中添加任何内容,您也可以只检查规则的第一个子项是左括号还是感叹号:
if (ctx.children[0].getText() == "(") {
...
} else if (ctx.children[0].getText() == "!") {
...
} else {
...
}
假设我有这样的规则:
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 {
...
}