词法分析程序构造原理以及实现方法.docx
《词法分析程序构造原理以及实现方法.docx》由会员分享,可在线阅读,更多相关《词法分析程序构造原理以及实现方法.docx(14页珍藏版)》请在冰豆网上搜索。
词法分析程序构造原理以及实现方法
词法分析程序
构造原理与实现技术
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);
}