我有一个使用flex生成cc代码的文件。当我使用2.5.4a-10版本时,代码按预期工作。
如果我使用更新的版本2.5.37甚至更新版本2.6,生成的代码似乎不会分配任何东西。它使用了一些用nullptr和crashes定义的指针。
我认为这些版本之间的语法已经发生了变化。我觉得Debian / Ubuntu有一个名为flex-old的软件包也很奇怪:
flex是一种用于生成扫描仪的工具:识别词汇的程序 文字中的图案。这是旧的2.5.4a版本,已不再使用 正在开发中。你通常应该选择flex,除非你有 遗留词法分析器文件,不适用于现代flex。
本产品包含由加州大学开发的软件, 伯克利及其贡献者。上游源代码可以在
http://flex.sourceforge.net/
(编者注:Flex已移至Github,但v2.5.4a不存在。)
对于我怀疑的其他人来说,这个版本似乎是个大问题。回答我的问题:
是否有任何手册或指南,我必须做什么才能移植该代码以生成一些适用于更新版本的flex的c ++代码?
编辑:这是我从更大的东西中取得的简单例子:
int num_lines = 0, num_chars = 0;
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
int main()
{
yy_init=1;
yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
return 0;
}
使用flex file.l
对其进行展开,并使用gcc lex.yy.c -lfl
进行构建。现在,如果您使用的是2.5.4版本,它将起作用。对于更高版本,它可以进行翻译和编译,但是当你运行程序时,你会遇到分段错误。
答案 0 :(得分:2)
我自己发现了这个问题。变量yy_init
可以在旧版本中显式设置。在较新的版本中,它是不允许的。我不确定这是否有意,也许有人可以解释为什么会出现这种行为。我发现它有点奇怪。
如果有人遇到类似问题,您可能需要查看yy_init
变量。除此之外,我没有任何问题。