编译原理报告for循环语句的翻译程序
学号:0120810680326
课程设计
题目f or循环语句的翻译程序
学院计算机学院
专业软件工程
班级0803
姓名徐泽前
指导教师何九周
2011 年 6 月日
目录
1设计目的 (4)
2设计环境与工具 (4)
3设计任务要求与说明 (4)
4设计时间 (4)
5设计地点 (4)
6系统描述 (4)
7文法及属性文法的描述 (5)
7.1文法描述 (5)
7.1.1 FOR语句相关的产生式: (5)
7.1.2 布尔表达式: (5)
7.1.3 赋值表达式: (5)
7.2属性文法的描述 (5)
8 语法分析方法描述及语法分析表设计 (7)
8.1语法分析方法描述 (7)
8.2系统中使用的action和goto表(见附录1) (9)
9 给出中间代码形式的描述及中间代码序列的结构设计 (9)
10简要的分析与概要设计 (10)
11 详细的算法描述 (11)
11.1词法分析的数据结构设计与详细的流程图 (11)
11.2词法分析流程图 (11)
11.3语法制导翻译的数据结构与详细的设计图 (12)
11.3.1数据结构的设计 (12)
11.3.2算法描述 (13)
11.3.3程序流程图 (13)
12给出软件的测试方法和测试结果 (14)
12.1 FOR循环语句的测试 (14)
12.2词法分析出错处理 (15)
12.3语法分析出错处理 (16)
13收获与体会 (16)
14 参考文献 (17)
课程设计任务书
学生姓名:徐泽前专业班级:软件0803班
指导教师:何九周工作单位:计算机学院
题目: for循环语句的翻译程序
初始条件:
程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)
1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会
设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课程设计任务。
2.主要功能包括:利用算符优先分析方法和思想对某些语句进行语法分析与语义分析,生成相
应的中间代码。正确运用语法规则,并能应用所学的方法解决存在的问题。语法分析方法及中间代码形式的描述、文法和属性文法的设计。
2.进行总体设计,详细设计:包括算法的设计和数据结构设计。系统实施、调试,合理使用出错
处理程序。
3.设计报告:要求层次清楚、整洁规范、不得相互抄袭。正文字数不少于0.3万字。包含内容:
①课程设计的题目。
②目录。
③正文:包括引言、需求分析、总体设计及开发工具的选择,设计原则(给出语法分析方法及中间代码形式的描述、文法和属性文法的设计),数据结构与模块说明(功能与流程图)、详细的算法设计、软件调试、软件的测试方法和结果、有关技术的讨论、收获与体会等。
④结束语。
⑤参考文献。
⑥附录:软件清单(或者附盘)。
时间安排:
消化资料、系统调查、形式描述1天
系统分析、总体设计、实施计划3天
撰写课程设计报告书1天
指导教师签名: 2010年 6月 11日
系主任(或责任教师)签名: 2010年 6月 11日
1设计目的
课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。
2设计环境与工具
(1)D OS环境下使用Turbo C;
(2)W indows环境下使用Visual C++ ;
(3)其它熟悉语言。
3设计任务要求与说明
明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
严格要求自己,要独立思考,按时、独立完成课程设计任务。
深入理解所学的《编译原理》相关知识,按照软件工程的设计方法进行简要的分析与概要设计,进行总体设计,详细设计、系统实施、调试。运用程序设计语言实现算法,编写相关程序。
学会正确运用语法规则,并能应用优先关系和结合性解决二义性和冲突问题,有效而正确的利用各种分析方法和思想,合理使用出错处理程序,上机调试通过。最后撰写课程设计报告。
通过编程实践逐步提高分析问题,解决问题的能力。
4设计时间
第17周一周
5设计地点
鉴主10楼软件实验室
6系统描述
本系统完成FOR循环语句的翻译程序设计,FOR循环语句的格式为:for(A;B;
C)Sx,其中A,B,C均为表达式,分别表示初始化,循环控制条件(这里为布尔表达式)以及使控制条件发生变化,Sx为循环体,可为一个或多个赋值语句。
本系统首先要进行词法分析,即从左到右逐个字符地对源程序进行扫描,产生一个个的单词序列,输出到一个中间文件上,作为语法分析的输入而继续编译过程。
该程序的语法分析能对输入的语法进行分析,判断输入语句是否满足for循环语句的文法。通过LR分析方法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。一个LR分析器主要由总控程序,分析栈(状态栈和符号栈),输入队列和分析表组成。在语法分析的同时进行语义分析,最后输出四元式的代码。
7文法及属性文法的描述
7.1文法描述
本系统中所使用FOR循环语句的文法包括FOR语句本身,赋值表达式和布尔表达式。具体文法产生式如下:
7.1.1 FOR语句相关的产生式:
1) S->for(W)Sx 2) W->A;W1
3) W1->B;W2 4) W2->A
5) Sx->Ax 6) Sx->{Am}
7)Am->AmAx 8) Am->Ax
7.1.2 布尔表达式:
9)B->B||L 10) B->L
11) L->L&&M 12) L->M
13) M->!M 14) M->K
15) K->(B) 16) K->false
17) K->true 18) K->id
19) K->idScid 20) Sc-> !=
21) Sc-> == 22) Sc-> <=
23) Sc-> >= 24) Sc-> <
25) Sc-> >
7.1.3 赋值表达式:
26) Ax->A; 27) A->id=E
28) E->E+T 29) E->E-T
30) E->T 31) T->T*F
32) T->T/F 33) T->F
34) F->id 35) F->(E)
36) F->num
7.2属性文法的描述
在本程序中用了三个变量来传递各种属性,TrueOrchain表示判断条件为真时的链号或者为句子的chain,FalseOrend表达判断条件为假时的链号,codeBegin表达代码
的开始地址。neststat指向下一四元式的地址,emit即为对四元式代码的打印,还需要下面三个函数:
1.chainMerge( p1 , p2),把p1和p2为链首的两条链合并为一条。返回合并后
的链首值。即将p2的链尾第4区段改为p1,合并后的链首为p2,除非p2
是空链。
2.backpatch(p , t),把p所链接的每个四元式的第4区段都填为t。其中使用
语义值codeBegin与非终结符E相连,表示表达式E的第1个四元式语句
的序列。
3.objectCode.insert(objcode),把中间代码存到objectCode中并把nextatat加1。具体的需要传递属性的产生式的属性文法如下表所示:
产生式属性文法
S->for(W)Sx emit(1);//生成最后一个jump
backpatch(nextstat,LastGotoAddress);//回填最后一个jump; backpatch(W.FalseOrEnd ,nextstat);//B为假则跳到最后四元式
W1->B;W2 backpatch(B.TrueOrChain,W2.TrueOrChain); backpatch(W2.FalseOrEnd , B.codeBegin );
W2->A emit(4);//输出跳转
W2.TrueOrChain = nextstat; W2.FalseOrEnd = nextstat-1;
Sx->{Am} 去掉{}
B->B1||L backpatch(B1.FalseOrEnd, L.codeBegin );//回填
B.codeBegin =B1.codeBegin ;
B.TrueOrChain=chainMerge(B1.TrueOrChain,
L.TrueOrChain);
B.FalseOrEnd = L.FalseOrEnd ; LastGotoAddress=nextstat;//记录最后jump回填地址
B->L LastGotoAddress=nextstat;//记录最后jump回填地址L->L1&&M backpatch(L1.TrueOrChain , M.codeBegin );//回填
L.codeBegin =L 1.codeBegin ;
L.TrueOrChain =M.TrueOrChain ;
L.FalseOrEnd=chainMerge(L 1.FalseOrEnd,M.FalseOrEnd );
M->!M 1 M.TrueOrChain =M 1.FalseOrEnd;
M. FalseOrEnd =M 1。TrueOrChain
M.codeBegin =M 1.codeBegin ;
K->idScid K.TrueOrChain =nextstat;
K.codeBegin =nextstat;
K.FalseOrEnd = nextstat+1;
emit(J+Sc,id,id, );//输出跳转语句
emit(jump,-,-, );
A->id=E
emit(E,- ,- ,id);//输出赋值语句 E->EoperT
(oper 为+-*/) emit(oper , E , T , temp);//输出表达式
8 语法分析方法描述及语法分析表设计
8.1语法分析方法描述
本程序采用SLR (1)分析方法,简单的LR(1),即只在动作不唯一的地方向前查看一个符号,在动作唯一时不向前查看输入符号。
从逻辑上来讲,一个LR 分析器如下图所示: 输入串
# … ai … a1 Sp →
X1 S1
┋ ┋ ┋
┋
Xm Sm 总 控 程 序 输出 ACTION 表 GOTO 表 其中S 栈为状态栈 栈 产生式
分析过程如下:
1)首先将初始状态S0及句子左界符#分别压入状态栈和符号栈中。
2)设在分析中的某一步,分析栈及余留的输入串为如下格式:
↓
S0S1… Sm ai ai+1…an
#X1… Xm ↑
↑
则用栈顶状态Sm和当前扫描符ai组成符号对(Sm,ai)去查分析动作表,根据ACTION[Sm,ai]的指示完成相应的分析动作。表中每一元素所规定的动作仅能是下列四种动作之一:
A.ACTION[Sm, ai]= Sm+1 (移进)
表明句柄尚未在栈顶形成,此时正期待移进输入符号以便形成句柄。故将当前的输入符号和表元素Sm+1分别压入栈中,有
↓
S0S1 S2 … Sm Sm+1 ai+1 ai+2 …an #
# X1 X2 … Xm ai ↑
↑
B.ACTION[Sm, ai]= Rj (归约)
表明此时应按文法的第j个产生式A→ Xm-k+1Xm-k+2 …Xm进行归约。即栈顶符号串Xm-k+1Xm-k+2 …Xm已成为当前句型的句柄。所谓按第j个产生式归约,即将分析栈中从顶向下的k个符号退栈,再将文法符号A压入符号栈中。此时格局为:
↓
S0S1… Sm-k ai ai+1…an #
# X1… Xm-k A ↑
↑
然后以(Sm-k,A)去查状态转移表,设GOTO[Sm-k,A]= Sl ,则将此新状态压入状态栈中,则有如下格局:
↓
S0S1… Sm-k Sl ai ai+1…an #
# X1… Xm-k A ↑
↑
C.ACTION[Sm, ai]=acc (接受)
表明当前的输入串已被成功地分析完毕,应停止分析器的工作。
D.ACTION[Sm, ai]=ERROR(空白)
表明当前的输入串中含有错误,也应终止当前的分析工作。转出错处理。
3)重复上述第2步的工作,直到分析栈顶出现“接受状态”或“出错状态“为止。对接受状态,分析栈的格局为:
↓
S0 Sα #
# Z ↑
↑
其中Z为文法开始符号,α为使ACTION[Sα ,#]=acc的唯一状态(接受状态)。8.2系统中使用的action和goto表(见附录1)
9 给出中间代码形式的描述及中间代码序列的结构设计
本系统中所采用的中间代码形式是四元式,是一种比较普遍采用的形式。四元式的四个组成成分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。
运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。
例如a:=b*c+b*d的四元式表示如下:
1)(*,b,c,t1)
2)(*,b,d,t2)
3)(+,t1,t2,t3)
4)(:=,t3,-,a)
四元式对中间结果的引用必须通过给定的名字,也就是说,四元式的联系是通过临时变量实现的。
将gotoL写成(jump,-,-,L)
将if B rop C goto L写成(jrop,B,C,L)
本程序中所用到的四元式语句如下:
1)形如(op,arg1,arg2,result)的赋值语句
2)形如(jrop,B,C,L)的条件转移语句
3)形如(jump,-,-,L)的无条件转移语句
4)形如(=,arg1,-,result)的复写语句
10简要的分析与概要设计
自底向上分析方法是一种移进-归约过程,当分析的栈顶符号串形成句柄就采用归约动作,因而自底向上分析法的关键问题是在分析中如何确定句柄。LR分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的k (k>=0)符号就可惟一地确定句柄。LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。
程序开始,需先对输入字符串进行词法分析,将其识别为一个个独立的单词序列,得到的字符单词要和关键字比较,看是否是关键字,根据比较结果进行返回相应的单词类型。单词类型主要包括标识符,关键字,常量,运算符和分界符。每种符号对应其在数组中的编号。在语法分析程序中,根据词法得到的结果,进行判断是否是当前需要的单词类型,如果不是就说明输入字符串不能由该文法推导出来;如果是当前需要的类型,就相应得做该单词类型分支程序。根据action表和goto表来进行状态转换,根据LR方法进行归约,看是否能得到接受状态。在进行语法分析的同时进行语义分析,审查程序有无语义错误,每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。在进行了上述的语法分析和语义分析阶段的工作之后,将源代码变成一种内部表示形式,此处用四元式表示。
总流程如下图所示:
图1.总程序流程图
11 详细的算法描述
11.1词法分析的数据结构设计与详细的流程图
初始化部分介绍
在程序正确执行前要完成如下的初始化工作:
1)完成语法分析所要查找的关键字和各种标识符编号的图的初始化。
2)读入源文件,对源文件进行初步的处理。
3)对源文件的正确读入进行判断,读入错误则进行报错。
4)初始化各种全局变量。
数据结构的设计
string Word[WordNum]
存储所有的单词(标识符,关键字,运算符,界限符,数字(整型,实型)),WordNum为单词个数。
map
存储所有单词和相应的类型码的map,用于识别单词类型时候方便查找,如能在表中找到,则能识别,如找不到,则报错处理。
vector
存储词法分析结果,Token为结点类。
class Token
每个单词类别的种类和类型结点信息,其主要的数据成员为单词的类型码和单词本身。
11.2词法分析流程图
对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标准形式—属性字(TOKEN)。
图2.词法分析流程图
11.3语法制导翻译的数据结构与详细的设计图
11.3.1数据结构的设计
本程序语法分析所用到的数据结构如下表所示:
数据结构作用
stack
stack
deque
stack
int nextstat 四元式地址的序号,假设从100开始
Action表,(<状态n,符号>,状态m)
map
ActionTable
map
存储目标代码的图,<编号<四元式,回填地址>> objectCode
11.3.2算法描述
backpatch(int objPatch,int num)
回填函数,将objPatch所链接的每个四元式的第4区段都填为num。具体实现代码如下:
map
while( iter != objectCode.end())//如果存在地址号为objPatch的地址码号
{ iter->second.first += toString
iter = backpatch(iter->second.second , num);//填下一个链结点
}
return iter;
int chainMerge(int end, int head)
将end链的头接到head链的尾部,合并为一条链,返回合并后的链首值。
map
map
while( iter != objectCode.end())//找到head的链尾
{ iterWanted = iter;iter=objectCode.find(iter->second.second);}
iterWanted->second.second= end;
return head;
void emit(int deduceNum)
归约过程中所要用到的进行语义分析以及产生目标代码的函数,若在归约的过程中使用了含有+-*/的产生式则输出四元式到输出文件。在该过程中要视情况而调用回填及合并函数。
void initTable()
初始化action表,goto表,输入串队列,产生式表。将已构造的各个表的内容读入存储它们的图中。
11.3.3程序流程图
根据LR方法,在分析的过程中,只需判断在栈顶元素为Si时遇见输入符号a时
需要执行的动作:移进,归约,接受或者报错。最后将结果以四元式的形式输出到文件。其流程图如下:
12给出软件的测试方法和测试结果
12.1 FOR循环语句的测试
Input文件内容为:for(i=a;(i<=b)&&(i!=c);i=i+d)
{g = g+i*c2-b3; m = m*3;}#
其中编译运行结果和词法分析(LEXoutput.txt)及输出文件(output.txt)结果为:
12.2词法分析出错处理
若输入文件中含有词法分析中wordnum中所没有定义的单词时,将其在终端显示出来。如下图所示:
12.3语法分析出错处理
当输入文件中的输入序列不满足文法格式时,将得不到结果,如下图:
13收获与体会
本次课程设计是在两次上机实验之后开展的,在经历了词法分析和赋值语句的翻译两次实验之后,对一个源代码从输入到输出的编译过程已经有了比较系统的了解。
而且编译原理课程的考试在课程设计之前,故在真正着手做课程设计做要求的项目之前,已经对LR分析方法的理论知识有了较为牢固的掌握。
众所周知,就像建房子需要打好地基一样,对于该系统来讲,构造正确而完善的文法对以后对输入文件进行语法制导翻译而言是至关重要的。FOR循环的格式在之前的C++语言学习过程中已有接触,在这里只需将其格式用产生式的形式描述,在FOR 循环中,最重要的两种表达式就是赋值表达式和布尔表达式。其实表达式的赋值不过是步步细化,直至最后定义为终结符。而LR方法的基础则是构造出action和goto表,在产生式构造完毕之后,完成这两个表就只是是否细心的问题了。
地基打好了,接下来就是构造房子的大体框架了。词法分析是本程序第一个环节,
它将输入文件识别为一个个具有独立意义的单词序列,它的输出将作为语法分析的输入。之前第一次上机实验的成果在这里发挥了作用,可直接作为子函数调用。然后就是在归约的过程中根据ACTION表看执行哪个动作,直至最后得到接受状态。若为归约则还需进行相应语义分析,这里用到了较为生疏的回填及合并函数,以便将结果以四元式的形式输出。由于之前对这两个函数接触不多,尽管书本上有较为详细的介绍,但是对于自己来讲,仍然有些困难,所幸在这部分的完成上,得到了同学和老师耐心的讲解,最终完成的较为满意。
本次设计较为完善的完成了设计要求,能对输入源代码进行正确的参加法分析,能指出分析过程中出现的错误,完成了语法制导的FOR循环语句的翻译,在这个过程中,也能进行简单的检错处理,最后能正确的输出四元式序列,结果与预期相吻合。
但是在处理判断条件上,对于直接true的语义分析没有考虑全面,没有实现其功能,这是程序中的不足。总的来说,本次课程设计还是完成的较为成功。因为使用的文法和标准C++相关无几,即能够完成任何一种布尔表达式的翻译和任何一个for循环语句的翻译,文法的限制比较少,而且程序进行了比较好的出错处理。本系统所用的各种数据结构都是C++中STL(标准模版库)中提供的。这样使用比较简单且效率高。
此次课程设计让我知道自己的编程能力仍然有待提高,在以后的学习和实验中我将再接再厉,争取更上一层楼!
14 参考文献
[1]张素琴、吕映芝、等.编译原理(第二版).清华大学出版社.2005年2月
[2]陈火旺等.程序设计语言编译原理(第3版).国防工业出版社.2003年2月
[3]胡元义等.编译原理实践教程.西安电子科技大学出版社.2002年1月
[4]王雷等.编译原理课程设计.机械工业出版社.2005年3月
[5]Lippman等,C++ primer (英文版,第三版).人民邮电出版社
本科生课程设计成绩评定表
班级:软件0803姓名:徐泽前学号:0120810680326
序号评分项目满分实得分
1 学习态度认真、遵守纪律10
2 设计分析合理性10
3 设计方案正确性、可行性、创造性20
4 设计结果正确性40
5 设计报告的规范性10
6 设计验收10
总得分/等级
评语:
注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格
指导教师签名:
20 年月日
WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)
课程设计任务书 学生姓名:赵旭林专业班级:计算机0801班 指导教师:陈天煌工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 13日 系主任(或责任教师)签名: 2010年 11月 13日
FOR循环语句的翻译程序设计
目录 1 系统描述 (2) 1.1目的 (2) 1.2设计内容: (2) 1.3翻译过程 (2) 1.4初始条件: (3) 1.5 开发平台 (3) 2文法及属性文法的描述 (3) 3 语法分析表设计 (4) 3.1 LR分析概述 (4) 3.2 LR(0)分析表 (5) 3.3 LR语法分析过程的设计思想及算法 (7) 3.4 翻译方法 (8) 4 中间代码形式的描述及中间代码序列的结构设计 (8) 5简要的分析与概要设计 (9) 6详细的算法描述 (9) 6.1 main函数 (10) 6.2词法分析 (10) 6.3 语法分析 (12) 7 测试方法和测试结果 (13) 7.1测试过程 (13) 7.2 测试结论 (14) 8 研制报告 (14) 8.1研制过程 (14) 8.2本设计的评价 (15) 8.3个人心得体会 (15) 9 参考文献 (16) 本科生课程设计成绩评定表 (17)
FOR循环语句的翻译程序设计 ——LR方法、输出四元式 1 系统描述 1.1目的 通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。 1.2设计内容: 本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。 对下列正确的程序输入: for(i=0;i<10;i++) { m=m+i; } 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。 对于错误的程序输入,如: for(i=0;i<10) { m=m+i; } 结果程序要指出程序出错。 1.3翻译过程
IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2
IF-ELSE条件语句的翻译程序设计 1 问题描述 要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。 2 问题分析及编译系统的概要设计 编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。 这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理. 3 文法及属性文法的定义 3.1 文法: 文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序. IF-ELSE条件语句的文法如下所示: 0.A->EB 1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点: 0.S->if A THEN B ELSE C 1.A->m rop n
3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/ 3.2 属性文法: 属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规 则的形式为:b:=f(c 1,c 2 ,…,c k )其中f是一个函数,而且或者①b是A的一个综合属性 并且c 1,c 2 ,…,c k 是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有 继属性,文法开始符号的所有继承属性作为属性计算前的初始值。 属性文法为: if(VT[opr]=='=') //{"="判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='>') //{">"判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; }
DO-WHILE循环语句的翻译程序设计
课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年月日 系主任(或责任教师)签名: 2011年月日
DO-WHILE循环语句的翻译程序设计 (LL(1)法、输出三地址表示) 1. 系统描述 1.1 设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2 设计内容及步骤 对循环语句: DO〈赋值语句〉WHILE 〈表达式〉 (1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给出中间代码序列的结构设计。 (4)完成相应的词法分析、语法分析和语义分析程序设计。 (5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2. 文法及属性文法的描述 2.1 文法描述 K -> do L while S L -> SP P -> ;SP | ε S -> iQE E -> TG G -> +TG | -TG | εT -> FR R -> *FR | /FR | εF -> (E) | i Q -> = | < | > 2.2 属性文法的描述
for循环语句的翻译
课程设计任务书 学生姓名:辛波专业班级:计算机0707班 指导教师:彭德巍工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码四元式的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 01月 08日 系主任(或责任教师)签名: 2010年 01月 08日
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 -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将