词法分析程序构造原理以及实现方法Word文档下载推荐.docx
《词法分析程序构造原理以及实现方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《词法分析程序构造原理以及实现方法Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
设计方法
7
3.2.1
总体结构图
3.2.2
主程序判读部分流程图
8
4
程序测试
9
4.1
测试用例
4.2
测试结果
5
程序源码
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<
stdio.h>
conio.h>
string.h>
stdlib.h>
ctype.h>
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)){
arr[i]=ch;
i++;
if(ch==EOF){syb=0;
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;
fprintf(fout,"
(%d,%s)"
syn,temp);
elseif(isdigit(ch)){
while(isdigit(ch)){
arr[j]=ch;
j++;
fscanf(fin,"
%c"
&
ch);
if(feof(fin)){syb=0;
char*temp2=(char*)malloc(j+1);
memcpy(temp2,arr,j);
temp2[j]='
j=0;
syn=16;
syn,temp2);
if(syb==0){break;
switch(ch){
case'
+'
syn=17;
(%d,%c)"
syn,ch);
-'
syn=18;
*'
syn=19;
'
syn=20;
('
syn=21;
)'
syn=22;
='
syn=23;
syn=24;
else{
syn=25;
syn,"
="
fseek(fin,-2L,SEEK_CUR);
ch=fgetc(fin);
syn=26;
syn=27;
elseif(ch=='
syn=28;
"
syn=29;
syn=30;
/'
syn=31;
syn=32;
/*"
while
(1){
if(ch=='
#'
不能识别的字符。
voidmain(){
intnum=10;
char*filename=newchar[100];
FILE*fout=fopen("
jieguo.txt"
w"
memset(filename,'
100);
输入文件名:
scanf("
%s"
filename);
FILE*fin=fopen(filename,"
r"
wordanalysis(fin,fout);
fclose(fout);