编译原理实验一Word格式文档下载.docx
《编译原理实验一Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验一Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
2、以层次图模块的组成及调用关系
3、主要函数的设计要求(功能、参数、返回值):
isKey:
判断ch中的字符是否为关键字;
isLer和isNum:
布尔函数过程,分别判断ch中的字符是否为字母和数字;
isBoudany():
布尔函数过程,分别判断ch组成的字符否为边界符号;
check:
词法分析;
clock:
时间函数,计算程序运行所需的时间
main:
主函数。
4、状态转换图:
字母或数字
字母非字母或数字
数字数字
非数字
字符a
字符b
‘=’
字符c
字符a包括:
=,&
|,+,--
字符b包括:
--,<
>
|,*
字符c包括:
,:
(,),{,},[,],!
#,%,”,/,*,+,--,>
<
.
#include<
stdio.h>
#include<
string.h>
stdlib.h>
time.h>
ctype.h>
FILE*fr,*fw,*temp1,*temp2;
char*key0[]={"
main"
"
printf"
scanf"
else"
if"
auto"
double"
"
int"
struct"
break"
long"
switch"
case"
enum"
register"
typedef"
char"
extern"
return"
union"
const"
float"
short"
unsigned"
continue"
for"
signed"
void"
default"
goto"
sizeof"
volatile"
do"
while"
static"
};
/*关键字表*/
char*key1[]={"
\"
\\"
("
)"
["
]"
{"
}"
;
'
/*边界符表*/
intisLet(charc)//判断是否是字母
{
if(c>
='
a'
&
c<
z'
||c>
A'
c<
Z'
)
return1;
else
return0;
}
intisNum(charc)//判断是否是数字
if(c>
0'
9'
intisKey(char*word)
intm,i;
for(i=0;
i<
36;
i++)
if((m=strcmp(word,key0[i]))==0)
{
if(i==0)
return2;
else
}
return0;
intisBoudany(charc)
if(c=='
\\'
else
if(c=='
('
||c=='
)'
{'
}'
['
]'
'
\'
return1;
voidcheck(FILE*fr)
{
charword[30];
while(!
feof(fr))
memset(word,0,sizeof(word));
charch,temp;
ch=fgetc(fr);
//获取字符,指针fr并自动指向下一个字符
inti,c;
if(ch=='
#'
)//预处理
{
//temp=fgetc(fr);
while(ch!
>
)
ch=fgetc(fr);
ch=fgetc(fr);
fprintf(fw,"
*****************************************跳过头文件和文件宏定义\n"
);
}
else
if(ch=='
/'
)//跳过注释/**/类型
{
if(ch=='
)//跳过注释//类型
{
while(ch!
\n'
ch=fgetc(fr);
fprintf(fw,"
*********************************************************跳过注释\n"
}
else
if(ch=='
*'
{
temp=fgetc(fr);
do
{
ch=fgetc(fr);
temp=fgetc(fr);
}
while(ch!
||temp!
fprintf(fw,"
******************************************************跳过注释\n"
}
}
if(isLet(ch))
{
word[0]=ch;
ch=fgetc(fr);
i=1;
while(isNum(ch)||isLet(ch))//判断该字符是否是字母或数字
{
word[i]=ch;
i++;
word[i]='
\0'
//'
代表字符结束(空格)
fseek(fr,-1,1);
c=isKey(word);
//判断是否是关键字
if(c==0)//不是关键字
fprintf(temp1,"
%s"
word);
字符%s是:
标识符,种别编码为:
%d\n"
word,2);
else
if(ch!
)//判断是否是定义的字符
if(c==2)
fprintf(fw,"
***************************************************主函数,种别编码为:
word,0);
//主函数
else
关键字,种别编码为:
word,1);
//关键字
else
{
fprintf(fw,"
定义的字符常量,种别编码为:
%d\n\n"
word,32);
}
else//开始判断的字符不是字母
if(isNum(ch))
{//判断是否是数字
word[0]=ch;
i=1;
while(isNum(ch))
word[i]=ch;
i++;
word[i]='
fseek(fr,-1,1);
//回退
字符%s是:
常量,种别编码为:
word,3);
else
{
c=isBoudany(ch);
//开始判断的字符不是字母也不是数字
//边界符
if(c)
if(c==2)//判断是否是转义字符
word[0]=ch;
word[1]=ch;
word[2]='
转义字符,种别编码为:
word,4);
if(c==1)
{
字符%c是:
界符,种别编码为:
ch,5);
fprintf(temp2,"
%c"
ch);
}
switch(ch)
case'