【发布时间】:2017-09-27 05:58:19
【问题描述】:
我正在用 C++ 编写一个带有 flex 和 bison 的 ansi-C 解析器;这很复杂。
我遇到的问题是编译错误。错误如下,这是因为yy_terminate 返回了YY_NULL,它被定义为(一个int)0,而yylex 的返回类型为yy::AnsiCParser::symbol_type。 yy_terminate(); 是 flex 生成的扫描器中 <<EOF>> 令牌的自动操作。显然这会导致类型问题。
我的扫描仪不会为 EOF 生成任何特殊标记,因为 EOF 在 C 语法中没有用途。我可以为<<EOF>> 创建一个令牌规则,但如果我忽略它,则扫描仪在YY_STATE_EOF(INITIAL) 案例中的yylex 中无限循环挂起。
编译错误,
ansi-c.yy.cc: In function ‘yy::AnsiCParser::symbol_type yylex(AnsiCDriver&)’:
ansi-c.yy.cc:145:17: error: could not convert ‘0’ from ‘int’ to ‘yy::AnsiCParser::symbol_type {aka yy::AnsiCParser::basic_symbol<yy::AnsiCParser::by_type>}’
ansi-c.yy.cc:938:30: note: in expansion of macro ‘YY_NULL’
ansi-c.yy.cc:1583:2: note: in expansion of macro ‘yyterminate’
此外,Bison 为我的起始规则 (translation_unit) 和 EOF ($end) 生成此规则。
$accept: translation_unit $end
所以yylex 必须为 EOF 返回一些东西,否则解析器将永远不会停止等待输入,但我的语法不支持 EOF 标记。有没有办法让 Bison 在不修改我的语法的情况下识别 0 以外的 $end 条件?
或者,我是否可以从扫描器中的 <<EOF>> 令牌返回一些东西以满足 Bison $end 条件?
【问题讨论】:
标签: c++ bison flex-lexer