编译原理词法分析和语法分析报告+代码(C语言版)_第1页
编译原理词法分析和语法分析报告+代码(C语言版)_第2页
编译原理词法分析和语法分析报告+代码(C语言版)_第3页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信息工程学院实验报告(20102011学年度第一学期)课程名称编译原理实验名称词法分析器姓名:柳冠天学号:2081908318班级:083词法分析一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。二、实验要求2.1待分析的简单的词法(1)关键字:beg in if the n while do end所有的关键字都是小写。(2)运算符和界符:= + -*/<<=<>>>= = ;()#(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit

2、digit*(4) 空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符 和关键字,词法分析阶段通常被忽略。2.2各种单词符号对应的种别码:表2.1各种单词符号对应的种别码单词符号种别码单词符号种别码bgin1:17If218The n3<20wile4<>21do5<=22end6>23lettet (letter|digit) *10>=24dight dight*11=25+13;26一14(27*15)28/16#02.3词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中

3、:syn为单词种别码;token为存放的单词自身字符串; sum为整型常数。例如:对源程序 begi n x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begi n)(10,x)(18,:=)(11,9)(26,;)(2,if)三、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.1主程序示意图:主程序示意图如图 3-1所示。其中初始包括以下两个方面:关键字表的初值。关键字作为特殊标识符处理,把它们预先安排

4、在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = begi n”,if ”,fhen ”,While ”,d o”,en d",;图3-1(2 )程序中需要用到的主要变量为syn,token和sum3.2扫描子程序的算法思想:首先设置3个变量:token用来存放构成单词符号的字符串; sum用来整型单词; syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。1!变量初始化1r忽略空格T返回图3-2四、词法分析程序的C语言程序源

5、代码:#in elude <stdio.h> #in elude <stri ng.h>char prog80,toke n 8,ch;int syn, p,m, n,sum;char *rwtab 6="begi n","if',"the n","while","do","e nd" sca ner();main ()P=0;prin tf("n please in put a stri ng(e nd with '#'):/

6、n");doscan f("%c",&ch);progp+=ch;while(ch!='#');p=0;dosca ner();switch(s yn)case 11:printf("( %-10d%5d )n",sum,syn); break;case -1:pri ntf("you have in put a wrong stri ngn"); getch();exit(0);default: printf("( %-10s%5d )n”,token,syn);break;while(s

7、y n!=0);getch();sca ner() sum=0;for(m=0;m<8;m+)toke nm+=NULL;ch=progp+;m=0;while(ch=' ')|(ch='n')ch=progp+;if(ch<='z' )&&(ch>='a')|(ch<='Z') &&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='

8、;Z')&&(ch>='A')|(ch>='0')&&(ch<='9')toke n m+=ch;ch=progp+;p-;sy n=10;for(n=0;n<6;n+)if(strcmp(toke n, rwtab n)=0)syn=n+1;break;else if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') su

9、m=sum*10+ch-'0'ch=progp+;p-;syn=11;else switch(ch) case '<':toke n m+=ch;ch=progp+;if(ch='=')syn=22;toke n m+=ch;elsesyn=20;p-;break;case '>':toke n m+=ch; ch=progp+; if(ch='=')syn=24;toke n m+=ch; else syn=23;P-; break;case '+': toke n m+=ch; ch

10、=progp+; if(ch='+') syn=17;toke n m+=ch; else syn=13;p-; break;case '-':toke n m+=ch; ch=progp+; if(ch='-') syn=29;toke n m+=ch; else syn=14;p-; break;case '!':ch=progp+; if(ch='=')syn=21;toke n m+=ch; elsesyn=31;P-; break;case '=':toke n m+=ch; ch=pro

11、gp+; if(ch='=') syn=25;toke n m+=ch; else syn=18;P-; break;case '*': syn=15;toke n m+=ch; break;case '/': syn=16;toke n m+=ch; break;case '(': syn=27;toke n m+=ch; break;case ')': syn=28;toke n m+=ch; break;case '': syn=5;toke n m+=ch; break;case '

12、': syn=6;toke n m+=ch; break;case '': syn=26;toke n m+=ch; break;case '、"': syn=30;toke n m+=ch; break;case '#': syn=0;toke n m+=ch; break;case ':':s yn=17;toke n m+=ch;break;default: syn=-1;break;toke n m+='0:五、结果分析:输入 beg in x:=9: if x>9 then x:=2*x+

