加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

词法分析——Flex介绍(包括如何编译和运行)

发布时间:2020-12-15 04:23:48 所属栏目:百科 来源:网络整理
导读:? ? ? ? 实在是没有写博客的习惯,忽然发现实验做完了,但是还没有写博客,于是上来补一篇好了。 ? ? ? ? 这次的词法分析的内容不是很多,13号晚上花了点时间写完了代码,14号写实验报告的时间居然比写代码的时间还要多,于是想起了那句话“如果爱迪生每个实

? ? ? ? 实在是没有写博客的习惯,忽然发现实验做完了,但是还没有写博客,于是上来补一篇好了。

? ? ? ? 这次的词法分析的内容不是很多,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》

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读