在 vc6 中使用 bison 和 flex

Posted

技术标签:

【中文标题】在 vc6 中使用 bison 和 flex【英文标题】:Use bison and flex with vc6 【发布时间】:2009-08-06 12:25:36 【问题描述】:

当我 时,出现以下错误

lex.yy.c(395):错误 C2146:语法错误:缺少 ';'在标识符“YY_PROTO”之前 lex.yy.c(395) : 致命错误 C1004: 发现文件意外结尾

这是什么原因? 请帮忙。

复制自评论:

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus 
extern "C" int yywrap YY_PROTO(( void )); 
#else
extern int yywrap YY_PROTO(( void )); 
#endif
#endif 

【问题讨论】:

您可能希望在帖子中包含触发错误的行以及它之前和之后的几行。 这里是给出错误的行:#ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap YY_PROTO(( void )); #else extern int yywrap YY_PROTO(( void )); #endif #endif 您使用像 VC6 这样古老而过时的垃圾有什么特别的原因吗? 【参考方案1】:

YY_PROTO 宏仅支持旧的准标准 C,不支持原型。您将很难找到今天不支持该功能的编译器。这意味着作为第一个调试步骤,您可以尝试完全删除它,因为您想使用原型,即将 lex.yy.c 修改为以下内容:

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int yywrap ( void );
#else
extern int yywrap ( void );
#endif
#endif

我知道 lex.yy.c 是一个生成的文件,所以这不会是永久修复,但它至少应该确认问题与 YY_PROTO 的定义有关。

【讨论】:

【参考方案2】:

YY_PROTO 是之前在同一文件中定义的宏,因此在宏定义附近发生了一些奇怪的事情。在文件的前面搜索以查看 YY_PROTO 是如何定义的——如果它没有被定义,你的编译器正在做一些非常奇怪的事情。

【讨论】:

以上是关于在 vc6 中使用 bison 和 flex的主要内容,如果未能解决你的问题,请参考以下文章

Flex&Bison:在单独的文件中定义主函数

将flex和bison编译成cpp

BISON FLEX。提供输入文件时出现意外输出

编写可在 8 位嵌入式系统上使用的解析器,如 Flex/Bison

lex yacc flex bison

flex bison