词法分析程序构造原理以及实现方法.docx

上传人:b****2 文档编号:1351920 上传时间:2022-10-21 格式:DOCX 页数:14 大小:17.97KB
下载 相关 举报
词法分析程序构造原理以及实现方法.docx_第1页
第1页 / 共14页
词法分析程序构造原理以及实现方法.docx_第2页
第2页 / 共14页
词法分析程序构造原理以及实现方法.docx_第3页
第3页 / 共14页
词法分析程序构造原理以及实现方法.docx_第4页
第4页 / 共14页
词法分析程序构造原理以及实现方法.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

词法分析程序构造原理以及实现方法.docx

《词法分析程序构造原理以及实现方法.docx》由会员分享,可在线阅读,更多相关《词法分析程序构造原理以及实现方法.docx(14页珍藏版)》请在冰豆网上搜索。

词法分析程序构造原理以及实现方法.docx

词法分析程序构造原理以及实现方法

词法分析程序

构造原理与实现技术

 

1  程序功能描述  3

1.1  输入输出  3

1.1.1  输入  3

1.1.2  输出  3

1.2  大小写不敏感  4

1.3  查错功能  4

1.4  注释功能  4

2  主要数据结构  5

3  程序结构描述  6

3.1  单词符号类别编码  6

3.2  设计方法  7

3.2.1  总体结构图  7

3.2.2  主程序判读部分流程图  8

4  程序测试  9

4.1  测试用例  9

4.2  测试结果  9

5  程序源码  9

1程序功能描述

1.1输入输出

1.1.1输入

输入为一个写有字符串的txt文件。

程序读入txt文件,并进行操作。

1.1.2输出

输出为一个写有二元组(syn,String)的txt文件。

其中二元组(syn,String) 

syn为单词符号的类别编码,

String为单词符号字符串

例:

输入txt中含有:

<<>:

=

输出txt中二元组应为(26,<),(28,<>),(30,:

=)

在输入的txt:

ceshi.txt中写入:

<<>:

=

在程序中输入文件名,程序运行完毕

在输出的jieguo.txt中显示出来二元组即为:

(26,<)(28,<>)(30,:

=)\

1.2大小写不敏感

对字母的大小写不进行区分,所输出的二元组都是以小写形式输出。

1.3查错功能

当输入串为未定义的字符时,在输出文件中显示“不能识别的字符”。

例如:

当输入文件中有未定义的字符“#”的时候

输入文件如下:

1.4注释功能

当输入文件中出现了/*的字符串之后,程序会自动忽略之后的输入字符串,直到遇到*/。

例如:

当输入中含有/*的时候:

输入:

程序只会输出/*,之后的部分便会全部省略。

2主要数据结构

本程序仅由一个main函数组成,未定义以及调用子程序。

在程序中利用了字符数组来实现了输入字符串的读入。

3程序结构描述

3.1单词符号类别编码

单词符号

种别码

 

单词符号

种别码

begin

1

无符号整数

16

end

2

+

17

If

3

-

18

then

4

*

19

else

5

;

20

for

6

21

do

7

22

while

8

=

23

and

9

>

24

or

10

>=

25

not

11

<

26

标识符

15

<=

27

 

 

<>

28

 

 

:

29

 

 

:

=

30

 

 

/

31

 

 

/*

32

 

 

 

 

 

3.2设计方法

3.2.1总体结构图

3.2.2主程序判读部分流程图

4程序测试

4.1测试用例

1.beginEgib2876

2.+-<<=>=:

=:

#

3./*shdaohfoi*/shi

4.2测试结果

1.

2.

3.

5程序源码

#include

#include

#include

#include

#include

voidwordanalysis(FILE*fin,FILE*fout)

