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

标签 c++ c flex-lexer lexical

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

如果我使用更新的版本 2.5.37 或更新的版本如 2.6,生成的代码似乎不会分配任何东西。它使用了一些用 nullptr 和崩溃定义的指针。

我认为这些版本之间的语法发生了变化。我发现 Debian/Ubuntu 有一个名为 flex 的包也很奇怪-老话说:

flex is a tool for generating scanners: programs which recognize lexical patterns in text. This is the old 2.5.4a version, which is no longer being developed. You should normally choose flex, unless you have legacy lexer files that do not work with a modern flex.

This product includes software developed by the University of California, Berkeley and its contributors. The upstream source code can be found at 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 版,它就可以工作了。对于更高版本,它可以很好地翻译和编译,但是当您运行该程序时,您将遇到段错误。

最佳答案

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

如果有人有类似的问题,您可能想看看 yy_init 变量。除此之外我没有任何问题。

关于c++ - 将 flex 2.5.4a 迁移到 2.6(词法分析器生成器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43339702/

相关文章:

c++ - 在运行时选择互斥量或虚拟互斥量

c - 执行错误 - 程序停止工作 (C)

flex-lexer - 替换 flex 中的转义字符

c - 如何在 ubuntu 11.10 的 eclipse IDE 中编程和编译 C?我需要安装哪个插件?

c - 如何使用 bison + flex 编写计算器

regex - 匹配空输入的 flex 脚本?

c++ - 计算出内存地址指向的值

c++ - 从 C++ 到 C:替代 std::map?

c++ - 使用自定义分配器引用字符串的 std::basic_string 特化作为 std::string 的常量对象而无需开销?

C程序-段错误,原因