【问题标题】:Editing C files generated from lex and bison files编辑从 lex 和 bison 文件生成的 C 文件
【发布时间】:2011-09-05 16:47:35
【问题描述】:

我一直无法从.c 文件中删除警告,这些文件由 .l(lex).y(bison)。我在lexbison 文件中没有任何编译器警告。但我在生成的C 文件中收到以下类型的警告。

 parser.c:1772:34: warning: conversion to 'long unsigned int' from 'long int' may change the sign of the result

这是来自parser.c 的警告。这个 parser.c 是从 parser.y 生成的。您能否让我知道如何永久删除这些警告,因为在 parser.c 中进行编辑对下一次编译没有任何意义。

提前致谢。

【问题讨论】:

  • 如果您解释了您希望在这些文件中更改的内容以及原因,您可能会得到更好的答案。只要有可能,生成代码的正确做法是改进生成,而不是手动欺骗结果。
  • 由 lex 和 yacc 生成的代码往往有点麻烦(毕竟它在做一些非常复杂的事情)所以我不会打扰 - 或者是否有无例外 0 警告政策没有到位工具生成的来源例外?

标签: c compiler-warnings bison lex


【解决方案1】:

如果警告与生成的 bison/lex 代码部分有关(不是您的操作)。 可能唯一的解决方案是修改骨架。

但很可能警告与您的 bison/lex 源代码中的操作部分有关,您只需修改操作即可。请记住,bison 不会分析您的操作内容(即大括号内的所有代码。

假设您正在使用一个返回 unsigned int 的函数,并且在这样的一个操作中使用它:

  rule : foo { $$ = some_function_returning_an_unsigned_int($1); }
              ^-------------------------------------------------^
                here : bison only expand the $'s to the correct c expression

如果规则的预期标记类型是 int,您将收到 c 警告。

如果没有源代码行 (1772:34) 和上下文,很难准确回答您的问题。

【讨论】:

    【解决方案2】:

    您的 Flex/Lex 和 Bison/Yacc 文件将告诉我有关此问题的更多信息。 Flex 和 Bison 在生成代码时不给您警告的原因是因为它们将您的代码视为文本块并且不尝试理解它。这就是 C 编译器的工作。

    c 代码是从您的文件中生成的。 tweek 生成的代码不是一个好主意,因为它相当复杂。最好从源头上得到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      相关资源
      最近更新 更多