编译课设IFELSE条件语句的翻译程序设计Word格式文档下载.docx
- 文档编号:22836217
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:193.63KB
编译课设IFELSE条件语句的翻译程序设计Word格式文档下载.docx
《编译课设IFELSE条件语句的翻译程序设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译课设IFELSE条件语句的翻译程序设计Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
5编译系统的概要设计;
6详细的算法描述(流程图或伪代码);
7软件的测试方法和测试结果;
8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试及测试。
周5:
撰写课程设计报告。
设计验收安排:
设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:
设计周的次周星期一上午10点。
指导教师签名:
2011年12月23日
系主任(或责任教师)签名:
IF-ELSE条件语句的翻译程序设计
(LL
(1)法、输出四元式)
1系统描述
利用LL
(1)文法,对以文件形式输入的if条件语句进行词法、语法及语义分析,并最终得到以四元式形式表示的中间代码,要求将词法及语法分析结果以文件形式输出。
在设计过程中,要求首先写出符合给定的语法分析方法的文法和属性文法,然后根据给定的语法分析方法的思想完成程序所要完成的任务,最后设计若干测试用例上机测试通过。
2文法及属性文法的描述
2.1.文法描述
要用自顶向下的LL
(1)法分析条件语句,给定的文法必须满足LL
(1)文法的条件,即:
如果一个文法G中的每个非终结符号的任何两个不同的规则U—>
x和U—>
y满足下面条件:
若SELECT(U—>
x)∩SELECT(U—>
y)=Φ,其中x与y不能同时推出ε,则这种文法称为LL
(1)文法。
根据LL
(1)文法的条件,结合本程序的要求,设计文法如下:
E->
ifAthenSelseW
A->
iB|(A)|notA
B->
+TB|-TB|*TB|/TB
<
TB|>
TB|==TB|>
=TB|<
=TB
orTB|andTB
e//empty
T->
i
S->
i:
=i+i;
W->
=i*i;
2.2属性文法描述
产生式
属性文法
E->
ifAthenSelseW
A.true:
=newlabel;
A.false:
S.next:
=E.next;
W.next:
E.code:
=A.code||gen(A.true,‘:
’)||S.code||gen(‘goto’,E.next)||gen(A.false,‘:
’)||W.code
iB|(A)|notA
A.place:
=‘iB|(A)|notA’;
B.place:
=‘+TB|-TB|*TB|/TB’;
B.place:
=‘<
=TB’;
=‘orTB|andTB’;
=‘e’
S.place=’i:
=i+i’;
W.place=’i:
=i*i’;
3.语法分析方法描述及语法分析表设计
3.1语法分析方法描述
预测分析法要求文法必须是LL
(1)文法,所以在构造文法的时候一定要保证文法是LL
(1)文法,若不是,则改写文法,直至改为LL
(1)文法为止。
一个预测分析器由一张预测分析表(也称LL
(1)分析表)、一个先进后出分析栈和一个总控程序三部分组成。
先求出所给文法的FIRST、FOLLOW集,然后求非终结符的SELECT集,判别其是否为LL
(1)文法,并构造预测分析表,接下来进行输入串的分析,其过程如下:
LL
(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。
对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:
(1)若X=a=‘#’,则宣布分析成功,停止分析过程。
(2)若X=a
‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。
(3)若X是一个非终结符,则查看预测分析表fenxibiao。
若feixibiao[A,a]中存放着关于X的一个产生式,那么,首先把X弹出STACK栈顶,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为%,则不推什么东西进STACK栈)。
若fenxiibao[A,a]中无产生式,则停止分析,打印出错语句。
事实上,LL
(1)的分析是根据文法构造的,它反映了相应文法所定义的语言的固定特征,因此在LL
(1)分析器中,实际上是以LL
(1)分析表代替相应方法来进行分析的。
3.2预测分析表设计
结合本题实际,要求首先构造预测分析表,然后再进行输入串分析。
预测分析表是指分析栈中的文法符号与输入串中的符号的一种匹配关系,记为fenxibiao[A,a],其中A为分析栈中的符号,a为输入符号。
可以由可选集直接来构造预测分析表。
预测分析表的构造算法是:
(1)每个终结符a∈SELECT(A→α),把A→α填入fenxibiao[A,a]中;
(2)把所有无定义的fenxibiao[A,a]均不填,即为空。
上述算法可应用于任何文法G以构造它的分析表fenxibiao。
但对于某些文法,有些fenxibiao[A,a]中可能有若干个产生式,或者说有些fenxibiao[A,a]可能是多重定的。
如果S是左递归或回溯的,那么fenxibiao至少含有一个多重定义入口。
因此消除左递归和提取公共左因子将有助于获得无多重定义的分析表fenxibiao。
预测分析器的总控程序对于不同的LL
(1)文法都是相同的,而预测分析表对于不同的LL
(1)文法是不相同的。
根据上文所给文法,其对应的预测分析表如下(用产生式编号代替产生式填入):
预测分析表
+
-
*
/
(
)
>
E
A
iB
(A)
B
+TB
-TB
*TB
/TB
e
TB
T
S
W
=
==
not
or
and
if
#
ifAthenSelseW
notA
==TB
orTB
andTB
4.中间代码形式描述及中间代码序列的结构设计
4.1中间代码形式描述
根据实验任务书的要求,要以四元式的形式输出中间代码,四元式是三地址代码的一种,是几种常见的中间代码输出形式之一,它有四个组成部分:
算符OP,第一和第二运算对象ARG1和ARG2及运算结果RESULT。
四元式对中间结果的引用必须通过临时变量,例如a=b*c+b*d的四元式表示如下:
(1).(*,b,c,t1)
(2).(*,b,d,t2)
(3).(+,t1,t2,t3)
(4).(=,t3,-,a)
算法设计如下
voidgetQuadElement()
{
boolover=false;
intlabel=100;
intnumber=0;
while(!
over)
{
if(find("
"
)||find("
="
=="
))//匹配否
{
for(inti=0;
i<
secondList.length();
i++)
{
LinkNode<
string>
*cur=secondList.getElement(i);
*next=secondList.getElement(i+1);
*third=secondList.getElement(i+2);
char*curChar=stringToCharP(cur->
data);
char*curCharT=stringToCharP(next->
if(strcmp(curChar,"
if"
)==0)continue;
elseif(strcmp(curChar,"
then"
)==0)break;
if(strcmp(curCharT,"
)==0||strcmp(curCharT,"
)==0)
{
fout<
label++<
("
next->
data<
"
cur->
third->
T"
number<
)"
endl;
secondList.deleteThree(i,merge("
T"
number));
number++;
break;
}
}
}
elseif(find("
and"
or"
))
……
}
5.编译系统的简要分析及概要设计
根据任务书要求,要实现IF语句的翻译,首先要了解IF语句的结构特点:
对形如if(a>
b)thenx=c的if-then条件语句,首先需要判断其逻辑表达式的正误,若为真就执行then之后的语句,否则跳过该语句而执行程序的后续语句,此过程涉及到程序的跳转执行,我们在实现其中间代码时,要回填跳转地址,而在得到中间代码之前,我们还要做词法分析和语法分析的工作,对于词法分析,首先要将输入符号串的字符分类,以便词法分析输出其类别;
对于语法分析,则需首先给出相应文法,然后根据LL
(1)法检查输入串是否是给定文法的句子,此过程要先建立预测分析表,然后利用栈和链表对输入串进行逐一分析,直至分析成功。
通过对输入串的词法、语法分析,进而得到以四元式形式表示的中间代码,即完成了编译系统的基本任务
采用两个栈。
一个用于存放剩余输入串,另一个存放文法。
然后用栈顶元素比较,从而确定用那条文法。
6.详细的算法描述
为实现本次课程设计的功能要求,我的程序主要分为三大块:
词法分析、语法分析和中间代码输出,其主要设计如下:
6.1词法分析
分别用数组保存关键字、分界符、算术运算符等具体实现如下:
char*keyWord[6]={"
not"
else"
};
chardivide[]={'
'
;
'
.'
('
)'
{'
}'
charoElement[]={'
+'
-'
*'
/'
:
='
#'
对输入文件进行逐字扫描,每得到一个字符,先判断其实字母还是数字还是空格或其他字符,并转入相应的处理,以字母为例:
当判断出当前扫描的字符为字母后,转入字母处理函数alphaprocess(),由于关键字一般由多个字母组成,而有的标识符也为多字符,所以首先要用一个数组保存字符,若为字母则一直扫描下去,直至扫描到的字符不是字母,然后转入insert()函数,并将当前字符返回给上一级程序,转向其他类别处理,再将数组保存的整个字符串作为一个整体插入到链表的末尾,并同时保存其对应的类别。
依次处理其他字符,直到整个输入串处理完毕,此时链表中保存了整个输入符号串,且每个节点保存词法分析的一个元素,最后用show()函数,利用指针将整个链表保存的内容逐个输出,即可得到词法分析结果。
伪代码描述如下:
打开文件;
取字符;
While(未到文件末尾)
{if(字符为字母)
{while(字符为字母或下划线)
{将字符保存在一个数组里;
取下一个字符;
在数组末尾添加结束标志;
将数组里保存的整个字符串作为一个整体插入到链表尾;
将当前取得的字符返回以做其他处理;
If(字符为数字)
while(字符为数字)
If(字符为空格)
{继续取下一字符;
将字符返回;
If(字符为分界符,算术运算符或关系运算符)
{if(字符为算术运算符)
{while(运算符未结束)
将整个运算符及其类别插入链表尾;
If(字符为分界符)
{将字符掺入链表尾;
取下一字符;
If(字符为关系运算符)
{将字符插入链表尾;
将链表头指针赋给一个指针;
指针后移一个结点;
While(指针所指结点不为空)
{cout<
结点值,结点类别;
指针后移;
}//词法分析完毕
6.2语法分析
要用LL
(1)法实现语法分析,首先要构造预测分析表(如上文所示),用LL
(1)法进行语法分析,要用到一栈一流,即分析栈和输入流,其分析思想以在上文已有所阐述,在此,给出语法分析流程图如下:
分析时,剩余输入串的输出我用了链表,首先用指针指向第一个节点,每匹配一个字符就让指针后移一个,然后依次顺出指针所指向的及其以后的节点;
分析栈的输出我用了栈,由于其中涉及到栈中字符的逆序压入,因此还需要一个中间栈来实现字符顺序的改变。
预测分析表的实现上,我首先将终结符和各非终结符编号,当分析要用到该表时,我利用函数getcol()和函数getrow()得到当前终结符和非终结符对应的行和列,然后查二维数组得要要使用的产生式,最后用该产生式代替非终结符逆序压入分析栈。
利用上述思想和具体方法就可实现对所给IF条件语句的语法分析。
6.3中间代码输出
中间代码的输出分两部分,一部分为逻辑表达式的输出,另一部分是赋值语句的输出。
逻辑表达式的输出首先要查找词法分析时建好的链表,从前往后搜索一直到找到“(”
为止,此时从“(“的后一个字符开始将其转换成四元式输出,直到搜索到“)”。
由于逻辑表达式和赋值表达式的运算有优先级,因此我用了两个栈,一个标识符栈一个运算符栈,利用算符优先法,标识符直接入栈,运算符入栈前先与栈顶运算符的优先级比较,若较大,则入栈,否则栈顶运算符出栈,标识符栈顶元素出栈进行运算,并将运算结果压入标识符栈,然后继续将运算符和当前栈顶元素比较,直到运算符优先级较大而入符号栈,依次将整个表达式运算完毕。
voidmethod()
strings1=signString.getFirst()->
data;
//去剩余输入串的第一个字符
strings2=grammarList.getFirst()->
//文法表的第一个字符
char*charPoint1=stringToCharP(s1);
char*charPoint2=stringToCharP(s2);
if(strcmp(charPoint2,"
#"
)==0){//比较
cout<
right"
return;
}
elseif(strcmp(charPoint1,charPoint2)==0)
grammarList.removeFirst();
signString.removeFirst();
elseif(strcmp(charPoint2,"
E"
{
if(strcmp(charPoint1,"
//removethefirstelementandreplaceitwithitsdeduction
//E->
grammarList.removeFirst();
grammarList.addFirst("
W"
);
S"
A"
7.软件的测试方法和测试结果
7.1测试用例
if(a<
=borc>
=dandd<
e)
thenid:
=s+d;
elsedd:
=ffs*ddd;
7.2测试结果
输出的文档内容
8.研制报告
8.1研制过程
本次课程设计完成了条件语句的词法,语法分析及语义分析程序设计,完成了语法分析器-预测分析法(即LL
(1)分析法)的算法分析到实现的全部过程,结果基本满足设计要求,验证无误。
在此期间我更加透彻理解了LL
(1)法语法分析的过程,预测分析表的构造方法和分析时栈的内容变化情况,分析了IF条件语句的结构特点,从而对整个程序有了大致的构思,接下来就是具体的代码实现,这部分有很多细节问题需要解决,通过查资料和请教同学逐一解决了这些问题,并最终实现了整个实验要求.
8.2程序的特点和不足
本程序的特点是采用LL
(1)法对输入字符串进行语法分析,并将中间代码以四元式的形式输出,能够得到正确的满足给定文法要求的if条件语句的中间代码.虽然实现了本次课程设计的基本要求,但是程序还存在不少的缺陷,由于给定的文法只考虑了部分运算符和关系运算符,所以对条件语句的适应范围较小,只能对特定的语句进行语法和语义分析,对一些运算符则不能不能通过语法分析。
若想扩充功能,只需将文法中的运算符种类扩充即可,实现思想不变。
8.3收获与体会
在为期整整一周的课程设计里,遇到了很多的问题,有些能通过自己的努力和向他人求助得到解决,结果还是不能让人满意。
总的来说从这次课程设计里学到很多很多的的东西,在这次的设计中,进一步认识了词法分析的任务及词法分析器的功能和输出形式.把词法分析安排为一个独立的阶段的好处是,它可使整个编译程序的结构更简洁,清晰和条理化。
词法分析比语法分析要简单得多,可用更有效得特殊方法和工具进行处理,对ll
(1)法也有了更加深刻的理解。
这次课程设计不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,我相信对我以后的学习以及发展有很大的帮助,同时,这也是一次让我们把理论知识转化为实际方法的过程,之前在学习LL
(1)法的时候理解了它的思想,但是当刚面对课程设计的题目时,还是不知道从哪下手,这就是我们理论运用于实践的能力的欠缺,经过这次课程设计,我学会了怎样将一个理论知识应用到实践中,收获颇多。
在此同时感谢学院和指导老师给我们提供上机实践的机会,感谢指导老师为我们付出的时间,感谢同学对我的帮助。
参考文献
[1]《编译原理(第二版)》张素琴、吕映芝、蒋维杜、戴桂兰等清华大学出版社.2005年2月
[2]《程序设计语言编译原理(第3版)》陈火旺等国防工业出版社.2003年2月
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
6
设计验收
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
201年 月 日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译课设 IFELSE条件语句的翻译程序设计 编译 IFELSE 条件 语句 翻译 程序设计