编译原理实验报告1Word文件下载.docx
《编译原理实验报告1Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告1Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
63||
1整型常量
22sho
43--
64?
:
2auto
23sig
44-
65=
3brea
24siz
45*
66+=
4case
25sta
46&
67-=
5char
26str
47/
68*=
6cons
27swi
48%
69/=
7cont
28typ
49+
70%=
8defa
29uni
50-
71>
>
=
9do
30uns
51<
<
72<
10dou
31voi
52>
73&
11els
32vol
53<
74^=
12enu
33whi
54<
75|=
13ext
34(
55>
76,
14flo
35)
56>
77'
15for
36[
57==
78;
16got
37]
58!
79:
17if
38->
59&
80\{
18int
39.
60^
81}
19lon
40!
61|
82//
20reg
41~
62&
&
3、关键数据结构的描述
计数器count:
将二元组写入文件时通过count判断是否是首次写入,若是则清空文件,否则追加写入;
字符串常量endStr:
其值为“end”,在分析判断每一单词的种类时,该字符串作为rwtab表的结束标志;
数组prog[200]:
暂存从文件中读取的源程序代码,该词法分析器约定源代码长度不超过199;
数组token[20]:
暂存每次分离出的单个具有独立意义的单词,该词法分析器约定每个单词的长度不超过19;
结构体result:
存放一个单词的种别码和单词本身的值,在写入文件时以结构体中的元素为单位依次写入;
4、程序结构的描述
本程序采用结构化设计方法,共有两个文件,六个模块,分别介绍如下:
rwtab.h文件包含一个模块,即各种单词符号对应的种别码,作为外部文件被main.cpp文件引用。
main.cpp文件包含以下五个平行模块:
1)main()函数:
程序入口,控制整个程序的执行流程;
2)scanner()函数:
词法扫描程序;
3)print()函数:
由main()函数调用,判别每一个已识别单词的种类,并将其以结构体形式标准化;
4)readFromFile()函数:
由main()函数调用,将源程序代码读出,并暂存至数组prog[200]中;
5)writeToFile()函数:
由main()函数调用,把标准的二元组写入文件中。
三、程序运行截屏
四、源代码
#include<
stdio.h>
#include<
stdlib.h>
#include"
ctype.h"
string.h"
/**************************************判断字符区域*开始********************************************/
intcharacters_exist=0;
/*用来判断是否是纯数字*/
intcountoffinal=0;
/*finalresult函数执行的次数*/
intword(charch)/*判断是否为字母*/
{
intch_exist=0;
if(isalpha(ch))
{
ch_exist=1;
characters_exist=1;
}
return(ch_exist);
}
intdigit(charch)/*判断是否为数字*/
{
intdig_exist=0;
if(isdigit(ch))
dig_exist=1;
return(dig_exist);
intdelimiter(charch)/*判断是否是分界符*/
intdel_exist=0;
inti;
chardelimiters[13]={'
+'
'
-'
*'
/'
;
'
('
)'
='
'
#'
};
for(i=0;
i<
13;
i++)
if(ch==delimiters[i])
{
del_exist=1;
break;
}
}
return(del_exist);
intkeywordcompare(charkey[],charkeyword[])/*比较关键字*/
intm=0;
intequal=1;
while(keyword[m]!
)
if(key[m]==keyword[m])m++;
else
{
equal=0;
break;
}
return(equal);
intkeyword(charkey[])/*判断是否是关键字*/
charifkeyword[3]={'
i'
f'
charelsekeyword[5]={'
e'
l'
s'
charthenkeyword[5]={'
t'
h'
n'
charforkeyword[4]={'
o'
r'
charwhilekeyword[6]={'
w'
chardokeyword[3]={'
d'
charandkeyword[4]={'
a'
charnotkeyword[4]={'
charorkeyword[3]={'
intkeyword_exist=0;
if(keywordcompare(key,ifkeyword)||keywordcompare(key,elsekeyword)||keywordcompare(key,thenkeyword)||keywordcompare(key,forkeyword)||keywordcompare(key,whilekeyword)||keywordcompare(key,dokeyword)||keywordcompare(key,andkeyword)||keywordcompare(key,notkeyword)||keywordcompare(key,orkeyword))
keyword_exist=1;
return(keyword_exist);
/**************************************判断字符区域*结束********************************************/
/**************************************写入文件区域*开始********************************************/
voidwritetofile(charcha[])/*将数组cha[]写入文件Dualistic_formula*/
inti=0;
intnumberofspace=0;
/*用来实现写入文件时跳过过多的空格*/
FILE*fpa;
if((fpa=fopen("
Dualistic_formula"
"
a"
))==NULL)
printf("
cannotopenfileDualistic_formula\n"
);
exit(0);
while(cha[i]!
numberofspace<
=1)/*数组不结束且连续空格数最多为2时满足循环条件*/
if(cha[i]=='
)numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
fclose(fpa);
voidkeywordtofile(charcha[])/*将关键字写入文件keyword*/
keyword"
cannotopenfilekeyword\n"
if(cha[i]=='
voidwordstofile(charcha[])/*将标识符写入文件words*/
words"
cannotopenfilewords\n"
=1)/*数组不结束且连续空格数最多为2时满足循环条件*/
voiddigittofile(charcha[])/*将数字写入文件digit*/