编译原理实验报告1.docx

上传人:b****3 文档编号:2974393 上传时间:2022-11-16 格式:DOCX 页数:25 大小:69.09KB
下载 相关 举报
编译原理实验报告1.docx_第1页
第1页 / 共25页
编译原理实验报告1.docx_第2页
第2页 / 共25页
编译原理实验报告1.docx_第3页
第3页 / 共25页
编译原理实验报告1.docx_第4页
第4页 / 共25页
编译原理实验报告1.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

编译原理实验报告1.docx

《编译原理实验报告1.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告1.docx(25页珍藏版)》请在冰豆网上搜索。

编译原理实验报告1.docx

编译原理实验报告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*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1