{

chararr[200];

charch;

inti=0;      //字符

intj=0;      //数字

char*keyword[11]={"begin","end","if","then","else","for","do","while","and","or","not"};

intsyn;

intsyb=1;

while

(1)     //判断是否读到末尾

{

ch=fgetc(fin);

if(feof(fin)){

syb=0;

break;

}

if(ch==''||ch=='  '){

//

}

elseif(isalpha(ch)){

printf("a");

ch=tolower(ch);

while(isalpha(ch)||isdigit(ch)){

if(isalpha(ch)){

ch=tolower(ch);

}

arr[i]=ch;

i++;

ch=fgetc(fin);

if(ch==EOF){syb=0;break;}

}

printf("b");

fseek(fin,-1L,SEEK_CUR);

char*temp=(char*)malloc(i+1);

memcpy(temp,arr,i);

temp[i]='\0';

i=0;

syn=15;

for(intn=0;n<11;n++)

{

if(strcmp(temp,keyword[n])==0)

{

syn=n+1;

break;

}

}

fprintf(fout,"(%d,%s)",syn,temp);

ch=fgetc(fin);

if(feof(fin)){

syb=0;

break;

}

}

elseif(isdigit(ch)){

while(isdigit(ch)){

arr[j]=ch;

j++;

fscanf(fin,"%c",&ch);        

if(feof(fin)){syb=0;break;}

}

fseek(fin,-1L,SEEK_CUR);

char*temp2=(char*)malloc(j+1);

memcpy(temp2,arr,j);

temp2[j]='\0';

j=0;

syn=16;

fprintf(fout,"(%d,%s)",syn,temp2);

if(syb==0){break;}

}

switch(ch){

case'+':

syn=17;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case'-':

syn=18;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case'*':

syn=19;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case';':

syn=20;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case'(':

syn=21;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case')':

syn=22;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case'=':

syn=23;

fprintf(fout,"(%d,%c)",syn,ch);

break;

case'>':

fscanf(fin,"%c",&ch);

if(feof(fin)){

syn=24;

fprintf(fout,"(%d,%c)",syn,ch);

break;

}

else{

if(ch=='='){

syn=25;

fprintf(fout,"(%d,%s)",syn,">=");

}

else{

fseek(fin,-2L,SEEK_CUR);

syn=24;

ch=fgetc(fin);

fprintf(fout,"(%d,%c)",syn,ch);

}

break;

}

case'<':

fscanf(fin,"%c",&ch);

if(feof(fin)){

syn=26;

fprintf(fout,"(%d,%c)",syn,ch);

break;

}

else{

if(ch=='='){

syn=27;

fprintf(fout,"(%d,%s)",syn,"<=");

}

elseif(ch=='>'){

syn=28;

fprintf(fout,"(%d,%s)",syn,"<>");

}

else{

fseek(fin,-2L,SEEK_CUR);

syn=26;

ch=fgetc(fin);

fprintf(fout,"(%d,%c)",syn,ch);

}

break;

}

case':

':

fscanf(fin,"%c",&ch);

if(feof(fin)){

syn=29;

fprintf(fout,"(%d,%c)",syn,ch);

break;

}

else{

if(ch=='='){

syn=30;

fprintf(fout,"(%d,%s)",syn,":

=");

}

else{

fseek(fin,-2L,SEEK_CUR);

syn=29;

ch=fgetc(fin);

fprintf(fout,"(%d,%c)",syn,ch);

}

break;

}

case'/':

fscanf(fin,"%c",&ch);

if(feof(fin)){

syn=31;

fprintf(fout,"(%d,%c)",syn,ch);

break;

}

else{

if(ch=='*'){

syn=32;

fprintf(fout,"(%d,%s)",syn,"/*");

while

(1){

ch=fgetc(fin);

if(feof(fin)){

break;

}

if(ch=='*'){

ch=fgetc(fin);

if(ch=='/'){

break;

}

}

}

}

else{

fseek(fin,-2L,SEEK_CUR);

syn=31;

ch=fgetc(fin);

fprintf(fout,"(%d,%c)",syn,ch);

}

break;

}

case'#':

fprintf(fout,"不能识别的字符。

");

}

}

}

voidmain(){

intnum=10;

char*filename=newchar[100];

FILE*fout=fopen("jieguo.txt","w");

memset(filename,'\0',100);

printf("输入文件名:

");

scanf("%s",filename);

FILE*fin=fopen(filename,"r");

wordanalysis(fin,fout);

fclose(fout);

}

 

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

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1