编译原理实验报告1.docx
- 文档编号:2974393
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:25
- 大小:69.09KB
编译原理实验报告1.docx
《编译原理实验报告1.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告1.docx(25页珍藏版)》请在冰豆网上搜索。
编译原理实验报告1
编译原理
实验报告
专业:
计算机科学与技术
班级:
08-01班
姓名:
朱小燕
学号:
200807010156
一、实验目的
通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。
二、词法分析器的实现
1、词法分析过程的考虑
词法分析器的任务是将程序源代码看做一个字符串,只需从中分离出一个个具有独立意义的单词(包括标识符,符号和常量)即可,而无需考虑其在上下文环境中的正确性。
基于此认识,词法分析的过程可如下描述:
本程序中用户源程序存储在文件“E:
\prog.txt”文件中,程序首先调用readFromFile()函数将源程序代码从文件中读出,放到数组中暂存,然后主函数调用scaner()函数对其进行逐个扫描,分离出的每个独立单词进行分类判断,构成二元组形式,再将其输出的文件“E:
\result.txt”中进行保存。
2、各种单词符号对应的种别码
0标识符
21ret
42++
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
#include
#include"ctype.h"
#include"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','e','#'};
charthenkeyword[5]={'t','h','e','n','#'};
charforkeyword[4]={'f','o','r','#'};
charwhilekeyword[6]={'w','h','i','l','e','#'};
chardokeyword[3]={'d','o','#'};
charandkeyword[4]={'a','n','d','#'};
charnotkeyword[4]={'n','o','t','#'};
charorkeyword[3]={'o','r','#'};
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*/
{
inti=0;
intnumberofspace=0;/*用来实现写入文件时跳过过多的空格*/
FILE*fpa;
if((fpa=fopen("keyword","a"))==NULL)
{
printf("cannotopenfilekeyword\n");
exit(0);
}
while(cha[i]!
='#'&&numberofspace<=1)/*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]=='')numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
voidwordstofile(charcha[])/*将标识符写入文件words*/
{
inti=0;
intnumberofspace=0;/*用来实现写入文件时跳过过多的空格*/
FILE*fpa;
if((fpa=fopen("words","a"))==NULL)
{
printf("cannotopenfilewords\n");
exit(0);
}
while(cha[i]!
='#'&&numberofspace<=1)/*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]=='')numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
voiddigittofile(charcha[])/*将数字写入文件digit*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告