c++ - 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
?
解决方案
推荐阅读
- r - 将 str() 的输出写入文本文件?
- github-pages - 为什么我的 github 页面没有显示给所有用户?
- html - 不遵守 css 过渡线性属性
- django - 如何根据 if 条件更改模板中的数据级类?
- c++ - 如何在主函数中调用模板类
- node.js - 当我使用服务器的 JIMP 大小旋转图像时,每次旋转后图像大小都会迅速增加?有什么理由吗?
- java - 图像未在 reyclerview 中显示,图像来自 firebase
- node.js - 没有 SYSDBA 的 Node-oracledb 的 createPool 方法
- javascript - 基本的 react-cube-navigation 示例返回 TypeError
- docker - docker compose容器无法访问互联网