编译原理课程设计项目Word格式文档下载.docx
- 文档编号:19634473
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:21
- 大小:80.64KB
编译原理课程设计项目Word格式文档下载.docx
《编译原理课程设计项目Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计项目Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
要考虑能够存储有关名字的信息,并可以高效地完成如下操作:
a.查找:
根据给定的名字,在符号表中查找其信息。
如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;
b.删除:
从符号表中删除给定名字的表项。
(2)设计词法分析器
设计各单词的状态转换图,并为不同的单词设计种别码。
将词法分析器设计成供语法分析器调用的子程序。
功能包括:
a.具备预处理功能。
将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;
b.能够拼出语言中的各个单词;
c.将拼出的标识符填入符号表;
d.返回(种别码,属性值)。
(3)语法分析器
要求用预测分析法、递归下降分析法、算符优先分析法、SLR分析法(几种方法任选),实现对表达式、各种说明语句、控制语句进行语法分析。
(4)目标代码生成器
能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇编指令应包括加、减、乘、除),要求指令条数最少的情况下,尽量使用寄存器,尽量少访问内存,这样才能做到运行效率高。
三、课程设计要求
四、简单编译器的实现流程图
源程序
单词符号
语法单位
中间代码
目标代码
五、实现环境
WindowsXP操作系统、win-TC运行环境
六、课程设计的详细过程
(1)设计词法分析器
设计思想:
要求:
1.对单词的构词规则有明确的定义;
2.编写的分析程序能够正确识别源程序中的单词符号;
3.识别出的单词以<
种别码,值>
的形式保存在符号表中;
4.词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。
5.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;
6.输入:
由符合规定单词类别结构的各类单词组成的源程序。
实现方法:
根据加入语义过程的状态转换图直接编写词法分析程序。
根据每一组状态转换关系(标识符)组织程序结构,并将所有公共处理过程分别实现即可。
在扫描源程序字符串时,一旦识别出关键字、运算符、标识符、无符号常数中之一,即以二元式形式(类别编码,值)输出单词。
每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词。
实现过程及主要代码:
定义主要函数:
charprog[80]={'
\0'
},token[8];
charch;
intsyn,n,sum,m,p;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
实现函数代码:
扫描功能:
voidscaner(){m=0;
sum=0;
for(n=0;
n<
8;
n++)
token[n]='
;
ch=prog[p++];
while(ch=='
'
)
ch=prog[p++];
if(isalpha(ch))
{
while(isalpha(ch)||isdigit(ch))]
token[m++]=ch;
}
token[m++]='
ch=prog[p--];
syn=10;
6;
if(strcmp(token,rwtab[n])==0)
{syn=n+1;
break;
}}
Elseif(isdigit(ch))
while(isdigit(ch))
sum=sum*10+ch-'
0'
syn=11;
else
switch(ch){
case'
<
'
:
m=0;
token[m++]=ch;
if(ch==‘)’){syn=21;
elseif(ch=='
='
){syn=22;
else{
syn=20;
ch=prog[p--];
break;
case'
>
if(ch=='
){
syn=24;
syn=23;
syn=18;
syn=17;
+'
syn=13;
token[0]=ch;
-'
syn=14;
*'
syn=15;
/'
syn=16;
syn=25;
syn=26;
('
syn=27;
)'
syn=28;
#'
syn=0;
default:
syn=-1;
主函数:
main()
printf("
\n\nThesignificanceofthefigures:
\n"
"
1.figures1to6saidKeyword\n"
2.figures10and11saidOtherindicators\n"
3.figures13to28saidOperators\n"
);
p=0;
printf("
\npleaseinputstring:
do{
ch=getchar();
prog[p++]=ch;
}while(ch!
p=0;
do{
scaner();
switch(syn){
case11:
(%d,%d)\n"
syn,sum);
case-1:
\nERROR;
default:
(%d,%s)\n"
syn,token);
}}
while(syn!
=0);
getch();
(2)设计语法、语义分析器
1.对语法规则有明确的定义;
2.编写的分析程序能够对实验一的结果进行正确的语法分析;
3.编写的分析程序能够对实验二的结果进行正确的语义分析;
4.对于遇到的语法、语义错误,能够做出简单的错误处理,给出简单的错误提示,保证语义分析过程;
在词法分析识别出单词符号的基础上分析并规定程序的语法结构是否符合语法规则。
其工作本质就是按文法的产生式,识别输入符号串是否为一个句子。
首先定义语法规则,然后按照规则实现语法分析。
插入符号表动作@name-def↓n,t的程序如下:
intname_def(char*name)
{inti,es=0;
if(fhbp>
=maxfhbp)return(-1);
for(i=fhbp-1;
i==0;
i--)//查符号表
{if(strcmp(fhb[i].name,name)==0)
{es=21;
//21表示变量重复声明
break;
}}
if(es==21)return(es);
strcpy(fhb[fhbp].name,name);
fhb[fhbp].address=datap;
datap++;
//分配一个单元,数据区指针加1
fhbp++;
return(es);
}
查询符号表返回地址:
intlookup(char*name,int*paddress)
for(i=0;
i<
fhbp;
i++)
{if(strcmp(fhb[i].name,name)==0)
{*paddress=fhb[i].address;
return(es);
es=23;
//变量没有声明
语法、语义分析及代码生成程序:
intTESTparse()
{intes=0;
if((fp=fopen("
bbb.t"
r"
))==NULL)
{printf("
\n打开%s错误!
Scanout);
es=10;
return(es);
//printf("
请输入目标文件名(包括路径):
"
//scanf("
%s"
Codeout);
if((fout=fopen("
ccc.t"
w"
\n创建%s错误!
if(es==0)es=program();
==语法、语义分析及代码生成程序结果==\n"
switch(es)
{case0:
语法、语义分析成功并抽象机汇编生成代码!
case10:
打开文件%s失败!
case1:
缺少{!
case2:
缺少}!
case3:
缺少标识符!
case4:
少分号!
case5:
缺少(!
case6:
缺少)!
case7:
缺少操作数!
case21:
符号表溢出!
case22:
变量重复定义!
case23:
变量未声明!
fclose(fp);
fclose(fout);
定义语义规则并实现:
程序>
={<
声明序列>
语句序列>
program:
declaration_list>
statement_list>
intprogram()
{intes=0,i;
fscanf(fp,"
%s%s\n"
token,token1);
if(strcmp(token,"
{"
))//判断是否'
{'
{es=1;
&
token,&
token1);
es=declaration_list();
if(es>
0)return(es);
符号表\n"
名字地址\n"
%s%d\n"
fhb[i].name,fhb[i].address);
es=statement_list();
}"
))//判断是否'
}'
{es=2;
fprintf(fout,"
STOP\n"
//产生停止指令
=<
声明语句>
|<
//<
=
declaration_stat>
//改成<
intdeclaration_list()
while(strcmp(token,"
int"
)==0)
{es=declaration_stat();
if(es>
:
=int<
变量>
;
↓fhbp,datap,codep->
intID↑n@name-def↓n,t;
intdeclaration_stat()
if(strcmp(token,"
ID"
))return(es=3);
//不是标识符
es=name_def(token1);
//插入符号表
))return(es=4);
语句>
statement>
intstatement_list()
))
{es=statement();
if语句>
while语句>
for语句>
read语句>
//|<
write语句>
复合语句>
表达式语句>
=<
if_stat>
while_stat>
for_stat>
compound_stat>
|<
expression_stat>
intstatement()
if(es==0&
&
strcmp(token,"
)==0)es=if_stat();
IF语句>
)==0)es=while_stat();
for"
)==0)es=for_stat();
//可在此处添加do语句调用
read"
)==0)es=read_stat();
write"
)==0)es=write_stat();
)==0)es=compound_stat();
(strcmp(token,"
)==0||strcmp(token,"
NUM"
)==0))es=expression_stat();
IF语句>
=if(<
表达式>
)<
语句>
[else<
]
IF_stat>
expr>
statement>
statement>
if(<
)@BRF↑label1<
@BR↑label2@SETlabel↓label1
[else<
]@SETlabel↓label2
expression>
@BR↑label2@SETlabel↓label1[else<
其中动作符号的含义如下
@BRF↑label1:
输出BRFlabel1,
@BR↑label2:
输出BRlabel2,
@SETlabel↓label1:
设置标号label1
@SETlabel↓label2:
设置标号label2
intif_stat(){
intes=0,label1,label2;
//if
("
))return(es=5);
//少左括号
es=expression();
)"
))return(es=6);
//少右括号
label1=labelp++;
//用label1记住条件为假时要转向的标号
BRFLABEL%d\n"
label1);
//输出假转移指令
es=statement();
label2=labelp++;
//用label2记住要转向的标号
fprintf(fout,"
BRLABEL%d\n"
label2);
//输出无条件转移指令
LABEL%d:
//设置label1记住的标号
else"
)==0)//else部分处理
{fscanf(fp,"
printf("
es=statement();
//设置label2记住的标号
=while(<
=while(<
expr>
/*<
=while@SETlabel↑label1(<
)@BRF↑label2
<
@BR↓label1@SETlabel↓label2
=while@SET↑labellabel1(<
<
动作解释如下:
@SETlabel↑label1:
设置标号label1
@BRF↑label2:
输出B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 项目