生成的Visitor中的switch语句

时间:2019-06-11 09:23:57

标签: c++ antlr4

您好,我正在尝试使用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;
   ...
}

可以这样做吗?我觉得答案(肯定的或否定的)应该很明显,但我无法伸手去理解它。

预先感谢

0 个答案:

没有答案