词法分析——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》

原创粉丝点击