华北电力大学编译实验报告_第1页
华北电力大学编译实验报告_第2页
华北电力大学编译实验报告_第3页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计报告(2012 - 2013 年度第1学期)名称:编译技术课程设计 B题目:词法分析器设计算符优先分析程序设计基于算符优先分析方法的语法制导翻译程序设计院系:计算机系班级:学号: 学生姓名:指导教师:阎蕾,岳燕设计周数:1周成 绩:日期:年月日编译技术课程设计B任务书一、目的与要求1 词法分析器设计的目的与要求1.1词法分析器设计的实验目的本实验是为计算机科学与技术专业、网络工程专业、信息安全专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单

2、词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译 程序打下良好的基础。1.2词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个 单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基 本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或 界符作间隔,则用空白作间隔。单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属

3、性值)。表1-1单词符号及其内部表示单词符号种别编码单词的属性值BEGIN1IF2THEN3ELSE4END5标识符6在名字表中的地址整型常数7十进制整数+8*9*10(11)122 算符优先分析程序设计的目的和要求2.1算符优先分析程序设计的实验目的为将来,本题本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的 理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原 理和技术,设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现 通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。设计

4、、分析编译程序打下良好的基础。2.2算符优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串, 以一个“ # ”结尾),如果输入串是句子则输出“ YES ”,否则输出“ NO ”和错误信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用目给出文法的目的是为了便于对语法分析结果进行验证。(1) 文法 设算符优先文法 G为:EET |TTTF | FFPF | PP (E)|i说明:i为整型常数或者为标识符表示整型变量;使用中T用 *表示。(2) 优先关系表设优先关系表如表1-2所示。表1-2 优先关系表+*t

5、i()#+A哎1<£|*1>1哎KItp>l<1<'>il>>>(1<£|1<1<£|)1>'>#3基于算符优先分析方法的语法制导翻译程序设计的目的和要求3.1基于算符优先分析方法的语法制导翻译程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的 理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原 理和技术,通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语法和语义出发,构造 相应

6、的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。3.2基于算符优先分析方法的语法制导翻译程序设计的实验要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完

7、成相应的语义翻译工作, 这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。4. 上机前的准备为了充分利用上机时间,在进行编译技术上机实验前应做好各种准备工作,具体应包括:(1)复习与上机题目有关的知识,熟悉有关定义、概念和实现算法。(2)设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查。(3)为所编写的程序构思一个运行、调试环境,例如,以什么方式提供输入数据、显示输出数据,如何调用(

8、或启动)编写的程序。制定出程序调试计划和典型输入代码数据。5. 课程设计报告课程设计完成后,按学校给定的格式和要求写出课程设计报告。主要内容完成以下课程设计内容:1完成词法分析器设计,实现输入源程序字符串,每调用一次扫描器,就输出一个以内部形式 表示的单词符号,输出形式为二元式:(种别编码,单词属性)2 完成算符优先分析程序设计,掌握实现通用算符优先分析算法的方法,实现输入终结符号串(即单词符号串,以一个“ #”结尾),如果输入串是句子则输出“ YES,否则输出“ NC”和错 误信息。3完成基于算符优先分析方法的语法制导翻译程序设计,实现输入是终结符号串(即单词符号串,以一个“ #”结尾),如

9、果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。三、进度计划序号设计内容完成时间备注1查阅资料,编译器各部分概要设计一天2词法分析器设计一天3算符优先分析程序设计一天4基于算符优先分析方法的语法制导翻译程序设计一天半5验收交实验报告半天已完成的学生验收交实验报告四、设计成果要求1按进度计划和自己的能力完成课程设计内容要求,包括程序框图、源程序、调试步骤、调试方法、对运行结果的分析等。2 总结整个课程设计,撰写出课程设计报告。五、考核方式1程序调试完成后,由指导教师在计算机上检查,验收课程设计成果,并现场答辩。2 评阅课程设计报告。(签字)学生姓名:指导教师:年 月 日实验一词法

10、分析器的设计与实现一、课程设计(综合实验)的目的与要求1.1词法分析器设计的实验目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的 理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和 技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调 试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。1.2词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序

11、设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间 隔,则用空白作间隔。单词符号及其内部表示如表 1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。表1-1单词符号及其内部表示单词符号种别编码单词的属性值BEGIN1一IF2一THEN3一ELSE4一END5一标识符6在名字表中的地整型常数7址+8十进制整数*9*10(11)12一、设计(实验)正文1词法分析器流程图2词法分析器设计程序代码/ first.cpp :定义控制台应用

12、程序的入口点。/#in elude"stdafx.h"#in elude <iostream>#in elude<stri ng>using namespace std ; int what (char a)if ( int (a)>=48)&&( int (a)<=57)return 0; / 0 - 9 数字elseif ( int (a)>=97)&&( int (a)<=122)return 1; a-z 的字母else return 2; /其他的标点符号void scan(char

13、a, int & m, char zc100100, int &n) char zh100;int b=0, weizhi , r =0;int zbbmj/ 检测整形常数while (a m='')cout <<"遇到空格"<<endl ;n+;if (what( a m)=0)while (what( a m)=0)b=b*10+int (an)-48;m+;zbbm=7;cout <<"(" <<zbbm<<"," <<b&l

