DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx

上传人:b****8 文档编号:29725078 上传时间:2023-07-26 格式:DOCX 页数:28 大小:218.98KB
下载 相关 举报
DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx_第1页
第1页 / 共28页
DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx_第2页
第2页 / 共28页
DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx_第3页
第3页 / 共28页
DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx_第4页
第4页 / 共28页
DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx

《DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx》由会员分享,可在线阅读,更多相关《DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx(28页珍藏版)》请在冰豆网上搜索。

DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx

DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品

课程设计任务书

学生姓名:

专业班级:

指导教师:

工作单位:

题目:

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点。

 

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

DO-WHILE循环语句的翻译程序设计

(LL

(1)方法、输出三地址表示)

1.系统描述

1.1目的

通过设计、编制、生成、调试一个do-while循环语句的语法及语义分析程序,以加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

1.2设计内容

对循环语句:

do{赋值语句}while<表达式>

1)设计符合自身语法分析方法要求的文法和属性文法(LL

(1)语法)。

2)设计LR分析法相关的语法分析表(LL

(1)分析表)。

3)设计中间代码格式(三地址中间代码)。

4)对源文件进行词法和语法分析的同时进行语义处理(语法制导分析)。

5)对源文件中的错误进行输出。

1.3系统体系结构描述

本系统为子模块的体系结构风格,系统由两大模块组成:

1)词法分析模块

2)语法分析模块(调用语义分析模块)

1.3.1系统结构图

说明:

输入do-while语句后,词法分析模块对文件进行处理并输出单词序列到队列queue[i],随后的语法分析模块将此队列内容作为输入,通过语法制导分析方法调用语义分析模块最终生成中间代码。

1.3.2词法分析模块

说明:

对输入的源文件进行处理,逐个读入字符,将字符流进行合并并进行判断归类,将单词和其类型输入队列并保存。

1.3.3语法分析模块

说明:

接受由词法分析得到的队列queue,进行语法分析和语法制导翻译,最后得到三地址中间代码。

2.文法及属性文法描述

2.1文法:

文法是用于描述语言的语法结构的形式规则(即语法规则)。

这些规则必须是准确的、易于理解的以及有相当强的描述能力。

由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序。

DO-WHILE循环语句的文法如下所示:

K->DLWS

L->SP

P->;SP

P->ε

D->do

W->while

2.2属性文法:

属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。

在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规则的形式为:

b:

=f(c1,c2,…,ck)其中f是一个函数,而且或者①b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有继属性,文法开始符号的所有继承属性作为属性计算前的初始值。

属性文法为:

1-{if(S.value==true)emit(‘if(‘,S.value,‘)goto’,codebegin)elseemit(‘-‘,‘-‘,‘goto’,nextstate)}

2-{p=lookup(id.name);if(p!

=NULL)L.place=p;elseerror;E.place=L.place;emit(‘=‘,id,‘-’,L.place)}

3-{L.place=newtemp;emit(‘+’,F1.place,F2.place,F.place)}

4-{S.place=newtemp;S.value=(F1.value>F2.value);emit(‘>’,F1.place,F2.place,S.place)}

5-{F.place=newtemp;p=lookup(id.name);if(p!

=NULL)F.place=p;elseerror}

6-{F.place=newtemp;p=lookup(digit.name);if(p!

=NULL)F.value=digit.value;elseerror}

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

3.1语法分析

为实现LL

(1)算法,可以使用栈结构,算法的基本思想是:

首先定义栈结构,栈中的元素是一个二维数组:

voidsemantic()

{

if(VT[opr]=='=')

{

arr[d][0]=arr_i[opd];

arr[d][1]='=';

arr[d][2]=id;

arr[d][3]='';

arr[d][4]='';

id++;

}

elseif(opr==-2)

{

arr[d][0]=id-1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]='';

arr[d][4]='';

}

else

{

if(VT[opr]!

='<'&&VT[opr]!

='>')

arr[d][0]=id-1;

else

arr[d][0]=id+1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]='+';

arr[d][4]=id;

id++;

}

d++;

}

3.2预测分析部分:

