工作环境:
操作系统: ubuntu 13.04;
IDE:code::block 12.11;
词法分析程序生成器:lex
语法分析程序生成器:yacc
《TINY编译器》源码在书上附录B,它并没有使用lex和yacc生成词法/语法扫描程序,而是自己编写了scan.c和parse.c,用来实现词法扫描和语法扫描。我们的目标是利用lex和yacc生成词法与语法扫描程序,从而代替scan.c与parse.c,实现TINY编译器。
大体工作,我分为五个部分:
一:TINY源代码,不加任何修改,在ubuntu下编译、运行成功。
二:单独使用lex,生成词法分析程序,替代san.c,在ubuntu下编译、运行成功
三:单独使用yacc,生成语法分析程序,替代parse.c,在ubuntu下编译、运行成功
四:lex和yacc配合使用,生成词法、语法分析程序,替代scan.c、parse.c,在ubuntu下编译、运行成功。
五:进行适当的词法输入文件与语法输入文件的分析、修改,实现扩展的编译器。最高目标是实现自设计编译器。
上一篇博客已经介绍了工作一的完成步骤,在此不再赘述。下面介绍工作二的完成。
TINY编译器源代码中有一个LEX文件夹,里面放有TINY.L文件,此文件便是lex的输入文件,文件格式不再叙述。还有一个YACC文件夹,里面放有TINY.Y文件,此文件是yacc的输入文件。将这两个输入文件拷贝到其他源码存在的文件夹下,也就是其上一目录文件夹。
刚开始,需要在TINY.L的最后添加一个yywrap()函数。添加内容为:
int yywrap()
{
return 1;
}
yywrap() | 这一函数在文件(或输入)的末尾调用。 如果函数的返回值是1,就停止解析。 因此它可以用来解析多个文件。 代码可以写在第三段,这就能够解析多个文件。 方法是使用 yyin 文件指针(见上表)指向不同的文件,直到所有的文件都被解析。 最后,yywrap() 可以返回 1 来表示解析的结束。 |
首先,使用命令:yacc -d TINY.Y
生成文件 y.tab.c和y.tab.h。一个是语法分析程序源码,另一个则是与之相关的头文件。在此工作二中,我们只需要.h头文件。
然后使用命令: lex TINY.L
生成文件lex.yy.c,这便是我们需要的词法分析源程序。
文件已经全部准备好了,剩下的只需新建一个工程,将lex.yy.c、y.tab.h和其他源码文件(不包括scan.c)文件加入到同一个工程中即可。
再次不再叙述工程建立。也可像上一个博客中提到的那样,写makefile文件,为减少工作量,我使用code::block IDE,用来编译工程。当然,上一博客中也可用IDE来编译工程,而无需makefile文件。