使用flex编译多个词法分析器会产生重新定义错误

时间:2015-04-24 03:56:05

标签: c gcc flex-lexer

我有两个词法分析器 - 分别带有前缀(%选项前缀)shell和javascript的shell.l和javascript.l(在shell.l中为%option prefix =“shell”,在javascript.l中为%option prefix =“javascript”) )。

我从另一个文件(main_file.c)顺序调用词法分析器:

somefunc(){
.....
shelllex();

......
javascriptlex();
}

为了调用这些,我在main_file.c中包含了这两个词法分析器的头文件:

#include <.....>
#include "lex.shell.h"
#include "lex.javascript.h" 

并且,当我将flex文件编译为:

时,我创建了这些头文件
flex --header-file=lex.shell.h shell.l
flex --header-file=lex.javascript.h javascript.l
gcc -o lang lex.shell.c lex.javascript.c main_file.c -lfl

当我编译main_file.c时,我得到了redefiniton错误,如下所示:

在code_detector.c中包含的文件中:16:0:

lex.javascript.h:227:29: error: redefinition of ‘yy_nxt’
 static yyconst flex_int16_t yy_nxt[][128] =
                             ^
In file included from code_detector.c:15:0:
lex.shell.h:227:29: note: previous definition of ‘yy_nxt’ was here
 static yyconst flex_int16_t yy_nxt[][128] =

我已经浏览了其他几篇SO帖子,但没有找到太多帮助。 我非常感谢您解决这些问题的任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:1)

显然,如果存在yy_nxt,则存在导致扫描程序转换表%option full错误地写入头文件的错误。这应该在最新版本的flex(2.5.39)中修复。

如果您不想升级您的flex版本,一个简单的解决方法是避免使用%option full。您可能会发现速度惩罚无法衡量。