这学期编译原理的实践作业是编写一个词法分析器和一个语法分析器,并将它们结合起来,其中提到了允许使用自动生成技术,于是编译界的大神Lex和Yacc就华丽丽登场了,不过他们是Unix上的软件,要在Windows上使用还是需要解决一些问题的。
我在网上查阅了大量的资料,其中最多提到的是使用Parser Generator,这个软件相当于移植版的Lex + Yacc,整个软件的安装包只有2M不大,但是它存在一个问题,就是我无法用它生成可以在VS2012上编译通过的代码,但是根据网络上的资料,使用该软件是可以产生能在VC6编译通过的代码的,不过配置过程稍显繁琐。
我使用了另外一种方法,并在这里介绍给大家,简单方便。
在Windows上的Lex和Yacc的移植版是flex和bison,安装这两个软件就可以使用Lex和Yacc的完整功能:
这两个软件也非常小巧,你可以在这里下载。
下载后直接依次安装,建议安装在同一个目录里,我安装到了C:\GnuWin32,这时候你就已经可以使用他们了。
用他们生成c代码的方法非常简单,把你写好的.l文件放置到C:\GnuWin32\bin之中,然后使用命令行进行如下操作就可以产生一个名为lex.yy.c的c语言文件,如下图所示:
这里需要注意的是,这个c语言的文件是不能在vc或vs中编译通过的,因为微软提供的编译器缺乏了一些组件,所以为了编译这个程序,我们必须安装GCC。安装GCC有多种方式,这里推荐直接安装Dev-C++,算是个比较老的软件了。这是一个使用GCC作为C语言编译器的IDE,开源免费。
你需要下载4.9.9.2版(网上的5.0.0.0版是后继开发的,存在一些缺陷,不要使用),我将其装在了C:\DEV-CPP,接下来你需要把flex和bison的运行库放置到DEV-CPP的库目录中。
复制C:\GnuWin32\lib文件夹中的libfl.a和liby.a到C:\DEV-CPP\Lib中。
随后为了方便我们使用GCC来编译文件,建议将下面这个目录添加到你的系统path中:
之后使用GCC命令即可编译这个c文件了:
产生的可执行文件可以运行,效果如下。
关于lex和yacc的使用及其规则文件的编写,以后有机会再向大家介绍: )
我们的作业是写一个完整的编译器……
借助这两个工具可以很方便的实现一个可以用的脚本语言 解释器 。但如果要实现能够产生汇编代码或的编译器的话,则需要多花费一些时间在寄存器和内存管理上~由于课时较少,我们是只做到了产生四元组~