C语言词法分析器实验报告Word格式文档下载.doc
《C语言词法分析器实验报告Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《C语言词法分析器实验报告Word格式文档下载.doc(22页珍藏版)》请在冰豆网上搜索。
==;
()等
(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:
ID=_|letter(letter|digit)*
NUM=digitdigit*
(4)空格有空白、制表符和换行符组成。
空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。
(5)注释被忽略
(6)各种单词符号对应的种别码(如下):
单词符号
种别码
auto
1
double
2
int
3
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:
%s 83\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/