14、t;<")" <<endl ;else/ 检测字符型if (what( a m)=1)if (am='b' )&&(a m+1= 'e' )&&(a m+2='g' )&&( a m+3='i' )&&(am+4='n' )&&(what (a m+ 5)=2)m=m+5;zbbm=1;cout <<"(" <<zbbm<<",-)&

15、quot;<<endl ;/=检测 beginelseif ( a m='i')&&( a m+1= f )&&( what( a m+ 2)=2)m=n+2;zbbm=2;cout <<"(" <<zbbnK<",-)" <<endl ;/检测ifelseif ( a m='t' )&&(a m+1='h' )&&(a m+2='e' )&&( a叶3=&#

16、39;n' )&&(what( a m+4)=2)n=n+4;zbbm=3;cout <<"(" <<zbbm<<",-)"<<endl ;/ 检测 thenelseif(am='e' )&&(a m+ 1=T )&&(am+2= 's' )&&( a m+ 3= 'e' )&&(what( am+4)=2)m=m+4;zbbm=4;cout <<"(

17、" <<zbbm«",-)"<<endl ;/ 检测 elseelseif (am='e' )&&(a m+1='n' )&&(a m+2='d' )&&(what(a叶3)=2)m=m+3;zbbm=5;cout <<"(" <<zbbm<<",-)"<<endl ; /检测end/ 对未知字符的检测elseint j =0;while (what

18、( a m)!=2)zhj =a m;m+;j +;zhj=# ;if (n=0)j =0;while (zhj != # )zc0 j=zhj;j +;zc0 j = '#'n=1;weizhi =1;elseif (n>0)int k=0, y=1;while ( k<n)&&(y=1)r=0;while (zc k r!= '#') r+;if (r!=j)k+; y=1;elseif (r=j )r =0;while ( int (zc k r )= int (zhr)&&( r<j )r+;if (r=

19、j) weizhi =k+1; y=0;elsek+; y=1;if (y=1)j=0;while (zh j != # )zc n j =zhj ;j+;zc nj=# ;n=n+1; weizhi =n;zbbm=6; /怎么输出地址cout <<"(" <<zbbm<<"," <<weizhi <<")" <<endl ;elseif (what( a m)=2)if (am='+')zbbm=8;m+;cout <<"

20、(" <<zbbm<<",-)"<<endl ;/检测+elseif (a m='(')zbbm=11;m+;cout <<"(" <<zbbm<<",-)"<<endl ;/检测(elseif ( a m=')')zbbm=12;m+;cout <<"(" <<zbbm«",-)"<<endl ;检测)elseif (am=

21、 '*')if (am+1='*')zbbm=10;m+=2;elsezbbm=9;m+;cout <<"(" <<zbbm<<",-)"<<endl ;int main()char zc100100; int n=0;cout <<"begin1"<<endl ;cout <<"if -2"<<endl ;cout <<"then3"<<end

22、l ;cout <<"else-_4"<<endl ;cout <<"end 5"<<endl ;cout <<"标志符-6"<<endl ;cout <<"整型常数-7"<<e ndlcout <<"+-8"<<endl ;cout <<"*9"<<endl ;cout <<"*-10"<<

23、;endl ;cout <<"(-11"<<endl ;cout <<")-12"<<endl ;=<endl ;cout <<"=: cout <<endl ;int m=0;char a100;cout <<"请输入测试语句:"cin . getline ( a,100, 'n');cout <<"输出格式为:(种别编码,单词的属性值 )"<<endl ; while (a

24、m!= '#')sean( a, m, zc, n); return 0;3.词法分析器运行结果zhir实验二算符优先分析的设计与实现一、课程设计(综合实验)的目的与要求2.1算符优先分析程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习编译技术课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术,设计、编写和调试算符优先分析程序,了解算符优先分析程序的组 成结构,掌握实现通用算符优先分析算法的方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。2.2算符

