1

我是词法分析和解析器生成的新手,我尝试直接从wikipedia编译野牛示例开始。这是一个可重入解析器的示例。

我尝试使用 2 个版本的野牛进行编译:2.5 和 2.6.5。前者编译和执行完美,但后者包括yyscan_t在词法分析器头(Lexer.h)中声明的解析器头中的类型(我猜这是可重入功能所必需的)。因此它不会编译Parser.c生成Parser.y

这是 2.6.5 中生成的额外部分,Parser.h而 2.5 中不存在:

#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
#else
int yyparse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int yyparse (SExpression **expression, yyscan_t scanner); // this line
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */

我已经标记了导致问题的行。有什么想法吗?

编辑:我需要做的是确保yyscan_t在野牛生成的头文件中声明。

4

1 回答 1

3

实际上,自 2.6 以来的 bison 将前面提到的代码块插入到标题部分中。

您需要通过将 %code {...}(或 %{...%})部分的一部分移动到新代码中来告诉野牛在此块之前插入 yyparse 函数参数的所有声明带有标签“需要”的部分,以便将其插入到标题的顶部,在您的 yy 文件中:

%code requires {
typedef void*                 yyscan_t;
} 

请参阅野牛压裂手册:

http://www.gnu.org/software/bison/manual/html_node/_0025code-Summary.html

http://www.gnu.org/software/bison/manual/html_node/Prologue-Alternatives.html#Prologue-Alternatives

希望有帮助

于 2013-01-23T16:48:46.173 回答