编译原理词法分析器语法分析器实验报告_第1页
编译原理词法分析器语法分析器实验报告_第2页
编译原理词法分析器语法分析器实验报告_第3页
编译原理词法分析器语法分析器实验报告_第4页
编译原理词法分析器语法分析器实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业编译技术 班 级 网络 0802 学 号 52姓 名 叶晨舟指导老师 朱 玉 全 2011年 7 月 4 日一、目的编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:词法分析器 产生下述小语言的单词序列这个小语言的所有的单词符号,以及

2、它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值DIMIFDOSTOPEND标识符常数(整)=+*,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR-内部字符串标准二进形式-对于这个小语言,有几点重要的限制:首先,所有的关键字(如IFWHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不

3、专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IF i0 i= 1;而绝对不要写成 IFi0 i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图: 语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的算术表达式,其文法如下:EE+T|E-T|TTT*F|T/

4、F|FFPF|Pp(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。中间代码生成器 产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图。1、词法分析器的流程图2、语法分析器主程序图3、中间代码生成器流程图:四、源程序词法分析器:#include#include#includeusing namespace std;typedef struct table ,S1)=0|strcmp(Mpq.m,S2)=0) ; printf(%15c-%sn,X,str0); ; getchar(); opt3: p

5、rintf(请输入要分析的字符串,且以#结束:n); analyse(Vn, Vt); printf(*请选择*n); printf( 1: 输入字符串 n); printf( 2: 输入新分析表 n); printf( 0: 退 出 n); printf(*n);opt4:cinselect; switch(select) case 1: goto opt3;break; case 2: goto opt2; case 0: break; default: printf(输入错误!请重新选择:); goto opt4; break; return 0;运行结果:语法分析器 源程序:#incl

6、ude#includeusing namespace std;char prog100,token10;char ch;int syn,p,m=0,n,row,sum=0;char *rwtab20=dim,if,do,stop,end ,and,begin,bool,case,char,false,for,int,not,or,set,then,true,until,while; void scaner()for(n=0;n=a&ch=A&ch=0&ch=a&ch=A&ch=Z)tokenm+=ch;ch=progp+;tokenm+=0;p-;syn=21;for(n=0;n=0&ch=0

7、&ch32767)syn=-1;else switch(ch) case=:syn=8+15;token0=ch;break;case+:syn=9+15;token0=ch;break;case*:m=0;tokenm+=ch;ch=progp+;if(ch=*)syn=11+15; tokenm+=ch;elsesyn=10+15;p-; break;case,:syn=12+15;token0=ch;break;case(:syn=13+15;token0=ch;break;case):syn=14+15;token0=ch;break;case#:syn=0;token0=ch;bre

8、ak;case)syn=17+15;tokenm+=ch;else if(ch=)syn=16+15;tokenm+=ch;elsesyn=15+15;p-;break;case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=19+15;tokenm+=ch;elsesyn=18+15;p-;break;case:m=0;tokenm+=ch;ch=progp+;if(ch=)syn=21+15;tokenm+=ch;elsesyn=20+15;p-;break;case/:syn=22+15;token0=ch;break;case-:syn=23+15;token

9、0=ch;break;case;:syn=24+15;token0=ch;break;default: syn=-1;break;void main()p=0;row=1;coutendlendlendl;cout*小型词法分析器*endlendl;cout请输入一段程序(以#结束):;do(ch);progp+=ch;while(ch!=#);p=0;coutendl*词法分析结果如下*endl;cout 种别编码 自身值endl;doscaner();switch(syn)case 22 : cout (syn , sum)endl; break; case -1: cout Error

10、in rowrow!endl; break; default: cout (syn , token)endl;break;while (syn!=0);运行结果:中间代码生成器源程序:表达式生成四元式递归子程序法#include#include using namespace std;#define DEFAULT_SIZE 100char EMachine(char w); endl; exit(1); void stack:push(const string &item) endl; return; top+; stackatop=item;string stack:pop(void) e

11、ndl; exit(1) ; string item=stackatop; top-; return item;string stack:gettop(void) const endl; exit(1) ; return stackatop;static stack wordStack; /符号栈static int noOfQuet=0; /静态四元式个数记录static int noOfT = 1; /静态状态个数记录void main() /主函数char yesOrNo; /进行一个循环操作控制docout请输入算术表达式:endl;noOfT = 1; /每次结束询问ZMachine

12、();coutendlyesOrNo; /输入“Y”则继续while(yesOrNo=y); /否则程序结束bool ZMachine() /Z自动机char w;cinw;w = EMachine(w); /调用E自动机if(w=#) /遇到“#”则结束return true;elsereturn false;char EMachine(char w) /E自动机string operate,a,b,c;string state5;w = TMachine(w); /调用T自动机while(w=+|w=-) /是加或减符号operate = w;cinw; /读入下一字符w = TMachi

13、ne(w); /调用T自动机b = (); /字符栈弹出a = (); /两个操作字符cout(operate,a,b,tnoOfT)w; /读取下一字符w = FMachine(w); /调用F自动机b = (); /符号栈弹出a = (); /两个操作字符 cout(operate,a,b,tnoOfT)=a&w=A&ww; /则读取下一字符w = EMachine(w); /调用E自动机if(w!=) /不是右括号则输入有误,报错cerrthe input is wrong!endl;exit(0);else /否则有误,报错cerrthe input is wrong!w; /读取下一字符return w;string intToString(int a) /整形变字符串形函数string d;char b=0,c;int i;while(a!=0)i = a%10;a = a/10;c = (int)b + i;d = c + d;return

温馨提示

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

评论

0/150

提交评论