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

使用Bison开发C++可重入解析器时EOF处理报错如何解决?

错误根因
  • 手动添加%token YYEOF属于错误操作:Bison内部会自动声明值为0的YYEOF作为内置输入结束标记,你手动声明的YYEOF是独立的自定义token,和Bison预期的内置结束标记$end不是同一个实体,因此会触发syntax error, unexpected YYEOF, expecting $end报错。
  • ‘make_YYEOF’ is not a member of ‘yy::parser’报错是Bison 3.5.x版本C++解析器框架的配置缺失问题,不需要通过手动声明token解决。
修复步骤
  1. 首先删除你手动添加的%token YYEOF声明,不要自定义内置结束标记。
  2. 在parser.yy的配置段添加以下配置,开启Bison C++模式的token构造器生成,自动生成make_YYEOF方法:
%define api.token.constructor
%define api.value.type variant
%define parse.assert
  1. 在Flex词法文件(.ll)的末尾添加EOF匹配规则,显式返回Bison内置的结束标记:
<<EOF>>
  return yy::parser::make_YYEOF();
  1. 调整文法起始规则,删除规则末尾手动添加的YYEOF,Bison会自动校验输入是否完全匹配到结束位置,示例:
// 错误写法
unit: IDENTIFIER YYEOF

// 正确写法
unit: IDENTIFIER
  1. 确认Flex的%option配置匹配可重入C++模式要求:
%option noyywrap nounput noinput reentrant c++
验证操作

重新生成Bison、Flex代码后编译运行,输入合法内容后正常退出,不会再触发EOF相关语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:54:08