首页 > 解决方案 > antlr4中对Any的要求

问题描述

我正在尝试使用 Antlr4 编写一个简单语法的访问者,但是我无法将我的类型转换为Any生成的语法使用的类型。

作为一个最小的例子,我的类型是

class Atom {
public:
  Atom(int idx, std::string el) : index(idx), element(el) {}
  int index;
  std::string element;
};

如果我传递指针,解析器中的访问者函数就可以正常工作。

 antlrcpp::Any MyVisitor::visitSpecies(DissolveParser::SpeciesContext *context) {
  auto terms = context->speciesTerm();

  for (auto &term : terms) {
    Atom* temp = visit(term);
    std::cout << "Atom " << temp->element << " " << temp->index << std::endl;
  }

  return true;
}


antlrcpp::Any MyVisitor::visitSpeciesAtom (DissolveParser::SpeciesAtomContext *context) {
    int index = std::stoi(context->index->getText());
    std::string element = visit(context->element);
    Atom* result = new Atom(index, element);
    antlrcpp::Any finalResult(result);
    return finalResult;
}

但是,我不想传递指针,而是传递值。但是,这会导致崩溃

    antlrcpp::Any MyVisitor::visitSpecies(DissolveParser::SpeciesContext *context) {
      auto terms = context->speciesTerm();

      for (auto &term : terms) {
        Atom temp = visit(term);
        std::cout << "Atom " << temp.element << " " << temp.index << std::endl;
      }

      return true;
    }


antlrcpp::Any MyVisitor::visitSpeciesAtom (DissolveParser::SpeciesAtomContext *context) {
    int index = std::stoi(context->index->getText());
    std::string element = visit(context->element);
    Atom result(index, element);
    antlrcpp::Any finalResult(result);
    return finalResult;
}

这与terminate called after throwing an instance of 'std::bad_cast'. 需要将什么Atom类型转换为Any

标签: c++antlrantlr4

解决方案


推荐阅读