ANTLR4.11.1生成C++解析器代码出现编译错误求助
ANTLR生成C++解析器编译报错:invalid use of member function
错误信息
编译生成的FilParser.cpp时出现以下错误:
Filc/src/generated/FilParser.cpp:803:16: error: invalid use of member function ‘antlrcppfil::FilParser::ExceptionContext* antlrcppfil::FilParser::ExprContext::exception()’ (did you forget the ‘()’ ?) 803 | _localctx->exception = std::current_exception(); | ~~~~~~~~~~~^~~~~~~~~ | () Filc/src/generated/FilParser.cpp:804:43: error: invalid use of non-static member function ‘antlrcppfil::FilParser::ExceptionContext* antlrcppfil::FilParser::ExprContext::exception()’ 804 | _errHandler->recover(this, _localctx->exception); | ~~~~~~~~~~~^~~~~~~~~
环境配置
- ANTLR版本:4.11.1(从4.8升级后问题未解决)
- C标准:C17
- 项目CMakeLists.txt内容:
project(Filc) cmake_minimum_required(VERSION 3.10) set (CMAKE_CXX_STANDARD 17) set(antlr4-jar ${PROJECT_SOURCE_DIR}/bin/antlr-4.11.1-complete.jar) set(antlr4-output ${PROJECT_SOURCE_DIR}/src/generated/FilLexer.cpp ${PROJECT_SOURCE_DIR}/src/generated/FilLexer.h ${PROJECT_SOURCE_DIR}/src/generated/FilParser.cpp ${PROJECT_SOURCE_DIR}/src/generated/FilParserBaseVisitor.cpp ${PROJECT_SOURCE_DIR}/src/generated/FilParserBaseVisitor.h ${PROJECT_SOURCE_DIR}/src/generated/FilParserVisitor.cpp ${PROJECT_SOURCE_DIR}/src/generated/FilParserVisitor.h ) add_custom_target(GenerateLexerParser COMMAND java -jar ${antlr4-jar} -Dlanguage=Cpp -visitor -no-listener -o ${PROJECT_SOURCE_DIR}/src/generated/ -package antlrcppfil ${PROJECT_SOURCE_DIR}/src/antlr/FilLexer.g4 ${PROJECT_SOURCE_DIR}/src/antlr/FilParser.g4 DEPENDS ${PROJECT_SOURCE_DIR}/src/antlr/FilLexer.g4 ${PROJECT_SOURCE_DIR}/src/antlr/FilParser.g4 ) include_directories( src src/generated src/utils antlr-runtime/src ) add_executable(filc src/main.cpp src/utils/cxxopts.hpp src/generated/FilLexer.cpp src/generated/FilLexer.h src/generated/FilParser.cpp src/generated/FilParserBaseVisitor.cpp src/generated/FilParserBaseVisitor.h src/generated/FilParserVisitor.cpp src/generated/FilParserVisitor.h ) add_dependencies(filc GenerateLexerParser) target_link_libraries(filc antlr4-runtime.a) install(TARGETS filc DESTINATION bin)
解决方案
问题根源
报错是因为ANTLR生成的ExprContext类中存在名为exception()的成员函数,该名称与C++标准库中的std::exception或上下文对象的隐含成员命名冲突,导致编译器无法区分是访问成员变量还是调用成员函数。
修复方式
临时修复(修改生成代码):
手动修改生成的FilParser.cpp和FilParser.h文件,将所有exception()成员函数重命名为不会冲突的名称(例如getException()),并同步更新所有调用该函数的代码位置。永久修复(修改语法文件):
检查你的.g4语法文件,若存在名为exception的规则(如exception : ...;),将其重命名为其他名称(例如exceptionStmt),然后重新运行ANTLR生成解析器代码即可彻底解决冲突问题。
内容的提问来源于stack exchange,提问作者Gashmob
相关产品推荐
相关产品推荐

