IFELSE条件语句的翻译程序设计LL1法输出四元式Word格式.docx
- 文档编号:19198457
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:39
- 大小:129.34KB
IFELSE条件语句的翻译程序设计LL1法输出四元式Word格式.docx
《IFELSE条件语句的翻译程序设计LL1法输出四元式Word格式.docx》由会员分享,可在线阅读,更多相关《IFELSE条件语句的翻译程序设计LL1法输出四元式Word格式.docx(39页珍藏版)》请在冰豆网上搜索。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:
1系统描述(问题域描述);
2文法及属性文法的描述;
3语法分析方法描述及语法分析表设计;
4按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5编译系统的概要设计;
6详细的算法描述(流程图或伪代码);
7软件的测试方法和测试结果;
8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试及测试。
周5:
撰写课程设计报告。
设计验收安排:
设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:
设计周的次周星期一上午10点。
指导教师签名:
2011年12月23日
系主任(或责任教师)签名:
2011年12月23日
1.问题描述
要求用LL
(1)自顶向下分析方法及中间代码四元式,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析,并完成以下要求:
(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
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)
根据条件语句:
IF〈布尔表达式〉THEN〈赋值语句〉ELSE〈赋值语句〉,描述相应的文法,其中非终结符集为VN(A,B,E,T,F),终结符集为VT(+,-,ε,*,/,i,(,))。
E为布尔表达式,B为赋值语句。
3.2属性文法的描述
3.2.1属性文法的定义形式
属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。
在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规则的形式为:
b:
=f(c1,c2,…,ck)其中f是一个函数,而且或者①b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有继属性,文法开始符号的所有继承属性作为属性计算前的初始值。
3.2.2IFTHENELSE语句的属性文法
其属性文法为:
0.S->
ifATHENBELSEC
{S.chain:
=merge(A.chain,B.chain,C.chain)}
1.A->
mropn
{A.true:
=nextstat;
A.false=nextstat+1;
backpatch(A.chain,nextstat);
emit(“ifp”rop“qgoto—”)
emit(“goto—”);
}
2.B->
x=maropn
{backpatch(B.chain,nextstat);
emit(“x:
=m”arop“n”);
emit(“goto—”);
3.C->
x=naropm
{backpatch(C.chain,nextstat);
=n”arop“m”);
4.rop->
={emit(“=”);
5.rop->
<
{emit(“<
”);
6.rop->
>
{emit(“>
7.arop->
+{emit(“+”);
8.arop->
-{emit(“-”);
9.arop->
*{emit(“*”);
10.arop->
/{emit(“/”);
4.语法分析方法描述及语法分析表设计
4.1语法分析方法描述
首先应该创建一个枚举类型的变量来存放一些关键字,enumkeyword{$right_paren,$left_paren,$mul,$div,$add,$sub,$fenhao,$equal,$IF,$THEN,$ELSE,$greater,$less,$id,$num,$end};
再创建一个结构体,用来存放词法分析的结果,共有两个域,一个关键字域,表明他是什么类型,以及它自身的内容。
这个词法分析程序比较简单,因为本身的程序就局限在if-else语句,所以保留字的类型我就只写了if、then和else三个;
碰到数字开头的除了关键字就是标识符;
碰到数字开头的就是数字;
碰到界限符和操作符(因为引入的类型也很少),所以也很容易区别。
在词法分析结束之后,就应该把分析的结果输出来。
输出的格式是【(单词,类型编号)类型名】
其流程图为:
字符的分离
单词的判断
查找相应的表
单词的类型判断
调用不同类型的单词处理函数
进行单词的处理
产生类型码
将中间单词和其类型码存入数组
处理完毕
词法分析程序如下:
boolaccidence()
{
intk=0;
charbuf[16];
charch;
while
(1)
{
ins>
>
ch;
if(ins.fail())
break;
while(ch=='
'
)
{ins>
}
if(ch=='
I'
{
ins>
buf;
if(strcmp(buf,"
F"
)==0)
tokentable[total_len++].type=$IF;
}
elseif(ch=='
T'
HEN"
tokentable[total_len++].type=$THEN;
E'
LSE"
tokentable[total_len++].type=$ELSE;
'
tokentable[total_len++].type=$greater;
elseif(ch=='
<
tokentable[total_len++].type=$less;
='
tokentable[total_len++].type=$equal;
elseif((ch>
A'
&
ch<
Z'
)||(ch>
a'
&
z'
))
tokentable[total_len].type=$id;
tokentable[total_len++].ch=ch;
elseif(ch>
0'
9'
{tokentable[total_len].type=$num;
tokentable[total_len++].ch=ch;
else
switch(ch)
{case'
+'
:
tokentable[total_len].type=$add;
break;
case'
-'
tokentable[total_len].type=$sub;
case'
/'
tokentable[total_len].type=$div;
*'
tokentable[total_len].type=$mul;
;
tokentable[total_len].type=$fenhao;
('
tokentable[total_len].type=$left_paren;
)'
tokentable[total_len].type=$right_paren;
default:
cout<
"
!
endl;
returntrue;
5.语法分析
语法分析的主要思想是设置一个分析栈和一个输入串队列,栈中最开始时存放的是文法开始符和“#”。
因为我这个程序本身已经确定是以if语句开头,所以,就不再把if放在输入串中,而只是分析if以后的句子。
在语法分析之前应该判定该文法是不是一个LL
(1)文法。
判别的主要方法是做出文法中所有产生式的select集,对于同一个非终结符的不同产生式,如果他们的select集合没有交集,则说明这个文法是LL
(1)文法。
这个文法的预测分析表也设计的比较简单,如下表所示:
i
+
-
*
/
(
)
#
E
1
0
A
T
B
F
注:
1代表此处有产生式与之对应,具体的产生式在程序中给出。
0代表此处无产生式与之对应。
//算法函数
chardosome(void)
{intt,a=0;
charbian1,bian2;
OpKindopa;
charc='
$'
next();
for(;
{pop();
if(cur.type!
=$id&
cur.type!
=$num)
curchar=cur.ch;
curchar='
i'
cout<
curchar<
"
curtocmp<
if(curtocmp=='
#'
curchar=='
||curtocmp=='
B'
||curtocmp=='
F'
)//当前字符为非终结符
if(curtocmp!
)//当前比较字符不为'
{
changchartoint();
if(j==0)
{a++;
flag++;
if(flag==1)
{if(c=='
bian1=cur.ch;
else
bian1=c;
}
elseif(flag==3)
{bian2=cur.ch;
flag=1;
c=newchar();
AD_RESULT(quad_len,opa,bian1,bian2,c);
//产生四元式}
}
else
{
switch(j)
{
case1:
opa=add;
flag++;
break;
case2:
opa=sub;
case3:
opa=mul;
case4:
opa=div;
}
if(table[i][j])//有产生式
{t=10*i+j;
//计算产生式在数组中的位置
doforpush(t);
continue;
else//没有产生式
{right=0;
//出错
break;
}
else//当前比较字符为'
if(curtocmp!
=curchar)
//出错
elsebreak;
//正确
else//当前字符为终结符
{right=0;
break;
else
{next();
//读取下一个字符
continue;
if(a>
1)returnc;
elsereturnbian1;
因为在推导过程中,会一并完成产生式后面附加的语义动作,所以这两部分是一起做的。
另外,在LL
(1)分析过程中,会出现错误信息,如字符不匹配,或字符没有出现在产生式终结符集VT中,或没有找到合适的候选产生式来做进一步推导,会调用相应的出错处理函数err(f)。
另外,此函数是递归实现,结束标志是f!
=0,即成功或失败。
6.中间代码形式的描述及中间代码序列的结构设计
四元式是一种比较普遍采用的中间代码形式。
四元式的四个组成部分是:
操作
符OP,第一个和第二个运算对象ARG1和ARG2及运算结果RESULT。
运算对象和运算
结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。
例a:
=b*c+b*d的四元式表示如下:
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+,t1,t2,t3)
(4)(:
=,t3,-,a)
7.语义分析及中间代码输出
根据上面给出的属性文法所规定的翻译方案,即可对输入的程序进行相应的语义
分析。
对于中间代码部分,题目是以四元式的形式输出。
对于四元式形式,在学习编译
原理的时候接触的是比较多的了,所以是比较熟悉了。
而对于跳转语句,条件跳转如jump
L1的四元式形式为(jump,-,-,L1);
而其对应的三地址形式为gotoL1。
而对于条件跳
转语句,则四元式为(jrop,a,b,L1)。
产生跳转的主要有三个地方,第一,就是if条件成立,则跳转到then后面的语
句;
第二,执行完then后面的语句后跳转到程序的出口;
第三,就是if条件不成立则跳转到else后面的语句。
在判断完if后面的条件后,保存这个布尔值,并产生跳转地址,这时,应该继续向前读取,如果碰到then这个关键字,则回填地址到then前面,否则报错。
关键是回填地址的那个函数一定要写准确。
在有跳转的语句后面,一定要有跳
转的地址,即要跳到什么地方。
产生跳转的语句有在token这个结构体中有个地址域,用来保存转向的地址。
而在产生运算结果的语句中,token这个结构体中有个result域,用来保存这个结果。
/产生数值语句的四元式
voidAD_RESULT(intnlabel,OpKindnop,charnpar1,charnpar2,charnresult)
{quad[quad_len].label=nlabel;
quad[quad_len].op=nop;
quad[quad_len].par1=npar1;
quad[quad_len].par2=npar2;
quad[quad_len].result=nresult;
quad_len++;
//产生跳转地址的四元式
voidAD_ADDRESS(intnlabel,OpKindnop,charnpa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IFELSE 条件 语句 翻译 程序设计 LL1 输出 四元式
