g++编译Flex&Bison代码遇‘yylex’未声明作用域问题求助
解决Flex&Bison中‘yylex’ was not declared in this scope错误
嘿,作为刚入门Flex和Bison的开发者,这个错误其实是两者配合时非常常见的声明问题,我来帮你一步步搞定它:
错误原因
当Bison生成的解析器试图调用Flex提供的yylex()词法分析函数时,如果编译器没有提前看到这个函数的声明,就会抛出“未在作用域中声明”的错误。默认情况下,Flex生成的lexer代码里的yylex()声明不会自动被Bison的解析器识别到,所以需要我们手动补充。
解决方案
这里有两种简单有效的方法:
方法1:直接在Bison文件中声明yylex()
打开你的Bison文件(比如sample.y),在开头的%{ ... %}代码块里添加extern int yylex();声明,示例如下:
%{ #include <iostream> using namespace std; // 新增这个声明,告诉编译器yylex()的存在 extern int yylex(); %} // 下面是你的Bison语法规则...
方法2:通过Flex生成头文件并在Bison中引用
- 在你的
sample.ll文件开头添加#define YY_DECL extern int yylex(),修改后的Flex代码开头如下:
%{ #include <iostream> using namespace std; // 定义YY_DECL来指定yylex的外部声明 #define YY_DECL extern int yylex() %} %% [ \n] /*匹配空格和换行,不做处理*/ "//".* { cout << "comments" << endl; } "(" { cout << "start (" << endl; } ")" { cout << "end )" << endl; } "+" { cout << "+ detected" << endl; } "-" { cout << "- detected" << endl; } "/" { cout << "/ detected" << endl; } %%
- 编译Flex时加上
--header-file=lex.yy.h参数,生成对应的头文件:
flex --header-file=lex.yy.h sample.ll
- 在Bison文件的
%{ ... %}块中包含这个生成的头文件:
%{ #include <iostream> using namespace std; #include "lex.yy.h" %}
编译顺序提醒
记得按照正确的顺序编译:先生成Flex词法分析器,再生成Bison语法分析器,最后链接所有目标文件,示例命令:
flex sample.ll bison -d sample.y g++ lex.yy.c sample.tab.c -o my_parser
另外给你个小建议:Flex里的注释规则("//")(.)*可以简化成"//".*,功能是一样的,代码更简洁~
内容的提问来源于stack exchange,提问作者AshkanAbd
相关产品推荐
相关产品推荐