25、优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法, 该语法分析程序的输入是终结符号串 (即单词 符号串,以一个“ # ”结尾),如果输入串是句子则输出“ YES ”,否则输出“ NO ”和错误 信息。算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。(1) 文法 设算符优先文法 G为:EET |TTTF | FFPF |PP (E)|i说明:i为整型常数或者为标识符表示整型变量;使用中T用*表示。(2) 优先关系表 设优先关系表如表1-2所示。表1-2优先关系表+*ti()#+l>'*

26、I>'t<1I>'i*1>'I>'()*1>'I>'#<1工、设计(实验)正文1 .算符优先分析流程图2.程序代码II third.cpp :定义控制台应用程序的入口点。/#in clude"stdafx.h"#in clude<iostream>#in clude"malloc.h"using namespace stdstructLcharchar char_ch ;struct Lchar * next ;LLchar ,* p,* h,*

27、temp,* top ,* base;int table 77=1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,001,1,-1,-1,-1,-1,-1,-1,0,1,1,1,0,0,1,1,-1,其它为表示出-1,-1,-1,-1,-1,0,-1;/存储算符优先关系表,大于为,小于或等于为 char curchar ;char curcmp;int i , j ;int k;int push( char pchar)/* 入栈函数 */temp=(Lchar *) malloc (sizeof (LLchar); /*分配动

28、态内存,返回一个指向内存首地址的指针temp-> char_ch =pchar;temp-> next =top ;top =temp;return 0;int pop() /*出栈函数*/if (top -> char_ch != '#')top =top -> next;return 0;int change(char ch) /*将字符转为数字,以得到算符优先值*/int t;switch (ch)case '+' : t =0; break ;case '*' : t =1; break ;case T : t =

29、2; break ;case 'i': t =3; break ;case '(' : t =4; break ;case ')' : t =5; break ;case '#' : t =6;return t ;int fenxi ()int right =0;k=1;for (;) /*无条件的循环curchar =h->char_ch ;temp=top ;for (;)if (temp-> char_ch ='N')temp=temp->next ;k+;elsecurcmp=temp-&

30、gt; char_ch ; break;cout <<endl <<table i j <<"" <<"" temp=top ;for (;)/* 打印栈 */cout <<temp-> char_ch ;if (temp-> char_ch ='#')break;elsetemp=temp->next ;cout <<""temp=h;for (;)/*打印待比较的字符*/cout <<temp-> char_

31、ch ;if (temp-> char_ch ='#')break;elsetemp=temp-> next ;i =cha nge (curcmp);j =change(curchar );if (table i j =0)/* 算符优先值为空 */cout <<endl <<"错误"<<""<<table i j <<" " <<" " <<curcmp<<""<

32、<curchar ;right =0; break ;else/*算符优先值不为空*/if (table i j <0)/*算符优先值为-1,移进*/if (curchar ='#' )/*待比较字符为空*/if ( k=2)/*当前比较字符在栈的位置为两个元素*/break ;elsecout <<endl <<"错误"<<""<<table i j <<"” <<" "<<curcmp<<"

33、; " <<curchar ;right =0;break ;push( curchar );k=1;curcmp=curchar ;h=h-> next ;else/*算符优先值为,归约*/if (curcmp ='i')pop(); else pop();pop(); pop();push('N');/*当前比较为i,出栈一次*/*当前比较不为i,出栈三次*/*归约到N*/k=1;return 0;int main(void )char ch;int right =1;base=(Lchar *) malloc (sizeof (

34、LLchar);base-next =NULLbase->char_ch ='#'top =base;h=( Lchar *) malloc (sizeof (LLchar);h-> next =NULLp=h;cout<<"输入待比较字符串,以'#'结束"<<endl ;do/*输入待比较字符串,以 #结束*/cin >>ch;if (ch='i'| ch='+' | ch='*' | ch='|'| ch='('

35、 | ch=')' | ch=# ) /* 用temp保存运算符,并使h指向temp,即保存运算符的位置temp=( Lchar *) malloc (sizeof ( LLchar);temp- >n ext =NULLtemp-> char_ch =ch;h-> next =temp;h=h-> next;elsecout <<"输入错误,请重新输入,以#结束"<<e ndl;while (ch!= # );/*输入待比较字符串,以 '#'结束*/p=p-> next; /*P指向待比较的字符串h=p;fenxi ();/*开始识别*/if (right )cout <<endl <<"YES"<<endl ;elsecout <<endl

温馨提示

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

评论

0/150

提交评论