编译原理语法分析器报告文档格式.docx
- 文档编号:15314984
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:22
- 大小:91.82KB
编译原理语法分析器报告文档格式.docx
《编译原理语法分析器报告文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析器报告文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
年月日
一、实验目的及内容
实验目的:
理解语言分析在编译过程中的作用、输入以及输出,学习它与编译器其它模块之间的协作关系。
掌握语法分析的两类基本方法:
自上而下的分析与自下而上的分析,并通过对自上而下的分析的编码实现,理解其执行过程以及相关限制。
实验内容:
实现下述我们定义的语言的语法分析器。
这种语言的程序结构很简单,语法相当于c的函数体,即由一对大括号括起来的语句序列,没有过程或函数。
声明语句、表达式语句及控制语句的写法都与c类似,但规定:
一条声明语句只能声明一个整型变量,没有数组;
控制语句只是if、for和while三个语句,这三个语句本身也可以包含语句序列;
表达式仅局限于布尔表达式和整型算术表达式,布尔表达式由对两个算术表达式的比较组成,该比较使用<
>
<
=,>
=,==,!
=比较运算符;
算术表达式可以包括整型常数、变量以及+,-,*,/这四个运算符。
另外,还可以有复合语句。
用read和write语句实现输入输出。
注释用/*和*/括起来,但注释不能嵌套。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
语法分析器流程图:
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC以及VISUALC++6.0软件。
四、实验方法、步骤(或:
程序代码或操作过程)
#include<
stdio.h>
ctype.h>
conio.h>
string.h>
#definemaxvartablep500
#definekeywordsum8
intparse();
intprogram();
intstatement();
intexpression_stat();
intexpression();
intbool_expr();
intadditive_expr();
intterm();
intfactor();
intif_stat();
intwhile_stat();
intfor_stat();
intwrite_stat();
intread_stat();
intdeclaration_stat();
intdeclaration_list();
intstatement_list();
intcompound_stat();
chartoken[20],token1[40];
//token保存单词符号,token1保存单词值
char*keyword[keywordSum]={"
if"
"
else"
for"
while"
do"
int"
read"
write"
};
charsingleword[50]="
+-*(){};
:
"
;
chardoubleword[10]="
>
<
=!
externcharScanout[300];
FILE*fp;
intscan();
charScan[300],Errorfile[300];
externintscan();
externintparse();
charScanin[300],Scanout[300];
//用于接收输入输出文件名
FILE*fin,*fout;
struct{
charname[8];
intaddress;
}
vartable[maxvartablep];
//改符号表最多容纳maxvartablep个记录
intvartablep=0,labelp=0,datap=0;
intlookup(char*name,int*paddress)
{
inti,es=0;
for(i=0;
i<
vartablep;
i++)
{
if(strcmp(vartable[i].name,name)==0)
*paddress=vartable[i].address;
return(es);
}
es=23;
//变量没有声明
}
intfscan()//词法分析函数
charch,token[40];
intes=0,j,n;
//es错误代码,0表示没有错误。
j,n为临时变量,控制组合单词时的下标等
printf("
================================\n"
);
************语法分析************\n"
请输入源文件的地址和文件名(格式:
X(盘):
/……/xxx.xx(文件)):
\n"
scanf("
%s"
Scanin);
你想把分析结果放在哪(包含文件名):
Scanout);
if((fin=fopen(Scanin,"
r"
))==NULL)
n打开语法分析输入文件出错!
return
(1);
if((fout=fopen(Scanout,"
w"
n创建语法分析输出文件出错!
return
(2);
ch=getc(fin);
while(ch!
=EOF)
while(ch=='
'
||ch=='
n'
t'
)ch=getc(fin);
if(ch==EOF)break;
if(isalpha(ch))
{
token[0]=ch;
j=1;
ch=getc(fin);
while(isalnum(ch))
{
token[j++]=ch;
ch=getc(fin);
}
n=0;
while((n<
keywordSum)&
&
strcmp(token,keyword[n]))n++;
if(n>
=keywordSum)
fprintf(fout,"
%st%sn"
ID"
token);
else
fprintf(fout,"
token,token);
}
elseif(isdigit(ch))
{
token[0]=ch;
ch=getc(fin);
while(isdigit(ch))
{
fprintf(fout,"
NUM"
elseif(strchr(singleword,ch)>
0)
elseif(strchr(doubleword,ch)>
if(ch=='
='
)
else
fprintf(fout,"
elseif(ch=='
/'
*'
charch1;
ch1=getc(fin);
do
ch=ch1;
ch1=getc(fin);
while((ch!
||ch1!
)&
ch1!
=EOF);
ch=getc(fin);
}
else
else
es=3;
ERROR"
fclose(fin);
fclose(fout);
intparse()
intes=0;
if((fp=fopen(Scanout,"
\n打开%s错误!
es=10;
if(es==0)es=program();
=====语法分析结果!
======\n"
switch(es)
case0:
语法分析成功!
break;
case10:
打开文件%s失败!
case1:
缺少{!
case2:
缺少}!
case3:
缺少标识符!
case4:
少分号!
case5:
缺少(!
case6:
缺少)!
case7:
缺少操作数!
fclose(fp);
//<
程序>
:
={<
声明序列>
语句序列>
//program:
='
{'
declaration_list>
statement_list>
}'
intprogram()
fscanf(fp,"
%s%s\n"
token,token1);
if(strcmp(token,"
{"
))//判断是否'
es=1;
&
token,&
token1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法 分析器 报告