ANTLR生成C++解析器遇‘no declaration matches’错误求助
ANTLR4 C++编译错误解决方法
问题概述
使用ANTLR4 4.13.1-1生成C++解析器代码后,编译时出现类型不匹配错误,同时存在字符串常量转char*的警告,需修复这些问题以正常输出语法树。
相关代码与环境
C++调用ANTLR的函数
antlr4::tree::ParseTree* getTree(std::string caDefinition){ antlr4::ANTLRInputStream input(caDefinition); CAsyntaxLexer lexer(&input); antlr4::CommonTokenStream tokens(&lexer); tokens.fill(); CAsyntaxParser parser(&tokens); auto tree = parser.prog(); std::cout << tree->toStringTree(&parser) << std::endl << std::endl; return tree; }
ANTLR语法定义(CAsyntax.g4)
grammar CAsyntax; prog: definition ';' rule ';'; definition: 'let' stateflag ':' NAME ',' COLOR | definition ';' definition; stateflag: BOOLFLAG; rule: rule ';' rule | stateflag '->' transition; transition: state 'if' cond | state 'if' cond 'else' transition | '(' transition ')' | state; cond: val COMPARISON val | cond OP cond | 'not' cond | '(' cond ')'; val: 'rand' | number | neighborhood '.' state; number: INTEGER | REAL; neighborhood: 'nm' | 'nv'; state: stateflag; OP: '|' | '&' | '^'; COMPARISON: '>' | '<' | '=' | 'mod'; BOOLFLAG: 's'INTEGER; COLOR: '#' [0-9a-f] [0-9a-f] [0-9a-f] [0-9a-f] [0-9a-f] [0-9a-f]; NAME: [a-zA-Z]+ ; INTEGER: [0-9]+; REAL: INTEGER '.' [0-9]+; WS: [ \t\r\n] -> skip;
生成与编译命令
生成C++代码命令:
antlr4 -Dlanguage=Cpp CAsyntax.g4
原编译命令:
g++ main.cpp grammar/*.cpp -lGL -lglfw -lGLEW -lpng -I/usr/include/antlr4-runtime -o automaton
错误原因与修复步骤
1. 类型不匹配错误(RuleContext与sempred函数)
原因:ANTLR生成的代码中部分函数未正确指定antlr4::命名空间,导致与头文件声明不匹配。
修复:
- 打开
grammar/CAsyntaxParser.cpp,找到第157行的rule_()函数,将返回类型修改为antlr4::RuleContext*:antlr4::RuleContext* CAsyntaxParser::ProgContext::rule_() { // 原有逻辑保持不变 } - 找到第1000行的
sempred函数,将参数RuleContext *context修改为antlr4::RuleContext *context:bool CAsyntaxParser::sempred(antlr4::RuleContext *context, size_t ruleIndex, size_t predicateIndex) { // 原有逻辑保持不变 }
2. 编译命令缺少链接库参数
原因:原命令仅指定头文件路径,未链接ANTLR运行时库,单独替换参数会导致头文件或库缺失。
修正后的编译命令:
g++ main.cpp grammar/*.cpp -lGL -lglfw -lGLEW -lpng -I/usr/include/antlr4-runtime -lantlr4-runtime -o automaton
3. 字符串常量转char*警告
原因:C++标准禁止字符串常量隐式转换为非const的char*。
修复:
- 修改
HotShader构造函数参数为const char*,或者显式转换:HotShader computeShader = HotShader(const_cast<char*>("compute.glsl")); - 更规范的做法是将
HotShader构造函数改为接受std::string类型。
验证
完成上述修改后重新编译,编译通过即可正常输出语法树的字符串形式。
内容的提问来源于stack exchange,提问作者crypticcoder
相关产品推荐
相关产品推荐

