【问题标题】:Bison/Yacc: yyparse not declared in this scopeBison/Yacc:yyparse 未在此范围内声明
【发布时间】:2011-07-09 16:31:10
【问题描述】:

这个问题类似于this one,但针对的是 yyparse,而不是 yylex。

我已经为此奋斗了好几个小时了!我想从 C 程序中调用 yyparse (实际上是 C++ 程序,但我最终使用旧的 flex/bison 而不是 C++ woops 的新程序(甚至没有意识到 C++ 版本甚至存在))。唯一的错误是'yyparse' was not declared in this scope。我尝试将变量定义为全局变量,但它似乎不起作用。

在我尝试的 Flex 文件中:

extern "C" {
  int yyparse();
}

这在 Bison 文件中:

extern int yyparse();

但它什么也没做。

所以.. 我想我链接错了。问题是我正在使用 Qt 自动构建 make 文件,所以我无法编辑它而不会再次被覆盖。有没有办法在不改变链接的情况下解决问题?如果不是,如何进行链接?

【问题讨论】:

  • 您应该显示文件名和生成它们的错误消息。从您的问题中不清楚问题是否在于您正在使用 C++ 编译器编译 Bison 输出并且它抱怨没有事先定义 yyparse(),或者问题是否出在调用 @ 的代码中987654326@。你把 extern int yyparse(); 声明放在 Bison 文件的什么位置?它是在文件顶部的%{ ... %} 部分中,还是在其他地方?

标签: c bison yacc lex


【解决方案1】:

yyparse 声明应该放在调用 yyparse 的 C++ 文件包含的头文件中,而不是放在 flex 或 bison 文件中,因为 C++ 文件是需要声明的文件。 bison 将在它生成的源文件中创建它需要的声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2016-08-09
    • 2019-02-17
    • 2021-01-07
    • 2016-10-27
    • 2016-06-03
    相关资源
    最近更新 更多