词法分析器的设计实验Word文档下载推荐.docx
《词法分析器的设计实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《词法分析器的设计实验Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。
class
105
protected
125
const
106
public
126
continue
107
register
127
default
108
return
128
delete
109
short
129
do
110
sizeof
130
double
111
static
131
else
112
struct
132
enum
113
switch
133
extern
114
template
134
float
115
this
135
for
116
typedef
136
friend
117
union
137
if
118
virtual
138
inline
119
void
139
int
120
while
140
+
201
,
234
-
202
->
235
*
203
·
236
/
204
[
237
%
205
]
238
++
206
(
239
--
207
)
240
>
208
:
241
>=
209
{
242
<
210
}
243
<=
211
#
244
==
212
;
245
!
=
213
标识符
300
&
214
常数
400
二进制形式
||
215
!
216
<<
217
>>
218
~
219
|
220
^
221
222
223
+=
224
-=
225
*=
226
/=
227
%=
228
>>=
229
<<=
230
231
^=
232
|=
233
三、实验步骤
1.基本思想
从源程序中依次读入字符并解析,与关键字、运算符、结束符进行比较,得出其中的关键字,并将它存入到数组中去。
2.程序流程图
3.实验的输入源文件(input.txt)
inta=3;
doubleb=4;
intc;
doubled=5;
if(a>
b)c=a;
elsec=b;
if(c<
d)c=d;
elsec=c
4.实验输出截图
为了便于语法分析程序使用此法分析程序的结果,将此法分析程序的结果输出到output.txt
文件中,其内容如下所示:
5.实验源代码:
#include<
stdio.h>
#include<
cstring>
stdlib.h>
#defineMaxSize1 17
#defineMaxSize2 20
#defineMaxSize3 4structTNode
charvalue[20];
intnumber;
chardescription[20];
}KeyWords[MaxSize1],Operation[MaxSize2],EndOperation[MaxSize3];
*WordsBuff[MaxSize1]={"
const"
"
long"
float"
double"
void"
main"
if"
else"
then"
break"
int"
char"
include"
for"
while"
printf"
scanf"
};
char *OperationBuff[MaxSize2]={"
+"
-"
*"
/"
+="
-="
*="
++"
--
"
<
="
>
("
)"
#"
{"
}"
charEndOperationBuff[MaxSize3]={'
'
'
;
'
\n'
\t'
TNodeTable1[500];
TNodeVariable[100];
TNodeConst[100];
voidinputKeyWords(char*buff[],intsize)
for(inti=0;
i<
size;
i++)
strcpy(KeyWords[i].value,buff[i]);
KeyWords[i].number=i+1;
strcpy(KeyWords[i].description,"
关键字"
);
voidinputOperation(char*buff[],intsize)
strcpy(Operation[i].value,buff[i]);
Operation[i].number=i+50;
strcpy(Operation[i].description,"
运算符"
voidinputEndOperation(charbuff[],intsize)
EndOperation[i].value[0]=buff[i];
EndOperation[i].value[1]='
\0'
EndOperation[i].number=i+100;
strcpy(EndOperation[i].description,"
结束符"
voidoutputInfo(TNodea[],intsize)
printf("
(%d"
a[i].number);
printf("
\t"
%s)"
a[i].value);
printf(a[i].description);
\n"
voidoutInfoToFile(TNodea[],intsize,FILE*out)
fprintf(out,"
fprintf(out,"
fprintf(out,a[i].description);
chargetChar(FILE*fp)
charch=fgetc(fp);
returnch;
intisOperation(chara[])
intresult;
MaxSize2;
result=strcmp(a,Operation[i].value);
if(result==0)
returni;
break;
return-1;
intisKeyWords(chara[])
MaxSize1;
result=strcmp(a,KeyWords[i].value);
intisEndOperation(chara)
MaxSize3;
if(a==EndOperation[i].value[0])
intisChar(chara)
if(a>
='
a'
a<
z'
)return1;
elseif(a>
A'
Z'
return0;
intisDigit(chara)
0'
9'
intcount=0;
intcount1=0;
intcount2=0;
intstart1(FILE*in)
charbuff[20];
charnextchar[2];
chartemp[20];
inti=0;
inta;
charop[3];
op[2]='
nextchar[0]=fgetc(in);
nextchar[1]='
while(nextchar[0]!
=EOF)
if(isChar(nextchar[0]))
buff[i]=nextchar[0];
i++;
nextchar[0]=fgetc(in);
elseif(isDigit(nextchar[0]))
elseif(nextchar[0]=='
\r'
||nextchar[0]=='
buff[i]='
a=isKeyWords(buff);
if(a!
=-1&
i>
0)
strcpy(Table1[count].value,KeyWords[a].value);
Table1[count].number=KeyWords[a].number;
elseif(i>
strcpy(Table1[count].description,KeyWords[a].description);
count++;
i=0;
if(isChar(buff[0]))
strcpy(Variable[count1].value,buff);
Variable[count1].number=count1;
strcpy(Variable[count1].description,"
标识符"
count1++;
i=0;
elseif(isDigit(buff[0]))
strcpy(Const[count2].value,buff);
Const[count2].number=count2;
strcpy(Const[count2].description,"
常量"
count2++;
elseif(isEndOperation(nextchar[0])!
=-1)
strcpy(Table1[count].description,KeyWords[a].description);
strcpy(temp,KeyWords[a].value);
count++;
elseif((a=isOperation(nextchar))!
Variable[count1].number=count1;
count1++;
op[0]=nextchar[0];
if(nextchar[0]!
@'
if(isOperation(nextchar)!
op[1]=nextchar[0];
if((a=isOperation(op))!
strcpy(Table1[count].value,Operation[a].value);
Table1[count].number=Operation[a].number;
strcpy(Table1[count].description,Operation[a].description);
strcpy(Table1[count].value,op);
Table1[count].number=-1;
strcpy(Table1[count].description,"
未定义的运算符"
op[1]='
a=isOperation(op);
strcpy(Table1[count].value,Operation[a].value);
strcpy(Table1[count].description,Operation[a].description);
}}}}
returncount;
voidmain()
inputKeyWords(WordsBuff,MaxSize1);
inputOperation(OperationBuff,MaxSize2);
inputEndOperation(EndOperationBuff,MaxSize3);
FILE*in,*out;
boolFlag=true;
while(Flag)
源文件的位置:
D:
\\input.txt\n"
if((in=fopen("
D:
\\input.txt"
r"
))==NULL)
读取源文件失败!
exit(0);
if((out=fopen("
\\output.txt"
w"
打开文件失败!
exit(0);
intMaxSize=start1(in);
关键字及运算符\n"
outputInfo(Table1,MaxSize);
outInfoToFile(Table1,MaxSize,out);
标识符表:
标识符表:
outputInfo(Variable,count1);
outInfoToFile(Variable,count1,out);
常量表:
常量表:
outputInfo(Const,count2);
outInfoToFile(Const,count2,out);
Flag=false;
fclose(in);
fclose(out);
四、实验中发现的问题和遇到的困难:
4.1分析出的关键字、运算符、标识符等的保存问题
4.2文本文件中的转义字符问题
五、问题及困难的解决:
5.1:
对于保存的问题,我们设计了一种数据结构如下所示:
structTNode
//存放标识符的值intnumber;
//存放标识符的种别码chardescription[20];
//描述
软后申明这种类型的数组来保存关键字、运算符、标识符和常量等。
5.2:
转义字符是C语言中表示字符的一种特殊形式。
通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( '
),用于表示字符串常量的双撇号( "
)和反斜杠( \)等。
转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示,文本文件中的打一下回车键对应的字符是’\r’’\n’,是两个字符
六、总结
第一个编译原理课程实验已经结束了,在这一个星期里的时间里,通过实验,让我感受到许多不足。
历本次实训,从中学到很多东西,这次实训的宝贵经验也肯定将会成为我在以后成长道路上的一笔丰富财富!