intM[10][14]={{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},

{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},

{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8},

{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},

{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},

{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

};

3.3语法分析过程:

voidsyntax()

{

intn;

count++;

print();

X=stack[sp];//将sp压入栈STACK中

a=queue[front];//从queue队列中读取词法分析后的字符

if(X=='#'&&a=='#')f=4;

if(X<'A'||X>'Z')

{

if(X==a)

{

sp--;

front++;

if(a!

='i')

{

if(a!

='d'&&a!

='w'&&a!

=';'&&a!

='#')

{

opr=index(a,VT);

semantic();//语法分析调用

}

elseif(a==';'||a=='w'||a=='#')

{

opr=-2;

semantic();//语法分析调用

}

cout<<'\t'<<'\''<

}

else

{

opd=c;

//cout<

cout<<'\t'<<'\''<

}

}

elsef=1;//转入出错处理

}

else

{

inttx=index(X,VN);

intta=index(a,VT);

n=M[tx][ta];

td[t++]=M[tx][ta];

if(ta==-1)

{

f=2;//转入出错处理

cout<

}

elseif(n==-1)f=3;//转入出错处理

else

{

sp--;

cout<<'\t'<";

if(len(p[n])!

=0)

{

for(inti=len(p[n])-1;i>=0;i--)

{

stack[++sp]=p[n][i];

cout<

}

cout<

}

elsecout<<"空串"<

}

}

if(f==0)syntax();

else

{

td[t]='-1';

err(f);

}

}

4.中间代码形式及其序列的结构设计

中间代码是3地址码形式来表示,即4元式的变形。

三地址码由5个域构成:

中间代码地址标号,操作符,左操作数,右操作数,目的操作数

操作符:

=,+,>,<(文法仅定义这些操作);

左操作数,右操作数:

opt,opr;

目的操作数:

用来存放操作值的变量。

例如:

i=(0)

(0)=i+1

(1)=i

表示i=i+1。

5.简要分析与概要设计

5.1系统分析

5.1.1词法分析

输入源程序文本,对输入串进行预处理,然后从左至右逐个字符地对源程序进行扫(超前搜索法),产生一个一个的单词符号,在状态转换图的基础上,把作为字符串源程序改造成为单词符号串。

概要流程图见图1.3.2。

5.1.2语法分析

在完成词法分析的基础上对DO-WHILE循环语句进行语法分析,对状态栈、符号栈分别进行移进、规约(采用LL

(1)分析方法)、接受和出错处理四步操作,从而分析判定程序的语法结构是否符合语法规则。

概要流程图见1.3.3节。

5.1.3语义分析以及三地址码表示

当在栈中找到可归前缀后,进行规约时,根据相应产生式对应的语义子程序进行语法制导翻译(在语法的分析过程中,随着分析的步步进展,根据每一个产生式所对应的语义子程序进行翻译的方法).三地址指令很类似于四元式,这种中间表示通常称为三地址代码,三个地址即是两个为操作数,一个是操作符。

5.1.4LL

(1)语法分析中的出错处理

1)字符不匹配,转去出错处理。

2)字符没有出现在产生式终结符集VT[]中,转去出错处理

3)没有找到合适的候选产生式来做进一步推导,转去出错处理

5.2概要设计(系统总体描述)

6.详细的算法描述

详细的伪代码(源程序)

#include

#defineMAX35

charX,a;

charVN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};

charVT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};

charp[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR\0","*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};

charstack[MAX];

charqueue[MAX];

intsp,front;

