将flex 2.5.4a迁移到2.6(词法分析器生成器)

时间:2017-04-11 07:44:45

标签: c++ c flex-lexer lexical

我有一个使用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版本,它将起作用。对于更高版本,它可以进行翻译和编译,但是当你运行程序时,你会遇到分段错误。

1 个答案:

答案 0 :(得分:2)

我自己发现了这个问题。变量yy_init可以在旧版本中显式设置。在较新的版本中,它是不允许的。我不确定这是否有意,也许有人可以解释为什么会出现这种行为。我发现它有点奇怪。

如果有人遇到类似问题,您可能需要查看yy_init变量。除此之外,我没有任何问题。