13、1/3; end #后经词法分析输出如下序列:(begin 1)(x10)(: 17)(=18)(911)( ; 26)(if2) 如图 5-1 所示:隘0:大三下"'编译原理KIFAFE-I.exe1 10 > 17 13 > 11 26 >2 10 > 23 > 11 >3 10 > 17 18 > 11 15 > 10 13 > 11 lb > 11 26 > 100 >图5-1六、总结:词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第

14、一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。语法分析一、实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分 析。二、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1待分析的简单语言的语法用扩充的BNF表示如下: 程序:=begin语句串end 语句串 :=语句; 语句 语句 := 赋值语句 赋值语句 :=ID :=表达式 表达式 := 项+项 卜 项 项 := 因子*因子 | /因子 因子:=ID | NUM |( 表达式)2.2实验要求说明输入单词串,以“ #”结束,如果是文法正确的句子,则

15、输出成功信息,打印“ success, 否则输出“ error”。例如:输入 begin a:=9; x:=2*3; b:=a+x end #输出 success!输入 x:=a+b*c end #输出 error2.3语法分析程序的酸法思想(1)主程序示意图如图 2-1所示。置初值调用scaner读下一个单词符号调用 lrparser图2-1语法分析主程序示意图(2) 递归下降分析程序示意图如图2-2所示。(3) 语句串分析过程示意图如图2-3所示。图2-2递归下降分析程序示意图(4)statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。调用expression函数出错处

16、理出错处理图2-4 statement语句分析函数示意图 图2-5 expression表达式分析函数示意图#in elude "stdio.h"#i nclude "stri ng.h"char prog100,toke n 8,ch;char *rwtab 6="begi n","if',"the n","while","do","e nd" int syn, p,m, n,sum;int kk;factor();expressi o

17、n();yucu();term();stateme nt();lrparser();sca ner();main ()p=kk=0;prin tf("nplease in put a stri ng (end with '#'): n");do scan f("%c", &ch);progp+=ch;while(ch!='#');p=0;sca ner();lrparser();getch();lrparser()if(syn=1)scaner();/*读下一个单词符号*/yucu();/* 调用 yucu()函数

18、;*/if (syn=6) sca ner();if (sy n=0)&&(kk=O)prin tf("success!n");else if(kk!=1) pri ntf("the stri ng have n't got a 'en d'!n"); kk=1;else prin tf("have n't got a 'begi n'!n");kk=1;return;yucu()statement();/* 调用函数 statement();*/while(sy n=2

19、6)scan er();/*读下一个单词符号 */if(syn !=6)statement();/* 调用函数 statement();*/return;stateme nt() if(sy n=10)scan er();/*读下一个单词符号*/if(sy n=18) sca ner(); expressi on();/*读下一个单词符号*/*调用函数 statement();*/else prin tf("the sing ':=' is wron g!n"); kk=1;else prin tf("wr ong senten ce!n"

20、;); kk=1;return;expressi on() term();while(sy n=13)|(sy n=14) sca ner(); term();return;/*读下一个单词符号*/*调用函数term();*/term() factor();while(sy n=15)|(sy n=16) sca ner(); factor(); return;/*读下一个单词符号*/*调用函数factor。; */factor() if(s yn=10)|(s yn=11) sca ner();else if(syn=27) sca ner();expressi on(); if(sy n=

21、28) sca ner();/*读下一个单词符号*/* 调用函数 statement();*/*读下一个单词符号*/else prin tf("the error on '('n"); kk=1;else prin tf("the expressi on error!n"); kk=1;return;sea ner() sum=0;for(m=0;m<8;m+)toke nm+=NULL;m=0;ch=progp+;while(ch=' ')ch=progp+;if(ch<='z')&&

