我有两个词法分析器 - 分别带有前缀(%选项前缀)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帖子,但没有找到太多帮助。 我非常感谢您解决这些问题的任何帮助!
谢谢!
答案 0 :(得分:1)
显然,如果存在yy_nxt
,则存在导致扫描程序转换表%option full
错误地写入头文件的错误。这应该在最新版本的flex(2.5.39)中修复。
如果您不想升级您的flex版本,一个简单的解决方法是避免使用%option full
。您可能会发现速度惩罚无法衡量。