C语言词法分析器实验报告文档格式.docx
- 文档编号:21758602
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:24
- 大小:290.09KB
C语言词法分析器实验报告文档格式.docx
《C语言词法分析器实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《C语言词法分析器实验报告文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
struct
4
break
5
else
6
long
7
switch
8
case
9
enum
10
register
11
typedef
12
char
13
extern
14
return
15
union
16
const
17
float
18
short
19
unsigned
20
continue
21
for
22
signed
23
void
24
default
25
goto
26
sizeof
27
volatile
28
do
29
while
30
static
31
if
32
\a
33
\b
34
\f
35
\n
36
\t
37
\v
38
\\
39
\?
40
\’
41
\”
42
\0
43
\ddd
44
\xhh
45
数字
46
标识符
47
#
48
(
49
)
50
[
51
]
52
{
53
}
54
‘
55
*
56
:
57
~
58
%
59
^
60
+
61
?
62
=
63
|
64
&
65
!
66
<
67
68
69
==
70
71
72
73
74
75
||
76
++
77
78
-
79
--
80
->
81
“
82
%A(A可为d’s’c)
83
;
84
_
85
/
86
87
88
89
90
91
其他类别
99
实验流程图(由于流程图过大因此各部分分开写):
整体:
扫描注释:
扫描数字:
扫描引号:
扫描单词:
扫描其他字符:
实验环境:
需要TC、VC++6.0等开发工具作为本次试验的环境。
实验步骤:
1、准备:
用TC、VC++等开发工具;
2、对本实验的任务进行分析,确定实现功能的函数;
3、写好程序,仔细修改函数;
4、上机操作:
输入源程序,修改、调试,运行。
5、写好试验报告。
实验调试过程及测试结果
/*******************************源代码******************************/
#include<
stdio.h>
stdlib.h>
#include<
ctype.h>
string.h>
voidmain()
FILE*fp,*fp1;
inthanjsq=1;
//行计数器,保存行号
intguanjz(charch1[]);
//关键字和标识符判断
charch,infile[15],outfile[15];
//定义输入和输出文件名
printf("
*****************Entertheinfilename*******************\n"
);
scanf("
%s"
infile);
//输入需要扫描的文件名
*****************Entertheoutfilename******************\n"
outfile);
//输入需要另存为的文件名
if((fp=fopen(infile,"
r"
))==NULL)//打开需要扫描的文件
{
printf("
cannotopenfile\n"
exit(0);
}
if((fp1=fopen(outfile,"
w"
))==NULL)//打开需要存入的文件
\n*********************************************************\n"
*》开始进行词法分析《*\n"
*********************************************************\n"
行号字符串种别码\n"
fprintf(fp1,"
while(!
feof(fp))
ch=fgetc(fp);
if(ch==10)hanjsq++;
/**********************扫描头文件单词及保留字***********************/
if(isalpha(ch)||ch=='
_'
)//如果第一个字符为字母或下划线则判断为标识符
{
inti=0;
charch1[30];
//假定每个标识符最长为
ch1[i++]=ch;
//将ch保存到ch1[0]中并使i自加1
while(!
{
ch=fgetc(fp);
if(ch==10)hanjsq++;
//如果ch为换行符,则行计数器自加1
if(isalpha(ch)||isdigit(ch)||ch=='
{//如果ch为字母、数字或下划线就把ch放到ch1[i]中并使i自加1
ch1[i++]=ch;
}
if(ch=='
.'
)//如果ch为小数点则判断是否为头文件
{
if((ch=fgetc(fp))=='
h'
)//如果小数点后一位为h则判定其为头文件
{
if(ch==10)hanjsq++;
ch1[i++]='
ch1[i]='
\0'
//把结束标志放到ch1[i]中作为单词结束标志
printf("
line%d:
%s83\n"
hanjsq,ch1);
//以字符串形式输出ch1
fprintf(fp1,"
break;
}
else//如果小数点后一位不是h则判定其为标识符
fseek(fp,-1,1);
//fp回退1
%s%d\n"
hanjsq,ch1,guanjz(ch1));
if(!
isalpha(ch)&
!
isdigit(ch)&
ch!
='
&
{//如果ch不为字母、数字、下划线和点时判断其为标识符
ch1[i]='
printf("
fprintf(fp1,"
break;
}
}
/************************扫描数字*************************/
if(isdigit(ch)||ch=='
-'
)//如果ch为数字或'
{
if(isdigit(ch))//如果ch为数字
printf("
%c"
hanjsq,ch);
fprintf(fp1,"
while(!
{
ch=fgetc(fp);
//预读一位如果ch为数字和点则循环输出
if(isdigit(ch)||ch=='
%c"
ch);
else//否则视为数字结束
46\n"
//回退一位
ch='
0'
//置ch为0,以免影响下面误判并顺利退出扫描数字
}
}
if(ch=='
)//如果ch为'
//预读一位
)//如果ch还是为'
则判断为自减符'
--'
--80\n"
hanjsq);
'
,则判断为结构体运算符'
->
81\n"
if(isdigit(ch))//如果ch为数字则可能为减号或负号
fseek(fp,-3,1);
//回退3为判断
if(isdigit(ch))//如果ch为数字则判断'
为减号
ch=fgetc(fp);
%c79\n"
else//否则判断'
为负号
while(!
{
ch=fgetc(fp);
if(isdigit(ch)||ch=='
{
printf("
fprintf(fp1,"
}
else//否则视为数字结束
fseek(fp,-1,1);
//回退1
break;
}
}
/***********************扫描注释************************/
if(ch=='
/'
则可能为注释
ch=fgetc(fp);
//读下一个字符
if(ch==10)hanjsq++;
)//如果该字符也为'
则判断为注释一行
while(fgetc(fp)!
=10);
//直到遇到换行符出现才认为注释结束
*'
)//如果该字符为'
则判断为注释多行
{//直到出现'
*/'
才认为注释结束
if(ch==10)hanjsq++;
if(ch=='
)//出现'
{//且接着出现'
if((ch=fgetc(fp))=='
break;
else//否则原样输出'
/83\n"
fseek(fp,-1,1);
break;
/***********************扫描引号************************/
"
)//出现引号
printf("
%c82\n"
fprintf(fp1,"
"
{//先整体输出引号内所有字符并定为第99类
i++;
//用于积累回退长度
if(ch!
if(ch!
=32)
elsebreak;
99\n"
fseek(fp,-i,1);
//回退到引号开始
for(;
i>
0;
i--)
if(ch==92)//如果ch为'
\'
则可能为转义字符
charch5[13]={"
abfntv\\?
\"
0"
};
//转义字符集
for(intk=0;
k<
12;
k++)
{//如果为转义字符则输出
if(ch==ch5[k])
printf("
line%d:
\\%c%d\n"
hanjsq,ch,k+33);
fprintf(fp1,"
d'
isdigit(fgetc(fp))&
isdigit(fgetc(fp)))//任意字符转换为三位八进制
fseek(fp,-2,1);
%c%c44\n"
hanjsq,fgetc(fp),fgetc(fp));
x'
isdigit(fgetc(fp)))//任意字符转换为二位十六进制
%c%c45\n"
%'
)//如果为'
则可能为%s%c%d
charbfh[4]={"
dcs"
for(i=0;
i<
3;
i++)
if(bfh[i]==ch)
%%%c83\n"
/*********************扫描其他符号********************/
if(!
charch2[14]={"
#()[]{}'
*:
~%^"
//定义部分单符号集
charch3[9]={"
+?
=|&
//定义部分单符号或双符号(前半部分)集
charch4[9]={"
+==|&
==="
//定义部分双符号(后半部分)
for(inti=0;
13;
{//判断单个符号
if(ch==ch2[i])
%c%d\n"
hanjsq,ch,i+48);
for(intj=0;
j<
8;
j++)
{//判断双符号
if(ch==ch3[j])
{//如果ch与ch3中第j个字符匹配
//if(ch==10)hanjsq++;
if(ch==ch4[j])
{//且ch与ch4第j个匹配,则表示ch3[j]与ch4[j]连起来为一个双符号
%c%c%d\n"
hanjsq,ch3[j],ch4[j],i+69);
ch3[j]=='
)//判断'
符
<
77\n"
>
78\n"
else//否则表示ch3[j]为单符号,不是双符号的一部分
hanjsq,ch3[j],j+61);
hanjsq,ch3[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 词法 分析器 实验 报告