C语言词法分析器实验报告Word格式.doc

上传人:wj 文档编号:3940370 上传时间:2023-05-02 格式:DOC 页数:22 大小:735.50KB
下载 相关 举报
C语言词法分析器实验报告Word格式.doc_第1页
第1页 / 共22页
C语言词法分析器实验报告Word格式.doc_第2页
第2页 / 共22页
C语言词法分析器实验报告Word格式.doc_第3页
第3页 / 共22页
C语言词法分析器实验报告Word格式.doc_第4页
第4页 / 共22页
C语言词法分析器实验报告Word格式.doc_第5页
第5页 / 共22页
C语言词法分析器实验报告Word格式.doc_第6页
第6页 / 共22页
C语言词法分析器实验报告Word格式.doc_第7页
第7页 / 共22页
C语言词法分析器实验报告Word格式.doc_第8页
第8页 / 共22页
C语言词法分析器实验报告Word格式.doc_第9页
第9页 / 共22页
C语言词法分析器实验报告Word格式.doc_第10页
第10页 / 共22页
C语言词法分析器实验报告Word格式.doc_第11页
第11页 / 共22页
C语言词法分析器实验报告Word格式.doc_第12页
第12页 / 共22页
C语言词法分析器实验报告Word格式.doc_第13页
第13页 / 共22页
C语言词法分析器实验报告Word格式.doc_第14页
第14页 / 共22页
C语言词法分析器实验报告Word格式.doc_第15页
第15页 / 共22页
C语言词法分析器实验报告Word格式.doc_第16页
第16页 / 共22页
C语言词法分析器实验报告Word格式.doc_第17页
第17页 / 共22页
C语言词法分析器实验报告Word格式.doc_第18页
第18页 / 共22页
C语言词法分析器实验报告Word格式.doc_第19页
第19页 / 共22页
C语言词法分析器实验报告Word格式.doc_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C语言词法分析器实验报告Word格式.doc

《C语言词法分析器实验报告Word格式.doc》由会员分享,可在线阅读,更多相关《C语言词法分析器实验报告Word格式.doc(22页珍藏版)》请在冰点文库上搜索。

C语言词法分析器实验报告Word格式.doc

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//否则视为数字结束

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);

%c 79\n"

else//否则判断'

为负号

ch=fgetc(fp);

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("

%c 82\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%c 44\n"

hanjsq,fgetc(fp),fgetc(fp));

x'

isdigit(fgetc(fp)))//任意字符转换为二位十六进制

%c%c 45\n"

%'

)//如果为'

则可能为%s%c%d

charbfh[4]={"

dcs"

for(i=0;

i<

3;

i++)

if(bfh[i]==ch)

%%%c 83\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]为单符号,不是双符号的一部分

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2