【问题标题】:Migrating flex 2.5.4a to 2.6 (lexical analyser generator)将 flex 2.5.4a 迁移到 2.6(词法分析器生成器)
【发布时间】:2017-09-06 11:21:28
【问题描述】:

我有一个使用 flex 生成 cc 代码的文件。当我使用 2.5.4a-10 版本时,代码按预期工作。

如果我使用更新的版本 2.5.37 甚至更新的版本(如 2.6),生成的代码似乎没有分配任何东西。它使用一些用 nullptr 定义的指针并崩溃。

我认为这些版本之间的语法发生了变化。我觉得 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 版,它就可以工作了。在以后的版本中,它可以很好地翻译和编译,但是当您运行程序时,您会遇到分段错误。

【问题讨论】:

  • 如果您能提供一些有关您遇到的问题的实际详细信息,将会很有帮助。显然,minimal reproducible example 是理想的选择。
  • 是的,我知道,让我们尝试上传一个。这个例子不是那么小。

标签: c++ c flex-lexer lexical


【解决方案1】:

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

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

【讨论】:

  • 该变量未记录在案,因此更改它是个坏主意。看起来将其设置为 1 会阻止 flex 自行初始化,那么您为什么要这样做呢?
  • 嗨,杰伊,我从不想做这样的事情。我得到的代码大约有 20 年的历史。它将该变量定义为 1。需要询问传递给我的人,为什么他决定设置它。
  • 无论如何,我决定将其更改为可重入扫描仪。我们需要它,因为我们希望能够扫描多个流。我认为对于这种情况和改进对扫描仪状态的控制,这是一种更好的方法。
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多