gpt4 book ai didi

c++ - "yyparse/yylex/yyerror was not declared in this scope"- 弹性/Bison

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:50 33 4
gpt4 key购买 nike

我正在使用 Windows 上的 Flex 和 Bison 为一种相对简单的语言创建编译器。但是编译器告诉我函数 yyerror 和 yyparse 没有在正确的范围内声明。经过一番阅读后,我发现问题显然是 C 和 C++ 链接的冲突(我正在使用 g++,因为我正在尝试构建抽象语法树)。代码摘录如下。

蒙蒂.y:

%{
extern "C" {
int yyparse();
int yylex(void);
void yyerror(char *s){}
int yywrap(void){return 1;}
}

#include <stdio.h>
#include <string.h>
#include "ast\ast.h"

using namespace std;

Program* root;
//extern int yyparse();



main() {
yyparse();
}

%}

蒙蒂.l:

%{
#include <stdlib.h>
#include "ast/ast.h"
#include "y.tab.h"
%}

%%
"do" { puts("DO"); return DO; }
"else" { puts("ELSE"); return ELSE; }
"end" { puts("END"); return END; }
"if" { puts("IF"); return IF; }

etc...
%%

int main(void)
{
yyparse();
return 0;
}

对于这些错误的来源的任何帮助或启发将不胜感激:)

最佳答案

包含在 %{ ... }% 中的 .y 文件中的代码被逐字复制到生成的解析器文件的顶部 自动生成函数的定义,例如 yyparse。因此,您编写的代码(包括 main 的定义和对 yyparse 的调用)出现在任何这些函数的声明或定义之前。这可能是您错误的根源。

请记住,生成的解析器文件不必包含 main。事实上,您可能需要考虑创建一个包含 main 的单独 C++ 源文件。然后,您可以让该文件包含自动生成的 header ,以便它看到 yyparse 的声明。

此外,如果您正在尝试为此程序编写 C++ 代码,请注意您在 bison 源文件中声明的 main 函数不是有效的 C++,因为它没有声明返回类型.所有 C++ main 函数都必须显式返回一个 int

另请注意,您有两个主要函数,一个在词法分析器文件中,一个在解析器文件中,这会给您的后续操作带来问题。将您的 main 函数分解到它自己的单独文件中,然后包含词法分析器和解析器头文件将解决此问题。

最后,请注意,如果您确实要生成 C++ 代码,则无需将 void 放入 main 的参数列表中。 C++ 假定空参数列表意味着“不接受任何参数”,因此无需另行声明。

关于c++ - "yyparse/yylex/yyerror was not declared in this scope"- 弹性/Bison ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38143828/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com