编译原理课设——《TINY编译器》,用lex生成词法扫描实现编译器

       工作环境:

           操作系统:  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文件。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验二 词法分析器 一、实验目的 掌握词法分析器的构造原理,掌握手工编程或LEX编程方法之一。 二、实验内容 编写一个LEX源程序,使之生成一个词法分析器,能够输入的源程序转换为单词序列输出。 三、实验环境 Flex+VC6.0 四、实验注意 1.Id正则表达式:{letter}({letter}|{digit})* 2.Num正则表达式:{digit}+(\.{digit}+)?(E[+-]?{digit}+)? 3.注释:(\/\*(.)*\*\/) 4.关键字再加上其他字符就又能编程id,所以在词法分析时,id的判断应该放在关键字前面,这样才不会误判 5.由于本程序知识简单的打印数字,因此没有考虑数字的转换 6.">="比">"多一个字符,它应该放在前面判断,其他类似的也应该如此安排 五、实验代码 ******************************************************************************* 实验文件lex.l、lex.yy.c 实验结果:lex.exe 运行方式:打开lex.exe,弹出input.txt,在其中输入所要测试的程序,保存并关闭,即可在output.txt中看到所得结果 ******************************************************************************* %{ void Install(char *type); %} %option noyywrap delim [ \t] newline [\n] digit [0-9] num {digit}+(\.{digit}+)?(E[+-]?{digit}+)? letter [A-Za-z] id {letter}({letter}|{digit})* key ("if"|"while"|"do"|"break"|"true") basic ("int"|"float"|"bool"|"char") op (">="|""|"<"|"="|"!="|"+"|"-"|"*"|"/") comment (\/\*(.)*\*\/) %% delim {;} newline {printf("\n");} {num} {Install("Num");} {key} {Install("Key");} {basic} {Install("Basic");} {op} {Install("Op");} ";" {Install("Comma");} {id} {Install("ID");} {comment} {Install("Comment");} "(" | "[" | "{" {Install("lbracket");} ")" | "]" | "}" {Install("rbracket");} %% void Install(char *s) { fprintf(yyout, "%s:%s ", s, yytext); } int main() { printf("please input the test program in input.txt\n"); system("input.txt"); yyin = fopen("input.txt", "r"); yyout = fopen("output.txt", "w" ); yylex(); fclose(yyout); fclose(yyin); printf("analysis result in output.txt\n"); system("output.txt"); return 0; } 六、实验小结 本次的实验由于使用了flex,所以代码较短,麻烦的事flex的正则式表达,由于该使用规则只有简单介绍,而网上找的教程难免有比重就轻之嫌,所以得到上述表达式着实费力,且有的没有成功,例如bracket的(\ ((.)*\ ))或者("("(.)*")")使用时都没有成功,所以便单独写出,有点不伦不类。至于其他的,都较为简单,完。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值