22、amp;(ch>='a')|(ch<='Z') &&(ch>='A') while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9')toke n m+=ch;ch=progp+;p-;syn=10;toke nm+='0:for(n=0;n<6;n+

23、)if(strcmp(toke n, rwtab n)=0)syn=n+1;break;else if(ch>='0') &&(ch<='9') while(ch>='0') &&(ch<='9') sum=sum*10+ch-'0'ch=progp+; p-;syn=11;else switch(ch) case '<':m=0; ch=progp+; if(ch='>') syn=21;else if(ch=&#

24、39;=') syn=22;else sy n=20;p-;break; case '>':m=0;ch=progp+;if(ch='=')syn=24;else syn=23;P-;break;case ':':m=0;ch=progp+;if(ch='=') syn=18;else syn=17;p-;break;case '+': syn=13; break;case '-': syn=14; break;case '*': syn=15;break;case &

25、#39;/': syn=16;break;case '(': syn=27;break;case ')': syn=28;break;case '=': syn=25;break;case '': syn=26;break;case '#': syn=O;break;default: syn=-1;break;四、结果分析:输入 begin a:=9; x:=2*3; b:=a+x end # 后输出 success!如图 4-1 所示:图4-1输入 x:=a+b*c end # 后输出 error如图4-

26、2所示:图4-2五、总结:通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。递归下降分析的大致流程为:“先判断是否为begin ” 不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end” 不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。语义分析程序#i nclude "stdio.h"#include "string.h"char prog10

27、0,toke n 8,ch;char *rwtab 6="begi n","if","the n","while","do","e nd"int syn ,p,m, n,sum,q;int kk;struct char result18;char ag118;char op18;char ag218; quad20;char *factor();char *expressi on();int yucu();char *term();int stateme nt();int l

28、rparser();char *n ewtemp();sca ner();emit(char *result,char *ag1,char *op,char *ag2);mai n() int j;q=p=kk=0;prin tf("nplease in put a stri ng (end with '#'):");do scan f("%c",&ch);progp+=ch;while(ch!=#);p=0;sca ner();lrparser();if(q>19)printf(" to long sentens

29、e!n");else for (j=0;jvq;j+)pri ntf(”%s = %s %s %snn ",quadj.result1,quadj.ag11,quadj.op1,quadj.ag21);getch();int lrparser() int scha in=O;kk=O;if (syn=1) sca ner();scha in=yucu();if(syn=6) sca ner();if(sy n=O)&&( kk=0)prin tf("Success!n");else if(kk!=1)printf("short

30、of 'end' !n");kk=1;getch();exit(0);else printf("short of 'begin' !n");kk=1;getch();exit(0);return (schai n);int yucu() int scha in=0;schai n=stateme nt();while(sy n=26) sca ner();scha in=stateme nt();return (schai n);int stateme nt() char tt8,eplace8;int scha in=O;if (

31、syn=10) strcpy(tt,toke n);sca ner(); if(sy n=18) sca ner();strcpy(eplace,expressi on(); emit(tt,eplace,"","");scha in=0;else prin tf("short of sig n ':=' !n"); kk=1;getch();exit(0);return (schai n);char *expressi on() char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(

32、12); ep2=(char *)malloc(12);eplace=(char *)malloc(12); tt=(char *)malloc(12); strcpy(eplace,term();while(sy n=13)|(sy n=14) if (sy n=13)strcpy(tt,"+");else strcpy(tt,"-");sca ner();strcpy(ep2,term(); strcpy(tp ,n ewtemp(); emit(tp,eplace,tt,ep2);strcpy(eplace,tp);return (eplace);

33、char *term() char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12);ep2=(char *)malloc(12); eplace=(char *)malloc(12);tt=(char *)malloc(12); strcpy(eplace,factor();while(sy n=15)|(sy n=16) if (sy n=15)strcpy(tt,"*"); else strcpy(tt,"/");sca ner(); strcpy(ep2,factor(); strcpy(tp ,n ewte

34、mp(); emit(tp,eplace,tt,ep2); strcpy(eplace,tp);return (eplace);char *factor() char *fplace;fplace=(char *)malloc(12); strcpy(fplace,"");if(sy n=10) strcpy(fplace,toke n); sca ner();else if(syn=11) itoa(sum,fplace,10); sca ner();else if(syn=27) sca ner(); fplace=expressi on(); if(syn=28) s

35、ca ner();else prin tf("error on ')' !n"); kk=1;getch();exit(O);else prin tf("error on '(' !n");kk=1;getch();exit(O);return (fplace);char *n ewtemp() char *p;char m8;p=(char *)malloc(8);kk+;itoa(kk,m,10);strcpy(p+1,m);p0='t'return(p);sca ner() sum=0;for(m=0;m<8;m+)toke nm+=NULL;m=0;ch=progp+;while(ch=' ')ch=progp+;if(ch<='z')&&(ch>='a')|(ch<='Z')&&(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论