词法分析——Flex介绍(包括如何编译和运行)
来源:互联网 发布:知乎分享到朋友圈 编辑:程序博客网 时间:2024/06/06 03:00
实在是没有写博客的习惯,忽然发现实验做完了,但是还没有写博客,于是上来补一篇好了。
这次的词法分析的内容不是很多,13号晚上花了点时间写完了代码,14号写实验报告的时间居然比写代码的时间还要多,于是想起了那句话“如果爱迪生每个实验都写一份实验报告,那他还会有这么多的发明吗?”大概是这么个意思。
目前采用的是在windows下写词法分析,并且在windows上编译和运行,觉得后面的实验恐怕还是要在linux实现了,于是乎装了个Ubuntu,在windows上使用flex在上篇文章里面已经写的很详细了。下面就是如何写词法分析:
首先,我们需要自行完成包括词法规则等在内的Flex代码。如何编写这份代码后面会提到,现在先假设这份写好的代码名lexical.l;随后,我们使用Flex 对这份代码进行编译:flex lexical.l 编译好的结果会保存在当前目录下的lex.yy.c 文件中。打开这个文件你会发现,该文件本质上就是一个C语言的源代码。事实上,这份源代码里目前对我们有用的函数只有一个,叫做yylex(),该函数的作用就是读取输入文件中的一个词法单元。我们可以再为它编写一个main函数:
int main(int argc, char** argv)
{
if (argc > 1)
{
if (!(yyin = fopen(argv[1], “r”)))
{
perror(argv[1]);
return 1;
}
}
while (yylex() != 0) ;
return 0;
}
这个main函数通过命令行读入若干个参数,并取第一个参数为其输入文件名尝试打开输入文件。如果打开文件失败则退出,而如果成功则调用yylex()进行词法分析。其中,变量yyin是Flex内部使用的一个变量,代表输入文件的文件指针,如果我们不去设置它那么Flex会将它自动设置为stdin(注意如果你将main函数独立成了一个文件,则需要声明yyin为外部变量:extern FILE* yyin)。
将这个main函数单独放到一个文件main.c中(你也可以直接放到lexical.l 中的用户自定义代码部分,这样就可以不必声明yyin;你甚至可以不写main函数,Flex会自动给你配一个,但不推荐这么做),然后编译这两个C源文件,我们将输出程序命名为scanner:
gcc main.c lex.yy.c -lfl -o scanner
注意编译命令中的“-lfl”参数一定不能少,否则GCC会因缺少库函数而报错。之后我们就可以使用这个scanner程序进行词法分析了。例如,想要对一个测试文件test.cmm 进行词法分析,只需要在命令行输入:
./scanner test.cmm (Linux下)
scanner test.cmm (Windows下)
就可以得到你想要的结果。
于是,我们就可以进行编译和运行了。
参考资料:许畅老师班《指导攻略1》
- 词法分析——Flex介绍(包括如何编译和运行)
- 词法分析——编写Flex源代码
- 编译原理——实验 1.1用 FLEX自动构造词法分析程序
- 编译原理——词法分析(1)
- 编译技术实现——词法分析
- 编译原理——词法分析
- 词法分析(编译原理)
- 编译原理(词法分析)
- 词法分析 flex 应用
- 编译原理-用FLEX构造词法分析程序
- 编译原理 - 用FLEX自动构造词法分析程序
- 编译原理之词法分析和语法分析
- 编译原理之词法分析和语法分析
- 编译原理实验一——简单词法分析
- 哈工大编译原理实验1——词法分析
- 词法分析——编译原理(参考代码,不是原创)
- 邮箱地址词法分析(编译原理)
- 编译原理(词法分析程序)
- 第七周-项目4-复数模板类
- Mysql分页过程
- [IOS 图像处理]--相机的各种处理效果DLCImagePickerController
- [gallery] 显示sdcard上的图片,及它的缩略图
- reverse integer
- 词法分析——Flex介绍(包括如何编译和运行)
- PCI 9054
- MATLAB旋转体的绘制
- mysql学习笔记
- 问题五十八:贺老师教1班和2班两个班的C++,1班同学的学号为1-41,2班同学的学号为42-84,现在每个班要抽签确定5名同学去参加学校组织的教学效果评价,请完成这个“抽签“。
- 第六周 项目三 点 类问题
- Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问
- linux内核参数查看与修改
- hdu 1598 find the most comfortable road(枚举+并查集)