intM[10][14]={{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},

{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},

{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8},

{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},

{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},

{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

};

intf=0;

intcount=0;

intc=0;

chararr_i[MAX];

charvar[MAX];//表格管理

inttd[MAX];//输出产生式序列

intt=0;

intopd=-1;

intopr=-1;

intid=0;

//intptr[MAX];

intd=0;

chararr[MAX][5];//存放待输出的三地址

//charkeyword[2][7]={"do\0","while\0"};

 

intlen(charstr[])

{

inti=0;

while(str[i]!

='\0')i++;

returni;

}

intindex(charch,charstr[])

{

inti=0;

while(str[i]!

='\0')

{

if(ch!

=str[i])i++;

elsebreak;

}

if(str[i]=='\0')return-1;

returni;

}

 

voiderr(intn)

{

if(n==1)

cout<<"字符不匹配"<

elseif(n==2)

cout<<"字符没有出现在产生式终结符集VT中"<

elseif(n==3)

cout<<"没有找到合适的候选产生式来做进一步推导"<

else

cout<<"该句子是文法语言的句子!

"<

}

 

voidprint()

{

cout<<"(";

if(count<10)cout<<'0';

cout<

inti;

for(i=0;i<=sp;i++)cout<

for(;i<=20;i++)cout<<"";

for(i=0;i

for(;queue[i]!

='#';i++)cout<

cout<

for(;i<=20;i++)cout<<"";

}

voidsemantic()

{

if(VT[opr]=='=')

{

arr[d][0]=arr_i[opd];

arr[d][1]='=';

arr[d][2]=id;

arr[d][3]='';

arr[d][4]='';

id++;

}

elseif(opr==-2)

{

arr[d][0]=id-1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]='';

arr[d][4]='';

}

else

{

if(VT[opr]!

='<'&&VT[opr]!

='>')

arr[d][0]=id-1;

else

arr[d][0]=id+1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]='+';

arr[d][4]=id;

id++;

}

d++;

}

 

voidsyntax()

{

intn;

count++;

print();

X=stack[sp];

a=queue[front];

if(X=='#'&&a=='#')f=4;

if(X<'A'||X>'Z')

{

if(X==a)

{

sp--;

front++;

if(a!

='i')

{

if(a!

='d'&&a!

='w'&&a!

=';'&&a!

='#')

{

opr=index(a,VT);

semantic();

}

elseif(a==';'||a=='w'||a=='#')

{

opr=-2;

semantic();

}

cout<<'\t'<<'\''<

}

else

{

opd=c;

//cout<

cout<<'\t'<<'\''<

}

}

elsef=1;//字符不匹配,转去出错处理

}

else

{

inttx=index(X,VN);

intta=index(a,VT);

n=M[tx][ta];

td[t++]=M[tx][ta];

if(ta==-1)

{

f=2;cout<

}//字符没有出现在产生式终结符集VT中,转去出错处理

elseif(n==-1)f=3;//没有找到合适的候选产生式来做进一步推导,转去出错处理

else

{//用产生式M[tx][ta]来做进一步推导

sp--;

cout<<'\t'<";

if(len(p[n])!

=0)

{

for(inti=len(p[n])-1;i>=0;i--)

{

stack[++sp]=p[n][i];

cout<

}

cout<

}

elsecout<<"空串"<

}

}

if(f==0)syntax();

else

{

td[t]='-1';

err(f);

}

}

voidlexical()

{//do{m=m+i;i=i+1;}while(i<4);#

inti,j,d;

charch;

j=d=0;

for(i=0;var[i]!

='#';i++)

{

ch=var[i];

if(ch=='d'&&var[i+1]=='o')

{

cout<<"do"<<'\t'<<"keyword"<

queue[j++]='d';i+=1;

}

elseif(ch=='w')

{

ch=var[i+1];

if(ch=='h')

{

ch=var[i+2];

if(ch=='i')

{

ch=var[i+3];

if(ch=='l')

{

ch=var[i+4];

if(ch=='e')

{

ch=var[i+5];

}

}

}

}

cout<<"while"<<'\t'<<"keyword"<

queue[j++]='w';i+=4;

}

elseif(index(ch,VT)<=0)

{

if(ch!

='{'&&ch!

='}'&&ch!

='('&&ch!

=')')

{

cout<

i["<

arr_i[d-1]=ch;

queue[j++]='i';

}

elsecout<

}

elseif(index(ch,VT)>0)

{

cout<

queue[j++]=ch;

}

}

queue[j]='#';

for(i=0;queue[i]!

='#';i++)cout<

cout<

}

intmain()//主程序

{

inti=0;

charS='K';

sp=front=0;

stack[0]='#';

sp++;

stack[1]='K';

cout<<"LL

(1)文法如下:

"<

cout<<"(0)K->dLwS\n

(1)L->SP\n

(2)P->;SP\n(3)P->ε\n(4)S->iQE\n(5)E->TG\n(6)G->+TG\n"<<"(7)G->-TG\n(8)G->ε\n(9)T->FR\n(10)R->*FR\n(11

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

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

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