武汉理工大学编译原理课设
武汉理工大学-编译原理课程设计-中国好学长系列之小灰灰的爸爸
学号:课程设计题目布尔表达式翻译为逆波兰式的算法实现学院计算机科学与技术学院专业软件工程班级中国好学长系列姓名小灰灰的爸爸指导教师何九周2014 年 1 月 2 日目录课程设计任务书......................................................................... 错误!未定义书签。
1引言. (2)2概述 (3)2.1设计题目 (3)2.2设计目的 (3)2.3设计任务内容 (3)3设计环境与工具 (4)4设计原则 (4)4.1基本方法 (4)4.2属性文法 (4)5简要的分析与概要设计 (4)6详细的算法描述,框图 (5)6.1主要数据结构的设计 (5)6.2全局变量设计 (7)6.3递归下降得到推导过程 (7)6.4递归下降得到四元式序列 (11)6.5分析四元式序列生成逆波兰式 (14)7软件的测试方法和测试结果 (16)8设计的特点、不足收获与体会 (16)8.1设计的特点 (16)8.2设计的不足 (16)8.3收获与体会 (16)9参考文献 (16)附录:本科生课程设计成绩评定表课程设计任务书学生姓名:专业班级:指导教师:何九周工作单位:计算机科学与技术学院题目: 布尔表达式翻译为逆波兰式的算法实现初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
严格要求自己,要独立思考,按时、独立完成课程设计任务。
2.主要功能包括:利用LR分析法编制、调试其语法及语义分析程序,生成的中间代码为逆波兰式。
武汉理工大学-编译原理实验报告-中国好学长系列之小灰灰的爸爸
学生学号实验课成绩武汉理工大学学生实验报告书实验课程名称《编译原理》开课学院计算机科学与技术学院指导老师姓名何九周学生姓名小灰灰的爸爸学生专业班级中国好学长系列2013 —2014 学年第一学期实验课程名称:编译原理实验项目名称单词的词法分析器的设计实验成绩实验者专业班级组别同组者实验日期年月日第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)1.实验目的:设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。
2.实验要求要求:在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写;上机时应随带有关的高级语言教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。
3.实验报告的内容(1)实验题目、班级、学号、姓名、完成日期;(2)待分析的某种语言子集的词法描述;(3)词法分析程序的功能;(4)详细的算法描述;(5)程序清单;(6)运行结果(给3组典型输入数据进行测试);(7)收获与体会。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)1.待分析的简单语言的词法:(1)关键字:bengin if then while do end所有的关键字都是小写。
(2)运算符和界符::= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标志符(ID)和整形常数(NUM),通过以下正规式定义:ID=letter(letter|digit)* NUM=digit digit*(4)空格空白、制表符和换行符组成。
空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
2.各种单词符号对应的种别码单词符号种别码单词符号种别码begin 1 :17if 2 := 18then 3 < 20while 4 <> 21do 5 <= 22end 6 > 23 Letter(letter|digit) 10 >= 24digit digit * 11 = 25 + 13 ; 26- 14 ( 27* 15 ) 28/ 16 # 03.实验源代码如下:#include<stdio.h>#include<string.h>char prog[80],token[6];char ch;int syn,p,m,n,sum;char * rwtab[6]={"begin","if","then","while","do","end"};main(){p=0;printf("\nplease intput string:");do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case 11:printf("(%d,%d)\n",syn,sum);break;case -1:printf("input error\n"); break;default:printf("(%d,%s)\n",syn,token);}}while(syn!=0);getch();}scaner(){for(n=0;n<8;n++)token[n]=NULL;m=0;ch=prog[p++];while(ch==' ')ch=prog[p++];if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')){while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0')) {token[m++]=ch;ch=prog[p++];}token[m++]='\0';ch=prog[--p];syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch<='9'&&ch>='0')){sum=0;while((ch<='9'&&ch>='0')){sum=sum*10+ch-'0';ch=prog[p++];}ch=prog[--p];syn=11;}elseswitch(ch){case '<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}elseif(ch=='='){syn=22;token[m++]=ch;}else{syn=20;ch=prog[--p];}break;case '>':token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=23;ch=prog[--p];}break;case ':':token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;ch=prog[--p];}break;case '+':syn=13;token[0]=ch;break; case '-':syn=14;token[0]=ch;break; case '*':syn=15;token[0]=ch;break; case '/':syn=16;token[0]=ch;break;case ':=':syn=18;token[0]=ch;break;case '<>':syn=21;token[0]=ch;break;case '<=':syn=22;token[0]=ch;break;case '>=':syn=24;token[0]=ch;break;case '=':syn=25;token[0]=ch;break;case ';':syn=26;token[0]=ch;break;case '(':syn=27;token[0]=ch;break;case ')':syn=28;token[0]=ch;break;case '#':syn=0;token[0]=ch;break;default:syn=-1;}}三、主要仪器设备及耗材PC机一台,Miscrosoft VisualC++6.0第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)按照要求编写完代码之后,首先检查一下有没有错误语法错误,然后编译连接运行,输入所给文法的源程序字符串,经此法分析之后,程序就会输出如下结果所示的二元组构成的序列:二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)(1)输入字符串begin x:=9; if x>0 then x:= 2*x+1/3; end #其结果如下图所示(2)输入字符串hello#其输出结果如下图所示:(3)输入字符串if x>2; y=3; end #其结果如下图所示:三.实验小结、建议及体会词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用以语法分析,执行词法分析的程序成为词法分析程序或扫描程序。
编译原理课设_王远
课程设计题目二---十进制的语法分析及语义分析程序设计学院计算机科学与技术学院专业软件工程班级软件zy1201班姓名王远指导教师饶文碧2015 年 1 月14 日课程设计任务书学生姓名:王远专业班级:软件zy1201班指导教师:饶文碧工作单位:计算机科学与技术学院题目:二---十进制的语法分析及语义分析程序设计1.目的通过设计、编制、调试语法及语义分析程序,加深对语法及语义分析原理的理解。
2.设计内容及要求(1)学号19-22的同学按顺序分别选择递归下降法、LL(1)、算符优先分析法(或简单优先法)、LR法完成以上任务。
(2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
指导老师签名:年月日目录1.系统描述 (1)1.1目的 (1)1.2设计内容 (1)1.3文法和翻译 (1)2.词法分析 (2)3.语法分析 (2)3.1递归子程序法概述 (2)3.1.1构造递归子程序的方法 (3)3.1.2非终结符对应的子程序 (4)4.属性文法 (7)4.1 文法和属性文法的描述 (7)5.词法、语法错误检测和处理 (7)6.用例分析 (8)7.个人总结 (9)8.源代码 (10)9. 参考文献 (15)二---十进制的语法分析及语义分析程序设计——递归下降法1. 系统描述1.1目的通过设计、编制、调试语法及语义分析程序,加深对语法及语义分析原理的理解。
并实现词法分析程序对单词序列的词法检查和分析。
1.2设计内容(1)选择递归下降法进行语法分析和语义分析(2)写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
1.3文法和翻译正整数二进制自然数的正规式为: B =0 | (0|1)*正整数十进制自然数的正规式为:D =0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*正小数二进制的正规式为:C=(0 | 1) . (0 | 1)*正小数十进制的正规式为:E=(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*.(0|1|2|3|4|5|6|7|8|9)*二…十进制自然数的文法G[E]如下:表 1.3.1 文法表产生式语法制导翻译方法E S →(.)print S val12.S L L →2.12.../2L length S val L val L val =+S L →..S val L val =L OR → ..,.1.L val R val L length R length ==+1L R →..1*2.,.1.R length L val R val L length R length =+=+1R OR → 11..,.1.R val R val R length R length ==+11R R →1.111.1*2.,.1.R length R val R val R length R length =+=+R ε→.1,.0R val R length ==2. 词法分析词法分析是计算机科学中将字符序列转换为单词(Token )序列的过程。
编译原理课程设计++++do-while+循环语句的实现-武汉理工
DO-WHILE循环语句的翻译程序设计-——(LR方法、输出四元式)1、系统描述通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
用语法制导完成语义分析,并将形成的中间代码以四元式的形式输出。
2 、文法及属性文法的描述2.1 文法的描述该文法的产生式集合如下所示:Z->do{E}while(T)E->AEE->AA->b op AA->b;T->b op1 b其中do、while、( 、) 、{ 、} 、op、op1 、;和b均为终结符,而Z、A、T、E这些大写字母均为非终结符。
op1表示比较运算符,op表示算术运算符,b表示合法标识符。
2.2 属性文法的描述对该文法的属性文法描述如下:Z->do{E}while(T) prinf(if T goto E else goto next)E->AE print(E.val = A.val·E.val)E->A print(E.val = A.val)A->b op A print(A= b.Val op A.Val)A->b; A.Val = b;T->b op1 b print(T= b1.Val op1 b2.Val)3 、语法分析方法描述及语法分析表设计3.1语法分析表设计LR分析表如下:3.2 LR分析方法描述说明LR分析法的规约过程是规范推到的逆过程,所以LR分析过程是一种规范规约的过程。
其分析过程为:由文法构造出该文法项目集,再根据项目集构造该文法的DFA,再判断是否有移进-规约和规约-规约冲突,若没有冲突则该文法为LR(0)的,若有冲突则该文法是SLR (1)的,最后可以构造出LR(0)分析表。
然后根据LR(0)分析表进行语法分析,分析过程就是进栈和规约的过程。
编译原理课程设计内容
编译原理课程设计内容一、教学目标本节课的教学目标是使学生掌握编译原理的基本概念和基本方法,能够理解源程序的词法分析、语法分析和语义分析等过程,并能够运用这些知识对简单的程序进行编译。
通过本节课的学习,学生应达到以下具体目标:1.知识目标:了解编译原理的基本概念、编译过程和编译器的基本结构;掌握源程序的词法分析、语法分析和语义分析的基本方法。
2.技能目标:能够运用编译原理的基本知识对简单的程序进行编译;能够使用至少一种编译器进行程序设计。
3.情感态度价值观目标:培养学生对计算机科学和编程的兴趣和热情,提高学生分析问题和解决问题的能力。
二、教学内容本节课的教学内容主要包括以下几个部分:1.编译原理的基本概念和编译过程;2.源程序的词法分析、语法分析和语义分析的基本方法;3.编译器的基本结构和工作原理;4.简单程序的编译实例。
三、教学方法为了达到本节课的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解编译原理的基本概念、编译过程和编译器的基本结构,使学生掌握相关知识。
2.案例分析法:通过分析具体程序的编译过程,使学生理解和掌握词法分析、语法分析和语义分析的方法。
3.实验法:让学生亲自使用编译器进行程序设计,提高学生的实际操作能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《编译原理》;2.参考书:相关编译原理的专著和论文;3.多媒体资料:关于编译原理的PPT、视频等;4.实验设备:计算机和编译器。
五、教学评估为了全面、公正地评估学生在编译原理课程中的学习成果,将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度;2.作业:布置与课程内容相关的编程作业,评估学生的实际操作能力和对知识的掌握程度;3.考试:进行期中考试和期末考试,评估学生对课程知识的全面理解和运用能力。
六、教学安排本学期的编译原理课程安排如下:1.教学进度:按照教材《编译原理》的章节顺序进行教学,确保每个章节都有足够的时间进行讲解和讨论;2.教学时间:每周两节课,每节课45分钟,共计18周;3.教学地点:计算机实验室,以便学生进行实验和实践。
武汉理工大学编译原理实验报告
武汉理工大学学生实验报告书实验课程名称编译原理开课学院计算机科学与技术学院指导老师姓名饶文碧学生姓名学生专业班级软件zy13022015—2016学年第1 学期实验课程名称:编译原理的问题等)在扫描源程序字符串时,旦识别出关键字、分隔符、标识符、无符号常数中之一即以单词形式,类单词均采用相同的结构,即二元式编码形式输出。
每次调用词法分析程序它均能自动继续扫描下去形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)(1)程序输入:程序输出:(2)程序输入:程序输出:三、实验小结、建议及体会通过这次实验,我加深了对词法分析原理的理解。
对上课学到的抽象知识有了一个实践的练习,对我的学习非常有帮助。
词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用以语法分析,执行词法分析的程序成为词法分析程序或扫描程序。
本次实验就是要做一个这样的程序。
在之后的编译实验中要以本次实验为基础展开,我会继续努力的!实验课程名称:编译原理第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)编写完代码之后,首先检查一下有没有简单的语法错误登,然后编译连接运行,输入源程序,输入正确则会输出success;否则输出error,并给出适当的提示错误。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)(1)(2)三、实验小结、建议及体会通过这次实验,我加深了对语法分析原理的理解。
语法分析是编译过程的第二个阶段。
语法分析的任务是识别单词符号是否符合给定的语法规则。
语法分析所依据的是语言的语法规则,即描述程序结构的规则。
通过语法分析确定输入串是否构成一个语法上正确的程序。
本次实验基本上实现了语法分析的功能,验证了输入符号串是否是语法正确的。
编译原理的课课程设计
编译原理的课课程设计一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、理论和方法,能够运用编译原理解决实际问题。
具体分为以下三个部分:1.知识目标:学生需要掌握编译原理的基本概念,包括编译器的基本结构、词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化等。
2.技能目标:学生需要具备使用编译原理解决实际问题的能力,包括能够使用编译器开发工具,进行词法分析、语法分析和语义分析等操作。
3.情感态度价值观目标:通过本课程的学习,使学生认识到编译原理在软件工程中的重要性,增强学生对计算机科学的热爱和责任感。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译器的基本结构:包括前端和后端的基本组成部分,以及它们之间的交互关系。
2.词法分析:包括词法规则的定义、词法分析器的实现和词法分析的过程。
3.语法分析:包括语法规则的定义、语法分析树的构建和语法分析的方法。
4.语义分析:包括语义规则的定义、语义分析的方法和语义分析的实现。
5.中间代码生成:包括中间代码的定义、中间代码生成的方法和中间代码优化的方法。
6.目标代码生成:包括目标代码的定义、目标代码生成的方法和目标代码优化的方法。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:教师通过讲解编译原理的基本概念和理论,使学生掌握相关知识。
2.案例分析法:教师通过分析实际的编译器案例,使学生了解编译原理在实际中的应用。
3.实验法:学生通过动手实现编译器的基本功能,加深对编译原理的理解。
4.讨论法:学生通过分组讨论,共同解决问题,培养团队协作能力。
四、教学资源本课程的教学资源包括以下几个部分:1.教材:选用《编译原理》作为主要教材,为学生提供系统性的理论知识。
2.参考书:提供相关的参考书籍,为学生提供更多的学习资源。
3.多媒体资料:制作PPT、视频等多媒体资料,丰富课堂教学。
4.实验设备:提供计算机实验室,让学生能够实际操作编译器。
《编译原理》课程设计教学大纲
《编译原理》课程设计教学大纲揭金良2006.10.201 目的通过课程设计,将《编译原理》的相关理论和技术运用到软件开发中,提高学生的应用程序设计能力,提高分析问题、解决问题的能力。
2 内容利用编译原理的某种思想或方法,设计一个应用程序,实现的具体内容自拟(见下面的选题指导)。
3 要求进行简单的需求分析、设计说明,写出程序结构框架,阐明设计思路、用到的原理和方法。
程序规模适中,着重于内核功能。
4 估计时间总共时间2.5周(150学时),其中:1.讲课2学时;2.上机48学时调试;3.其余非上机时间由同学自行安排分析、检查问题、绘制流程图、写相关文档,最后集成设计(实验)报告并自行打印。
5 过程指导5.1 选题通过平时积累,找到适合于自己的应用或某种软件功能,该应用能利用编译原理中的某些理论。
题目大小适中。
参考题目如下:1 表达式计算器表达式计算器:这是一款算术表达式计算程序,通过输入表达式达到计算的目的,可代替目前普遍使用的计算器。
使用了编译原理中的词法分析、算符优先分析等。
根据功能的不同可分为:⑴无符号整数表达式计算器:输入无符号整数表达式,输出结果。
难度:较难。
工作量:中等。
⏹整数表达式计算器:考虑负数。
难度:较难。
工作量:中等。
⏹定点实数表达式计算器:难度:较难。
工作量:中等。
⏹通用表达式计算器:考虑1.23e-2的形式输入。
难度:难。
工作量:中等。
⑵函数表达式计算程序:这是一款能计算函数值的实用程序,输入含有自变量x的函数表达式被接受后,可接着输入自变量x的值,输出函数值y的值。
使用了词法分析、算符优先分析。
根据功能的不同可以分为:⏹多项式函数计算程序:只处理多项式函数,如f(x)=x^3+x^2+5等。
难度:较难。
也可设计成其他专用函数计算程序,如幂函数计算、三角函数计算等。
但要避免出现不同用,如不要设计成仅能处理f(x)=2^x的幂函数,因为这样的函数利用普通编程就能实现,无法体现编译原理。
武汉理工大学教学日历
6
3
§2.3程序语言及其语法描述
a.上下文无关文法;
2
§2练习3,4题
4
b.文法和语言的形式定义;c.文法的类型;
2
7
5
d.语法树和二义性;f.句型的分析
2
§2练习6,7,8,10题6§3词源自分析§3.1词法分析器的设计2
8
7
§3.2单词描述工具§3.3确定有限自动机和非确定有限自动机
2
8
§3.4正规式与有限自动机的等价性
§6.1属性文法;
2
§6练习1,3题
周次
课次
讲课内容
学时
实验、习题、
大作业内容
学时
附:必读与参考书
13
17
§6.2基于属性文法的处理
a.属性计算方法b.抽象语法树
2
18
§7语义分析和中间代码产生
§7.1中间语言;§7.2说明语句
2
§7练习1,3,4,5,7,9,11题
上机实验2:表达式的翻译程序设计
武汉理工大学教学日历
课程:编译原理
班级:计算机0305—09班
教学周数:12周(5-16周)
周次
课次
讲课内容
学时
实验、习题、
大作业内容
学时
附:必读与参考书
5
1
§1引论
2
1.教材:
编译原理
陈火旺著
国防版
2.参考书:
a.编译原理
吕映芝著
清华大学版
b.编译程序构造
何炎祥著
华中科大版
c.编译原理与实现
金成植著
任课教师:2005年8月20日教研室主任:2005年8月22日
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)1 需求说明或问题描述1.1 问题描述对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。
1.2 需求说明1 写出符合给定的语法分析方法的文法及属性文法2 完成题目要求的中间代码四元式的描述3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计4 设计若干用例,上机通过测试2 文法及语法设计2.1文法及属性文法:文法G=(V N ,V T ,P ,S)其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;}P={S -> w(B){E}E -> CC -> CAC -> AA -> iPAA -> i;P -> +|-|*|/B -> iTiB-> iT -> >|<|>=|<=|==}2.2 语法分析方法描述及语法分析表设计2.2.1 语法分析方法描述:简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。
基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S,步骤如下:(1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。
(2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1<a k为止。
(3)由句柄a k...a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。
(4)重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。
编译原理》课程设计
编译原理》课程设计一、教学目标本课程旨在让学生了解编译原理的基本概念、方法和技巧,掌握源程序转换为目标程序的基本过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。
通过本课程的学习,学生应能理解并应用编译原理的基本知识解决实际问题,培养分析问题和解决问题的能力。
具体的教学目标如下:1.知识目标:(1)了解编译原理的基本概念和任务。
(2)掌握源程序转换为目标程序的基本过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
(3)熟悉各种编译器设计和实现技术。
2.技能目标:(1)能够使用编译原理的基本方法分析并解决实际问题。
(2)具备编写简单编译器的能力。
3.情感态度价值观目标:(1)培养学生对编译原理的兴趣,认识到编译原理在计算机科学中的重要性。
(2)培养学生团队合作、创新和持续学习的精神。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理的基本概念和任务。
2.源程序转换为目标程序的基本过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
3.各种编译器设计和实现技术。
4.编译原理在实际应用中的案例分析。
5.编译原理相关的研究动态和发展趋势。
三、教学方法为了提高教学效果,本课程将采用多种教学方法,包括:1.讲授法:教师讲解编译原理的基本概念、方法和技巧,引导学生掌握知识要点。
2.讨论法:学生针对编译原理中的关键问题进行讨论,培养学生的思考和表达能力。
3.案例分析法:分析编译原理在实际应用中的案例,帮助学生更好地理解编译原理的应用价值。
4.实验法:安排学生进行编译器设计的实验,提高学生的实际操作能力和创新能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《编译原理》,为学生提供系统、全面的学习资料。
2.参考书:提供相关领域的经典著作和最新研究成果,供学生拓展阅读。
3.多媒体资料:制作课件、教学视频等,丰富教学手段,提高教学效果。
编译原理:FOR循环语句的翻译程序设计LL(1)法、输出四元式(附源代码)
学号:课程设计FOR循环语句的翻译程序设计题目(LL(1)法、输出四元式)学院计算机科学与技术专业计算机科学与技术班级计算机0901班姓名指导教师2012 年01 月03 日课程设计任务书学生姓名:专业班级:计算机0901班指导教师:工作单位:计算机科学与技术学院题目: FOR循环语句的翻译程序设计(LL(1)法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2011年11月18日系主任(或责任教师)签名: 2011年11月18日FOR循环语句的翻译程序设计——LL(1)法、输出四元式1.系统描述1.1问题描述用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)〈赋值语句〉的语法及语义分析程序,输出四元式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二---十进制的语法分析及语义分析程序设计----算符优先分析法1.系统描述1.1目的通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
1.2算符优先分析方法原理:算符优先分析方法是根据算符之间的优先关系而设计的一种自下而上的分析方法。
算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。
算符优先分析过程是自下而上的归约过程,所谓的算符优先分析就是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找“可归约串”和进行归约。
该文法必须满足以下条件:文法它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下产生式右部:…QR…;首先求出该文法的优先关系表,在程序中用2维数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。
在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。
数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。
2.翻译方法概述2.1语法分析采用递归下降方法,为对应文法中的每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。
若输入串是给定文法的句子,则从文法的开始符号出发一定能推导出与输入的单词串完全相同的句子。
语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。
语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。
语法分析的主要工作:是识别由词法分析给出的单词序列是否是给定的正确句子(程序)。
语法分析常用的方法:自顶向下的语法分析和自底向上的语法分析两大类。
此次设计中语法分析中主要通过递归下降分析法对语法分析处理过程进行控制,使输出的三地址表示的翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
递归下降法主要采用自顶向下方法,即从文法的开始符号开始进行分析,逐渐推导的往下构造语法树,使其树叶正好构造出所给定的源程序串。
自顶向下方法的关键是确定在推导过程中选择候选式的问题。
当进行推导时,一个非终结符可能对应多个产生式,这样我们就无法事先知道应该用哪个产生式,因此实用都作了一些限制。
以便在任何情况下都能确定应该用的产生式。
自顶向下的主要思想是从开始符出发导出句型并一个符号一个符号地与给定终结符串进行匹配。
如果全部匹配成功,则表示开始符号可推导出给定的终结符串。
因此判定给定终结符号串是正确句子。
在语法分析的同时可由语法分析程序调用相应的语义子程序进行语义处理,完成附加在所使用的产生式上的语义规则描述,并生成四元式的中间代码形式。
2.2语义分析语义分析是编译过程的一个逻辑阶段,语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。
语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。
比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。
如有的编译程序要对实数用作数组下标的情况报告错误。
又比如某些某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。
2.3中间代码生成中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。
为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。
中间代码(语言)是一种特殊结构的语言,编译程序所使用的中间代码有多种形式。
按其结构分常见的有逆波兰式(后缀式)、三地址代码(三元式、四元式)和树形表示(抽象语法树)、DAG 表示。
2.4属性文法对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。
所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。
一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。
本系统中所使用FOR循环语句的文法包括FOR语句本身,赋值表达式和布尔表达式。
3.算法描述首先建立一个符号栈S,既用它寄存终结符,也用它寄存非终结符。
以下给出分析算法,其中k代表符号栈S的深度。
k:=1; S[k]:=’#’;REPEAT把下一个输入符号读进a中;IF S[k]属于firstVT THEN j:= k ELSE j:=k-1;WHILE S[j]>a DOBEGINREPEATQ:=S[j];IF S[j-1] 属于firstVT THEN j:=j-1 ELSE j:=j-2UNTIL S[j]<Q;把S[j+1]…S[k]归约为某个N;K:=j+1;S[k]:=NEND OF WHILE;IF S[j] <a OR S[j]=a THENBEGIN k:=k+1; S[k]:=a ENDELSE ERROR //出错UNTIL a=’#’在这个程序的设计中主要先显示语法分析所需要通道的文法,然后再进行词法分析,词法分析成功后再进行语义分析并生成中间代码,否则就提示语义分析出错并不进行语义分析生成中间代码。
4.文法及属性文法的描述对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。
所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。
一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。
形式上讲,属性文法是一个三元组 :A=(G,V,F),其中:G:是一个上下文无关文法;V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息;F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。
断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
5. 系统的详细设计5.1 文法设计在程序的主界面中首先列出在词法分析中需要用到的几个文法: 直接输入根据已知文法构造的算符优先关系矩阵。
输入已知文法的FIRSTVT和LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。
S → A.A|AA → 0AA → 1AA → 0A → 1确定文法的机内表示形式;确定优先关系矩阵的存放方式。
5.2程序流程图设计5.3 用例分析(1)运行结果:(2)归约成功的图:(3)归约失败的图6.心得体会通过对二---十进制语法分析及语义分析的程序设计(算符优先发),让我加深对语法及语义分析原理的理解,在设计过程中虽然遇到了很多的困难,从一开始设计二进制的文法开始,再到后来设计语法分析程序,都有很多考虑不周的情况。
在编程过程中,我还参考了同学的程序,查阅了很多资料,上网查找了有关材料,才写出了的,所以,这次课程设计也不是那么简单,总的来说,通过此次课程设计,学会了很多东西。
7. 参考文献[1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第2版).清华大学出版社.2005年2月[2]《编译原理》主编:张幸儿.科学出版社 .1999年4月[3]《程序设计语言编译原理》(第3版).陈火旺、刘春林等.国防工业出版社.2003年[4]《编译原理与技术》(第二版)主编:陈意云 .中国科学技术大学出版社.2002年1月8. 源程序清单/****************************************//* 算符优先分析程序*//****************************************/#include <stdio.h>#include <tchar.h>#include <iostream>#include<math.h>#include "malloc.h"void push(char pchar); //入栈函数char pop(void); //出栈函数int CharToInt(char ch); //将字符转为数字,以得到算符优先值void GoBreakTo(); //归约void dosome(void); //开始识别double getValue(); //转化为十进制//存储算符优先关系表,大于为1,小于或等于为-1,其它为0表示出错const int table[4][4] = {{ 0, -1, -1, 1 },{ 1, -1, -1, 1 },{ 1, -1, -1, 1 },{ -1, -1, -1, -1, }};void display(){char sign[4] = { '.', '0', '1', '#' };printf("文法如下:\n");printf("S →A.A|A\nA →0A\nA →1A\nA →0\nA →1\n");printf("*********************************\n");printf(" | . | 0 | 1 | # |\n");printf("*********************************\n");for (int i = 0; i < 4; i++){printf("%c", sign[i]);for (int j = 0; j < 4; j++)if (table[i][j] == 1)printf("| >\t");else if (table[i][j] == -1)printf("| <\t");else printf("| null\t");printf("|\n");}printf("*********************************\n");printf("请输入二进制字符串,以'#'结束\n");printf("例如:10.01#\n");}int right; //设置开关项,当出错时为0struct Lchar{char char_ch;struct Lchar *next;}LLchar, *p, *h, *temp, *top, *base;void main(void){char ch;right = 1;display();//初始化栈顶栈底base = (Lchar*)malloc(sizeof(LLchar));base->next = NULL;base->char_ch = '#';top = base;h = (Lchar*)malloc(sizeof(LLchar));h->next = NULL;p = h;do{ //输入待比较字符串,以'#'结束ch = getchar();putchar(ch);if (ch == '.' ||ch == '0' ||ch == '1' ||ch == '#'){temp = (Lchar*)malloc(sizeof(LLchar));temp->char_ch = ch;temp->next = NULL;p->next = temp;//尾插法建立字符串链表p = temp;}else{printf("\n字符串输入错误,请重新输入字符串:\n");system("pause");return;}} while (ch != '#'); //输入待比较字符串,以'#'结束dosome(); //开始识别if (right){printf("\n%f", getValue());printf("\n归约成功!\n");}elseprintf("\n归约失败!\n");system("pause");}int size_of_array(char a[]){int i = 0, count = 0;while (a[i] != '#'){count++;i++;}return count;}double getValue(){char num[30];int n=0,dot,length;//dot记录小数点的位置double value=0;p = h->next;while (p != NULL){num[n] = p->char_ch;n++;p = p->next;}length = size_of_array(num);n = 0;while (num[n] != '.'&&num[n]!='#')n++;dot = n;if (dot < length){for (n = 0; n < dot; n++)value = value + pow(2, dot - n - 1)*(num[n] - 48);for (n = dot + 1; n < length; n++)value = value + pow(2, dot - n)*(num[n] - 48);}else{for (n = 0; n < length; n++)value = value + pow(2, length - n - 1)*(num[n] - 48);}return value;}void push(char pchar)//入栈{temp = (Lchar*)malloc(sizeof(LLchar));temp->char_ch = pchar;temp->next = top;top = temp;}char pop(void)//出栈{char c;c = top->char_ch;if (top->char_ch != '#')top = top->next;return c;}int CharToInt(char ch) //将字符转为数字,以得到算符优先值{int t;switch (ch){case '.':t = 0; break;case '0':t = 1; break;case '1':t = 2; break;case '#':t = 3;}return t;}void GoBreakTo(){char top_char;char below_top1_char;char below_top2_char;top_char = pop();if (top_char == '0' || top_char == '1'){push('A');}if (top_char == 'A'){below_top1_char = pop();if (below_top1_char == '0' || below_top1_char == '1') push('A');else if (below_top1_char == '#')push('S');else if (below_top1_char == '.'){below_top2_char = pop();if (below_top2_char == 'A')push('S');elseright = 0;}elseright = 0;}}void dosome(void){int i, j, step=0;char current_char; //当前符号char stack_char; //符号栈p = h->next;printf("\n[步骤]\t[符号栈]\t[剩余输入串]\t[移进或归约]\t"); while (1){current_char = p->char_ch;temp = top;if (temp->char_ch == 'S'){break;}while (temp->char_ch == 'A'){temp = temp->next;}stack_char = temp->char_ch;i = CharToInt(stack_char);j = CharToInt(current_char);printf("\n%d\t", ++step);temp = top; //打印栈while (1){printf("%c", temp->char_ch);if (temp->char_ch == '#')break;temp = temp->next;}printf("\t\t");temp = p; //打印待比较的字符while (1){printf("%c", temp->char_ch);if (temp->char_ch == '#')break;temp = temp->next;}printf("\t\t");if (table[i][j] < 0)printf("移进\t");if (table[i][j] > 0)printf("归约\t");if (table[i][j] == 0) //算符优先值为空{printf("\n%c与%c无算符优先关系,不是算符优先文法", stack_char, current_char);right = 0;break;}else //算符优先值不为空{if (table[i][j] < 0) //算符优先值为-1,移进{if (current_char == '#') //待比较字符为空{if (stack_char == '#'){right = 1;break;}else{printf("\n无法继续归约,不是算符优先文法");right = 0;break;}}push(current_char);p = p->next;}else //算符优先值为1,归约GoBreakTo();}}}。