使用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解决。
修复步骤
- 首先删除你手动添加的
%token YYEOF声明,不要自定义内置结束标记。 - 在parser.yy的配置段添加以下配置,开启Bison C++模式的token构造器生成,自动生成
make_YYEOF方法:
%define api.token.constructor %define api.value.type variant %define parse.assert
- 在Flex词法文件(.ll)的末尾添加EOF匹配规则,显式返回Bison内置的结束标记:
<<EOF>> return yy::parser::make_YYEOF();
- 调整文法起始规则,删除规则末尾手动添加的
YYEOF,Bison会自动校验输入是否完全匹配到结束位置,示例:
// 错误写法 unit: IDENTIFIER YYEOF // 正确写法 unit: IDENTIFIER
- 确认Flex的%option配置匹配可重入C++模式要求:
%option noyywrap nounput noinput reentrant c++
验证操作
重新生成Bison、Flex代码后编译运行,输入合法内容后正常退出,不会再触发EOF相关语法错误。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

