编译原理课设报告Word文档下载推荐.docx
《编译原理课设报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理课设报告Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
1、课程设计报告书一份
2、源程序清单一份
3、成果使用说明书一份
摘要
编译原理是计算机科学与技术专业一门重要的专业课,它具有很强的理论性与实践性,
目的是系统地向学生介绍编译系统的结构、工作原理以及编译程序各组成部分的设计原理和实现技术,在计算机本科教学中占有十分重要的地位。
计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言,就是因为有了编译技术。
编译技术是计算机科学中发展得最迅速、最成熟的一个分支,它集中体现了计算机发展的成果与精华。
本课设是词法分析、语法分析、语义分析的综合,主要是锻炼学生的逻辑思维能力,进一步理解编译原理的方法和步骤。
关键词:
词法分析语法分析语义分析
第1章课程设计目的
《编译原理》课程设计是编译原理课程必不可少的一个环节,通过课程设计,加深对编译原理的教学内容的了解,以及实现编译原理各部分知识的融合。
进而提高学生分析问题、解决问题,从而运用所学知识解决实际问题的能力。
第2章课程设计内容
1.题目:
编译程序构造
2.内容:
涉及词法分析、自下而上语法分析程序的实现:
SLR
(1)分析器的实现以及生成中间代码。
3.具体要求
根据LR分析算法构造SLR
(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。
要求程序具有通用性,改变文法时只需改变程序的数据初值,无需改变程序主体;
要求完成一条说明语句、一条算数表达式和赋值语句的翻译,生成中间代码。
构造其用于SLR
(1)分析的识别活前缀的DFA以及action表和goto表。
然后编程实现。
(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=))。
4.程序设计提示:
(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:
一个符号栈,一个状态栈,一个语义栈,则归约时,则需要在符号栈中退掉n个符号,在状态栈中退掉n个符号(n为产生式符号个数),语义栈中退掉n个符号对应的语义;
(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数字,表示在分析表中对应的下标)。
(3)action表中的错误处理:
简化的错误处理:
当查找action表出现空白时,则当前单词无法移进和规约,可简单的认为当前单词为多余的单词,则抛弃当前单词,读下一单词继续分析。
5.程序扩展要求
有能力的同学可将编译程序扩展布尔表达式的分析和四元式生成,布尔表达式的翻译参见教材(胡元义《编译原理教程》)104——105页。
第3章设计方案介绍
3.1模块划分及模块调用
本系统总体是三个模块,一个是词法分析模块;
一个是语法分析模块;
一个是语义分析模块。
其中词法分析作为语法分析的子程序调用。
模块调用如图3-1所示:
图3-1模块调用图
第4章程序源代码
程序源代码如下:
#include<
iostream.h>
string.h>
istream.h>
fstream.h>
stdlib.h>
stdio.h>
ctype.h>
intLetter(charch)
{
if(isalpha(ch))return1;
return0;
}
intDigit(charch)
{
if(ch>
47&
&
ch<
58)return1;
charbiaozhifu[30][30];
charfuhaobiao1[100][10];
intfuhaobiao2[100];
charsiyuanshi[100][100];
#defineMAXSIZE1024
typedefstruct
intstate[MAXSIZE];
charsign[MAXSIZE];
charmean[MAXSIZE][100];
inttop;
}SeqStack;
SeqStack*Init_SeqStack()
SeqStack*s=newSeqStack;
if(!
s)
{
cout<
<
"
未申请到空间!
endl;
returnNULL;
}
else
s->
top=-1;
returns;
}
intEmpty_SeqStack(SeqStack*s)
if(s->
top==-1)
return1;
elsereturn0;
//入栈
voidPush_SeqStack(SeqStack*s,inta,charb,charc[])
top+1>
=MAXSIZE)
cout<
栈满"
;
{
top++;
s->
state[s->
top]=a;
sign[s->
top]=b;
strcpy(s->
mean[s->
top],c);
//出栈
voidPop_SeqStack(SeqStack*s)
if(Empty_SeqStack(s))
栈空"
else
top--;
//取栈顶元素
intTop_SeqStack(SeqStack*s)
return0;
returns->
top];
//返回状态
//主函数
voidmain()
intno1,no2=0,no3=0,i=0,k,flag=0,m=0,s,t,slength=8,f1=0,f=1,error=0,v=49;
charstring[20],filename[30],token[30],nn[2];
chara,b;
charplace[3];
place[0]='
T'
place[1]=v;
place[2]=NULL;
inti1,j1=0,l,k1=0;
charVN[10]={'
A'
'
E'
F'
};
//非终结符表
intlength_vn=5;
charVT[15]={'
i'
='
+'
*'
('
)'
#'
//终结符表
intlength_vt=10;
charNT[11]={'
//综合表
intlength_nt=11;
charFa[15][10]={"
i=E"
"
E+T"
T"
T*F"
F"
(E)"
i"
/*(0)A→id=E
(1)E→E+T
(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→i*/
//构造ACTION和GOTO表
intanalysis_table[15][11]={2,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,200,-1,-1,-1,-1,
-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,
7,-1,-1,-1,8,-1,-1,-1,4,5,6,
-1,-1,9,-1,-1,-1,100,-1,-1,-1,-1,
-1,-1,102,10,-1,102,102,-1,-1,-1,-1,
-1,-1,104,104,-1,104,104,-1,-1,-1,-1,
-1,-1,106,106,-1,106,106,-1,-1,-1,-1,
7,-1,-1,-1,8,-1,-1,-1,13,5,6,
7,-1,-1,-1,8,-1,-1,-1,-1,12,6,
7,-1,-1,-1,8,-1,-1,-1,-1,-1,11,
-1,-1,103,103,-1,103,103,-1,-1,-1,-1,
-1,-1,101,10,-1,101,101,-1,-1,-1,-1,
-1,-1,9,-1,-1,14,-1,-1,-1,-1,-1,
-1,-1,105,105,-1,105,105,-1,-1,-1,-1};
SeqStack*A=Init_SeqStack();
Push_SeqStack(A,0,'
_"
);
//将初态和"
#"
压入栈中A
请输入文件名:
cin>
>
filename;
ifstreaminstuf(filename,ios:
:
in);
**************************操作过程如下************************"
状态栈"
'
\t'
符号栈"
语义栈"
四元式"
动作说明"
------------------------------------------------------------------------------------------------------------"
do{
//****************状态栈******符号栈******语义栈**************
t=0;
into=0,p=0,q=0;
while(t<
=A->
top)
{
A->
state[t];
//输出状态栈
if(A->
state[t]>
=10)
o=o+2;
}
else
{
o++;
t++;
}
if(o<
8)
}
elseif(o>
=8&
o<
16)
t=0;
sign[t];
//输出符号栈
p=p++;
if(p<
elseif(p>
p<
top)//输出语义栈
mean[t];
q=q+strlen(A->
mean[t]);
if(q<
elseif(q>
q<
//***********************词法分析器**************************
if(f==1)
//i:
token数组变量,j:
标识符数组变量,l:
查看标识符数组k:
查看符号表
for(i1=0;
i1<
30;
i1++)
{
token[i1]='
\0'
}
if(f1!
=1)
instuf.get(a);
}
while
(1)
{
i1=0;
if(a=='
'
||a=='
)//滤去空格
instuf.get(a);
while(a=='
)
{
instuf.get(a);
}
continue;
elseif(Letter(a)||a=='
_'
intflag=0;
while(Letter(a)||a=='
||Digit(a))
token[i1]=a;
//将当前读入的字符送入token数组
i1++;
f1=1;
}
//查表是否已存在该标志符
for(l=0;
l<
l++)
if(strcmp(biaozhifu[l],token)==0)
{
flag=1;
break;
}
if(flag!
strcpy(biaozhifu[j1],token);
//符号如表
j1++;
fuhaobiao2[no2]=j1-1;
else
fuhaobiao2[no2]=l;
b='
strcpy(fuhaobiao1[no2],"
id"
no2++;
strcpy(string,token);
for(i1=0;
break;
elseif(a=='
nn[0]='
nn[1]='
nn[0]=a;
strcpy(fuhaobiao1[no2],nn);
fuhaobiao2[no2]=-1;
f1=0;
b=a;
strcpy(string,"
break;
else
cout<
cout<
非法字符!
"
a;
error++;
instuf.get(a);
continue;
k=0;
no1=-1;
for(intj=0;
j<
length_nt;
j++)//判断输入符号标号
if(b==NT[j])
no1=j;
s=analysis_table[Top_SeqStack(A)][no1];
if(s==200)
cout<
分析完成。
共"
error<
个错误"
elseif(s>
0&
s<
100)
{
ACTION["
state[A->
top]<
b<
]"
="
s"
状态"
入栈"
字符"
语义"
string<
Push_SeqStack(A,s,b,string);
//状态入栈移进字符
f=1;
continue;
=100&
s!
=200)
s=s-100;
/*(0)A→id=E
(1)E→E+T
(2)E→T
(3)T→T*F(4)T→F(5)F→(E)(6)F→i*/
switch(s)
{
case0:
charr[100];
strcpy(r,A->
mean[A->
top-2]);
cout<
(=,"
_"
top-2]<
)"
strcpy(siyuanshi[no3],"
strcat(siyuanshi[no3],A->
top]);
strcat(siyuanshi[no3],"
_,"
strcat(siyuanshi[no3],"
no3++;
cout<
for(intj=0;
Fa[s][j]!
j++)
{
Pop_SeqStack(A);
//出栈j<
Fa[s].length()
}
intn1=A->
top,n2;
for(n2=0;
n2<
11;
n2++)
if(NT[n2]==VN[s])
break;
}
VN[s]<
-->
Fa[s]<
规约,且GOTO["
state[n1]<
]="
analysis_table[A->
state[n1]][n2]<
Push_SeqStack(A,analysis_table[A->
state[n1]][n2],VN[s],r);
//入栈规约状态
break;
case1:
{cout<
(+,"
place<
strcat(siyuanshi[no3],place);
for(intj=0;
{
}
}
规约,且GOTO["
Push_SeqStack(A,analysis_table[A->
state[n1]][n2],VN[s],place);
v++;
place[1]=v;
break;
case2:
charr[100];
strcpy(r,A->
case3:
{cout<
(*,"
strcpy(siyuanshi[no3],"
strcat(siyuanshi[no3],p