IFELSE条件语句的翻译程序设计LL1法输出四元式.docx

上传人:b****5 文档编号:6194616 上传时间:2023-01-04 格式:DOCX 页数:39 大小:129.34KB
下载 相关 举报
IFELSE条件语句的翻译程序设计LL1法输出四元式.docx_第1页
第1页 / 共39页
IFELSE条件语句的翻译程序设计LL1法输出四元式.docx_第2页
第2页 / 共39页
IFELSE条件语句的翻译程序设计LL1法输出四元式.docx_第3页
第3页 / 共39页
IFELSE条件语句的翻译程序设计LL1法输出四元式.docx_第4页
第4页 / 共39页
IFELSE条件语句的翻译程序设计LL1法输出四元式.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

IFELSE条件语句的翻译程序设计LL1法输出四元式.docx

《IFELSE条件语句的翻译程序设计LL1法输出四元式.docx》由会员分享,可在线阅读,更多相关《IFELSE条件语句的翻译程序设计LL1法输出四元式.docx(39页珍藏版)》请在冰豆网上搜索。

IFELSE条件语句的翻译程序设计LL1法输出四元式.docx

IFELSE条件语句的翻译程序设计LL1法输出四元式

目录

课程设计任务书...................................................................................................2

1.问题描述............................................................................................................3

2.问题分析及编译系统的概要设计....................................................................3

3.文法及属性文法的定义....................................................................................3

3.1文法..................................................................................................................................3

3.2属性文法的描述...............................................................................................................4

3.2.1属性文法的定义形式...............................................................................................4

3.2.2IFTHENELSE语句的属性文法..............................................................................4

4.语法分析方法描述及语法分析表设计............................................................5

4.1语法分析方法描述.........................................................................................................5

5.语法分析............................................................................................................8

6.中间代码形式的描述及中间代码序列的结构设计......................................12

7.语义分析及中间代码输出..............................................................................12

8.程序流程图......................................................................................................14

9.设计结果显示..................................................................................................15

10.研制报告........................................................................................................16

10.1研制过程....................................................................................................................16

10.2本设计的评价、特点、不足、收获与体会等......................................16

11.源程序清单....................................................................................................17

 

课程设计任务书

学生姓名:

专业班级:

指导教师:

高曙工作单位:

计算机科学与技术学院

题目:

IF-ELSE条件语句的翻译程序设计(LL

(1)法、输出四元式)

初始条件:

理论:

学完编译课程,掌握一种计算机高级语言的使用。

实践:

计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码四元式的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(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);

emit(“x:

=n”arop“m”);

emit(“goto—”);}

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>>ch;}

if(ch=='I')

{

ins>>buf;

if(strcmp(buf,"F")==0)

tokentable[total_len++].type=$IF;

}

elseif(ch=='T')

{

ins>>buf;

if(strcmp(buf,"HEN")==0)

tokentable[total_len++].type=$THEN;

}

elseif(ch=='E')

{

ins>>buf;

if(strcmp(buf,"LSE")==0)

tokentable[total_len++].type=$ELSE;

}

elseif(ch=='>')

{

tokentable[total_len++].type=$greater;

}

elseif(ch=='<')

{

tokentable[total_len++].type=$less;

}

elseif(ch=='=')

{

tokentable[total_len++].type=$equal;

}

elseif((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))

{

tokentable[total_len].type=$id;

tokentable[total_len++].ch=ch;

}

elseif(ch>='0'&&ch<='9')

{tokentable[total_len].type=$num;

tokentable[total_len++].ch=ch;

}

else

switch(ch)

{case'+':

tokentable[total_len].type=$add;

tokentable[total_len++].ch=ch;

break;

case'-':

tokentable[total_len].type=$sub;

tokentable[total_len++].ch=ch;

break;

case'/':

tokentable[total_len].type=$div;

tokentable[total_len++].ch=ch;

break;

case'*':

tokentable[total_len].type=$mul;

tokentable[total_len++].ch=ch;

break;

case';':

tokentable[total_len].type=$fenhao;

tokentable[total_len++].ch=ch;

break;

case'(':

tokentable[total_len].type=$left_paren;

tokentable[total_len++].ch=ch;

break;

case')':

tokentable[total_len].type=$right_paren;

tokentable[total_len++].ch=ch;

break;

default:

cout<<"!

"<

}

}

returntrue;

}

5.语法分析

语法分析的主要思想是设置一个分析栈和一个输入串队列,栈中最开始时存放的是文法开始符和“#”。

因为我这个程序本身已经确定是以if语句开头,所以,就不再把if放在输入串中,而只是分析if以后的句子。

在语法分析之前应该判定该文法是不是一个LL

(1)文法。

判别的主要方法是做出文法中所有产生式的select集,对于同一个非终结符的不同产生式,如果他们的select集合没有交集,则说明这个文法是LL

(1)文法。

这个文法的预测分析表也设计的比较简单,如下表所示:

i

+

-

*

/

#

E

1

0

0

0

0

1

0

0

A

0

1

1

0

0

0

1

1

T

1

0

0

0

0

1

0

0

B

0

1

1

1

1

0

1

1

F

1

0

0

0

0

1

0

0

注:

1代表此处有产生式与之对应,具体的产生式在程序中给出。

0代表此处无产生式与之对应。

//算法函数

chardosome(void)

{intt,a=0;

charbian1,bian2;

OpKindopa;

charc='$';

next();

for(;;)

{pop();

if(cur.type!

=$id&&cur.type!

=$num)

curchar=cur.ch;

else

curchar='i';

cout<

cout<

if(curtocmp=='#'&&curchar=='#')

break;

if(curtocmp=='A'||curtocmp=='B'||curtocmp=='E'

||curtocmp=='T'||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;flag++;break;

case3:

opa=mul;flag++;break;

case4:

opa=div;flag++;

}

}

if(table[i][j])//有产生式

{t=10*i+j;//计算产生式在数组中的位置

doforpush(t);

continue;

}

else//没有产生式

{right=0;//出错

break;}

}

else//当前比较字符为'#'

if(curtocmp!

=curchar)

{right=0;//出错

break;

}

elsebreak;//正确

}

else//当前字符为终结符

if(curtocmp!

=curchar)

{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模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1