DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx
- 文档编号:29725078
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:28
- 大小:218.98KB
DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx
《DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx》由会员分享,可在线阅读,更多相关《DOWHILE循环语句的翻译程序设计LL1法输出三地址表示word文档良心出品.docx(28页珍藏版)》请在冰豆网上搜索。
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) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DOWHILE 循环 语句 翻译 程序设计 LL1 输出 地址 表示 word 文档 良心 出品