您好,我正在尝试使用c ++作为目标,使用antlr4实现数学表达式的解析器。
我使用示例计算器语法作为开始,现在我正在解析并最终正确评估简单表达式。现在,我开始使用sqrt,log,sin等数学函数进行寻址。语法是我的,但我想避免在访客实现中使用一系列if / elseif。
为上下文生成的代码为:
class OneArgFunctionNameContext : public antlr4::ParserRuleContext {
public:
OneArgFunctionNameContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *SQRT();
antlr4::tree::TerminalNode *EXP();
antlr4::tree::TerminalNode *LOG();
antlr4::tree::TerminalNode *LN();
antlr4::tree::TerminalNode *SIN();
antlr4::tree::TerminalNode *COS();
antlr4::tree::TerminalNode *TAN();
antlr4::tree::TerminalNode *ACOS();
antlr4::tree::TerminalNode *ASIN();
antlr4::tree::TerminalNode *ATAN();
antlr4::tree::TerminalNode *ABS();
virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
然后,鉴于我有机会看到和理解的示例,我可以做到以下几点:
{
if (ctx->SQRT())
{
... // perform sqrt
}
else if (ctx->EXP())
{
... // perform exp
}
else if (...)
{
...
}
...
}
我想拥有的是switch语句,而不是if / elseif的序列,但是我找不到如何标识子终端节点是哪种类型。类似于以下内容:
switch (ctx->{SOMETHING})
{
case SQRT:
...
break;
case SQRT:
...
break;
...
}
可以这样做吗?我觉得答案(肯定的或否定的)应该很明显,但我无法伸手去理解它。
预先感谢