【问题标题】:GCC says "syntax error before numeric constant" in generated header file from bisonGCC 在从野牛生成的头文件中说“数字常量之前的语法错误”
【发布时间】:2011-03-29 06:06:18
【问题描述】:

当我使用 bison parser.y -d -t 编译我的 .y 文件,然后在我的 flex 文件中包含 parser.tab.h 文件时,gcc 会显示“错误:数字常量之前的语法错误”。它引用第 32 行,这是 yytokentype 枚举中的第一行。

enum yytokentype {
   BREAK = 258,
   ... }

错误与“BREAK = 258”行有关。老实说,我不知道为什么会这样——我真的很想使用生成的 yylval,我需要从这个头文件中获取它。即使我在我的 flex 文件中这样声明 yytokentype,我也会得到同样的错误。有什么我做错了吗?

【问题讨论】:

  • 我猜在错误行的上方某处重新定义了BREAK。 gcc 的-E 标志有助于找出这些问题。

标签: gcc enums bison flex-lexer


【解决方案1】:

BREAK 是否在您的代码中的其他地方定义?我从以下玩具示例中得到了类似的错误:

#define BREAK 10
enum yytokentype {
    BREAK = 258
};

构建示例:

$ cc -c file.c 
file.c:4: error: expected identifier before numeric constant

【讨论】:

  • 嗯?由于分号,无论是否使用#define,该示例都会失败。
  • 是的...这就是问题所在。我检查了我所有的#include,并在其中一个中找到了它。谢谢你们俩的帮助。
  • @Kinopiko,哎呀,应该复制/粘贴而不是重新输入。现已修复。
【解决方案2】:

大概 BREAK 已经在 flex 输出文件中的某个地方定义了,所以在预处理器运行之后,你会得到一个像 99 = 258 之类的语句。尝试查看cpp yy.lex.cgcc -E yy.lex.c 的输出。我查看了一个 flex 输出文件,但在其中的任何地方都没有找到 BREAK,只有 YY_BREAK。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多