You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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或上下文对象的隐含成员命名冲突,导致编译器无法区分是访问成员变量还是调用成员函数。

修复方式

  1. 临时修复(修改生成代码):
    手动修改生成的FilParser.cpp和FilParser.h文件,将所有exception()成员函数重命名为不会冲突的名称(例如getException()),并同步更新所有调用该函数的代码位置。

  2. 永久修复(修改语法文件):
    检查你的.g4语法文件,若存在名为exception的规则(如exception : ...;),将其重命名为其他名称(例如exceptionStmt),然后重新运行ANTLR生成解析器代码即可彻底解决冲突问题。

内容的提问来源于stack exchange,提问作者Gashmob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:01:14