词法分析实验文档格式.docx
- 文档编号:5800913
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:12
- 大小:99.16KB
词法分析实验文档格式.docx
《词法分析实验文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析实验文档格式.docx(12页珍藏版)》请在冰点文库上搜索。
属性
编码
标示符
10
数字
11
include
1
其他
100
int
2
=
18
main
3
<
19
if
4
>
20
else
5
.
21
for
6
22
while
7
;
23
+
12
{
24
-
13
}
25
*
14
:
26
/
15
#
27
%
29
&
28
(
16
"
30
)
17
字符串
31
源文件s1:
运行词法分析程序:
文件s1的测试结果:
四本次实验总结
本次实验是编写一个简单的c语言词法分析程序。
先分析c语言的语法特点,将其分成五大类:
关键字,数字,运算符,分隔符和其他。
然后对每一类进行编号。
最终然后根据分类进行编程。
通过本次试验我学会了运用词法分析,简单的分析计算机语言,并运用此方法编写出来词法分析程序。
五成绩
附录:
源程序:
#include<
stdio.h>
stdlib.h>
string.h>
ctype.h>
//函数isspace,isalpha,isalnum的头文件
#defineN20
chartoken[100];
voidRetract(FILE*fp,charch);
//文件流的读写位置回退一位
intSymbol(charc);
//判断是否是符号
intGetChar(FILE*fp);
//读取一个字符
intIsKey(charget[N]);
//判断单词是否为关键词
char*ConCat(charget[N],FILE*fp);
//连接相邻字符组成一个单词
voidScanner(FILE*fp1,FILE*fp2);
//通过判断字符或单词的属性编码
voidmain()
charsfile[N];
chardfile[N];
//测试结果的输出文件名
FILE*sfp;
FILE*dfp;
printf("
C语言词法分析程序\n\n"
);
请输入源文件名:
scanf("
%s"
&
sfile);
sfp=fopen(sfile,"
r+"
if(!
sfp)
{
printf("
文件不存在!
!
exit
(1);
}
请输入目的文件名:
dfile);
dfp=fopen(dfile,"
w+"
Scanner(sfp,dfp);
fclose(sfp);
fclose(dfp);
已完成词法分析,分析结果已经存储在文件%s中\n"
dfile);
voidRetract(FILE*fp,charch)//文件流的读写位置回退一位
fseek(fp,-1,1);
ch=NULL;
intSymbol(charc)//判断是否是符号
switch(c)
case'
+'
return12;
break;
-'
return13;
*'
return14;
/'
return15;
('
return16;
)'
return17;
='
return18;
'
return19;
return20;
.'
return21;
'
return22;
return23;
{'
return24;
}'
return25;
return26;
#'
return27;
return28;
%'
return29;
return30;
default:
return0;
intGetChar(FILE*fp)//读取一个字符
charc;
do
c=fgetc(fp);
}while((isspace(c))&
(c!
=EOF));
//读取到得字符是空格并且不是结束符就继续循环
returnc;
intIsKey(charget[N])//判断单词是否是以下关键词
if(strcmp(get,"
include"
)==0)
return1;
elseif(strcmp(get,"
int"
return2;
main"
return3;
if"
return4;
else"
return5;
for"
return6;
while"
return7;
else
return0;
char*ConCat(charget[N],FILE*fp)//连接相邻字符组成一个单词
inti;
for(i=0;
i<
N;
i++)
get[i]=fgetc(fp);
if(isspace(get[i])||Symbol(get[i])!
=0||get[i]==EOF)//当读到空格、各种符号或者结束符时退出循环
{
get[i]=NULL;
//把读到的空格、边界符、运算符或者结束符赋值为空
fseek(fp,-1,1);
//文件流读取位置回退一格,这样下次读取可以读取到空格、边界符、
//运算符或者结束符,再根据读取到内容的加以判断
break;
}
returnget;
voidScanner(FILE*fp1,FILE*fp2)//通过判断字符或单词的属性编码
charget[N];
char*str;
inti=0;
intj,t,m,n;
while
(1)
for(j=0;
j<
j++)//第一次循环式初始化,之后是清空get字符数组。
get[j]=NULL;
get[i]=GetChar(fp1);
//读取到得字符是空格并且不是结束符的字符赋值给get[0]
if(get[i]==EOF)//判断get[0]是否为结束
if(isalpha(get[i]))//判断get[0]是否为字符
{
Retract(fp1,get[i]);
//回退一格并把get[0]赋值为空
str=ConCat(get,fp1);
t=strlen(str);
if(t==1)
{
fputs("
10<
->
fp2);
fputs(str,fp2);
\n"
}
else
strcpy(get,str);
//把读到连续字母赋值给get字符数组
m=IsKey(get);
if(m==0)
{
fputs("
fputs(get,fp2);
}
else
fprintf(fp2,"
%d<
m);
}
elseif(isalnum(get[i]))//判断get[0]是否是数字
strcpy(get,ConCat(get,fp1));
////把读到连续数字赋值给get字符数组
fputs("
11<
fputs(get,fp2);
else
n=Symbol(get[i]);
if(n==0)
100<
n);
if(get[i]=='
)//处理字符串
{
charch;
ch=get[i];
token[0]=ch;
token[1]='
\0'
ch=GetChar(fp1);
intk=0;
while(ch!
{
token[k]=ch;
k++;
ch=GetChar(fp1);
}
token[k]='
fputs("
31<
fputs(token,fp2);
fprintf(fp2,"
fputs(get,fp2);
get[i]=GetChar(fp1);
fseek(fp1,-1,1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 实验