编译原理报告.doc

上传人:聆听****声音 文档编号:725761 上传时间:2023-04-29 格式:DOC 页数:28 大小:602KB
下载 相关 举报
编译原理报告.doc_第1页
第1页 / 共28页
编译原理报告.doc_第2页
第2页 / 共28页
编译原理报告.doc_第3页
第3页 / 共28页
编译原理报告.doc_第4页
第4页 / 共28页
编译原理报告.doc_第5页
第5页 / 共28页
编译原理报告.doc_第6页
第6页 / 共28页
编译原理报告.doc_第7页
第7页 / 共28页
编译原理报告.doc_第8页
第8页 / 共28页
编译原理报告.doc_第9页
第9页 / 共28页
编译原理报告.doc_第10页
第10页 / 共28页
编译原理报告.doc_第11页
第11页 / 共28页
编译原理报告.doc_第12页
第12页 / 共28页
编译原理报告.doc_第13页
第13页 / 共28页
编译原理报告.doc_第14页
第14页 / 共28页
编译原理报告.doc_第15页
第15页 / 共28页
编译原理报告.doc_第16页
第16页 / 共28页
编译原理报告.doc_第17页
第17页 / 共28页
编译原理报告.doc_第18页
第18页 / 共28页
编译原理报告.doc_第19页
第19页 / 共28页
编译原理报告.doc_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

编译原理报告.doc

《编译原理报告.doc》由会员分享,可在线阅读,更多相关《编译原理报告.doc(28页珍藏版)》请在冰点文库上搜索。

编译原理报告.doc

课程设计报告

课程名称:

编译原理

专业班级:

信息安全1302班

学号:

姓名:

指导教师:

报告日期:

2015年11月10日

计算机科学与技术学院

目录

目录 1

实验一词法分析 3

1.1实验目的 3

1.2实验要求 3

1.3实验原理 4

1.4算法实现 6

1.5实验结果 6

实验二语法分析 8

2.1实验目的 8

2.2实验要求 8

2.3实验原理 8

2.4算法实现 12

2.5实验结果 13

总结和体会 15

附录 16

实验一词法分析

1.1实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

1.2实验要求

1.待分析的简单语言的词法

(1)关键字

beginifthenwhiledoend

所有的关键字都是小写。

(2)运算符和界符:

:

=+-*/<<=<>>>==;()#

(3)其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:

ID=letter(letter|digit)*

NUM=digitdigit*

(4)空格由空白、制表符和换行符组成。

空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.各种单词符号对应的种别码。

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:

=

18

then

3

<

20

while

4

<>

21

do

5

<=

22

end

6

>

23

letter(letter|digit)*

10

>=

24

digitdigit*

11

=

25

+

13

;

26

-

14

27

*

15

28

/

16

#

0

3.词法分析程序的功能

输入:

所给文法的源程序字符串。

输出:

二元组(syn,token或sum)构成的序列

其中:

syn为单词种别码;

token为存放的单词自身字符串;

sum为整形常数。

例如:

对源程序

beginx:

=9;ifx>0thenx:

=2*x+1/3;end#

的源文件,经词法分析后输出如下序列:

(1,begin)(10,’x’)(18,:

=)(11,9)(26,;)(2,if)…

1.3实验原理

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

1.3.1主程序流程

程序从文件中得到相应的代码段,之后对缓存区的数据进行词法分析,此番分析的结构流程图如图3.1所示:

图3.1主程序流程图

1.3.2扫描子程序

扫描子程序会对缓存区中的代码根据关键字表进行判定,并未每一个代码生成其对应的二元组。

程序结构如图3.2所示:

图3.2扫描子程序流程图

1.3.3函数及变量设计

扫描开始之前需要在程序中预设,或者从文件中读取一个关键字表,并根据关键字表对程序进行词法分析,彼此实验关键字表预设在程序开始前定义的一个char型数组中,其定义格式如下:

char*rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};

其中KEY_WORD_END为关键字结束标志

生成的二元组存储在一个数据结构中,数据结构定义如下:

typedefstruct

{

inttypenum;/*种别码*/

char*word;

}WORD;

数据结构内容包括种别码和相应单词。

1.4算法实现

1.4.1变量设计

程序中所用主要变量定义形式如下:

typedefstruct /*二元组结构*/

{

inttypenum; /*种别码*/

char*word;

}WORD;

charinput[255];/*源程序缓字符冲区*/

chartoken[255]="";/*单词缓冲区*/

intp_input;/*源程序字符指针*/

intp_token;/*单词缓冲区指针*/

charch; /*当前读入字符*/

char*rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};

/*关键字表*/

1.4.2函数设计

程序中涉及的函数定义形式如下

charm_getch() /*从输入源读一个字符到CH中*/

voidgetbc() /*去掉空白字符*/

voidconcat() /*拼接单词*/

intletter() /*判断是否是单词*/

intdigit() /*判断是否是数字*/

intreserve() /*检索关键字表格*/

voidretract() /*回退一个字符*/

WORD*scaner() /*词法扫描程序*/

1.4.3函数代码

函数代码见附录。

1.5实验结果

测试代码存储在文件中,代码如下:

程序运行结果如下:

实验二语法分析

2.1实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

2.2实验要求

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

1.待分析的简单语言的语法

用扩充的BNF表示如下:

(1)<程序>:

:

=begin<语句串>end

(2)<语句串>:

:

=<语句>{;<语句>}

(3)<语句>:

:

=<赋值语句>

(4)<赋值语句>:

:

=ID:

=<表达式>

(5)<表达式>:

:

=<项>{+<项>|-<项>}

(6)<项>:

:

=<因子>{*<因子>|/<因子>}

(7)<因子>:

:

=ID|NUM|(<表达式>)

2.实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

例如:

输入begina:

=9;x:

=2*3;b:

=a+xend#

输出success

输入x:

=a+b*cend#

输出error

2.3实验原理

语法分析程序以实验一中实现的词法分析程序为基础。

能够判断一段代码是否符合语法规则。

2.3.1主程序流程

程序从文件中得到相应的代码段,之后对缓存区的数据进行分析,分析的结构流程图如图3.1所示:

图3.1主程序流程图

2.3.2递归下降分析程序

递归下降分析程序出错处理包括三种,若第一个单词符号不是begin,则会输出“nobeginerror!

”,若最后一个单词不是end而且kk!

=1,则输出“noenderror!

”,若end之后不是标识符“#”而是其他内容,则输出“threeshouldnotbeanythingafterend”。

程序流程图如图3.2所示:

图3.2递归下降分析程序流程图

2.3.3语句串分析程序

程序流程图如图3.3所示:

图3.3语句串分析程序流程图

2.3.4赋值语句分析程序

程序流程图如图3.4所示:

图3.4赋值语句分析程序流程图

2.3.5表达式分析程序

程序流程图如图3.5所示:

图3.5表达式分析程序流程图

2.3.6项分析程序

程序流程图如图3.6所示:

图3.6项分析程序流程图

2.3.7因子分析程序

程序流程图如图3.7所示:

图3.7因子分析程序流程

2.4算法实现

函数代码见附录。

2.5实验结果

测试代码存储在文件中

代码正确时:

程序运行结果如下:

缺少begin时:

程序运行结果如下:

缺少end时:

程序运行结果如下:

end之后不是#时:

程序运行结果如下:

由实验结果可以看出,程序正确的分析出了代码的各种错误,结果达到了预期要求。

总结和体会

通过此次的上机实验,我对于编译原理这门课的实际应用从一无所知到熟练掌握,学到了很多东西。

在刚刚接触这门课程时,以为理论的东西会占据绝大部分的课程,但是,通过上机实验看到了这门课程生动活泼的一面。

原来不仅仅是理论知识,我们也可以向其他实用课程一样,写出自己的编译器来,虽然实现的功能十分简单,但是,这样的实验确实要比纯理论来的好。

实验课上进行的内容,包括了课堂上讲解的绝大部分内容,更是将几部分的内容串联到了一起进行设计,这对于理解整个课程的内容,理解编译工作的原理有着很大的帮助。

此外,处理自己动手编写程序之外,还可以借助现成的分析工具进行相应的分析工作,这样做不仅节省的时间,而且能够大大避免错误的出现。

也不失为一种生成编译程序的好办法。

附录

附录一:

词法分析程序

#include

#include

#include

#define_KEY_WORD_END"waitingfouyourexpanding"/*定义关键字的结束标志*/

typedefstruct

{

inttypenum;/*种别码*/

char*word;

}WORD;

charinput[255];/*源程序缓字符冲区*/

chartoken[255]="";/*单词缓冲区*/

intp_input;/*源程序字符指针*/

intp_token;/*单词缓冲区指针*/

charch;

char*rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};

WORD*scaner();/*词法扫描函数,获得一个单词*/

intmain()

{

FILE*fin;

intover=1;

intcount=0;

WORD*oneword=newWORD;

while

(1){

printf("\n在文件中输入代码(按任意键开始):

");

getchar();

fin=fopen("test.txt","r");

fscanf(fin,"%[^#]s",input);

fclose(fin);

//scanf("%[^#]s",input);/*输入源程序字符串到缓冲区,以#结束*/

p_input=0;

printf("词法分析结果是:

\n\n");

count=0;

while(over<1000&&over!

=-1)

{

oneword=scaner();

if(oneword->word=="OVER")

break;

elseif(oneword->typenum<1000)

printf("(%d,%s)",oneword->typenum,oneword->word);

over=oneword->typenum;

count++;

if(count%6==0)printf("\n");//每六行输出

}

printf("(#,0)");

}

return0;

}

charm_getch()/*从输入源读一个字符到CH中*/

{

ch=input[p_input];

p_input=p_input+1;

returnch;

}

voidgetbc()/*去掉空白字符*/

{

while(ch==''||ch==10||ch==9)

{

ch=input[p_input];

p_input=p_input+1;

}

}

voidconcat()/*拼接单词*/

{

token[p_token]=ch;

p_token=p_token+1;

token[p_token]='\0';

}

intletter()/*判断是否是单词*/

{

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

return1;

elsereturn0;

}

intdigit()/*判断是否是数字*/

{

if(ch>='0'&&ch<='9')

return1;

elsereturn0;

}

intreserve()/*检索关键字表格*/

{

inti=0;

while(strcmp(rwtab[i],_KEY_WORD_END))

{

if(!

strcmp(rwtab[i],token))

{

returni+1;

}

i=i+1;

}

return10;

}

voidretract()/*回退一个字符*/

{

p_input=p_input-1;

}

char*dtb()

{

returnNULL;

}

WORD*scaner()/*词法扫描程序*/

{

WORD*myword=newWORD;

myword->typenum=10;

myword->word="";

p_token=0;

m_getch();

getbc();

if(letter())

{

while(letter()||digit())

{

concat();

m_getch();

}

retract();

myword->typenum=reserve();

myword->word=token;

returnmyword;

}

elseif(digit())

{

while(digit())

{

concat();

m_getch();

}

retract();

myword->typenum=11;

myword->word=token;

returnmyword;

}

elseswitch(ch)

{

case'=':

m_getch();

if(ch=='=')

{

myword->typenum=29;

myword->word="==";

returnmyword;

}

retract();

myword->typenum=25;

myword->word="=";

returnmyword;

break;

case'+':

myword->typenum=13;

myword->word="+";

returnmyword;

break;

case'-':

myword->typenum=14;

myword->word="-";

returnmyword;

break;

case'*':

myword->typenum=15;

myword->word="*";

returnmyword;

break;

case'/':

myword->typenum=16;

myword->word="/";

returnmyword;

break;

case'(':

myword->typenum=27;

myword->word="(";

returnmyword;

break;

case')':

myword->typenum=28;

myword->word=")";

returnmyword;

break;

case'[':

myword->typenum=30;

myword->word="[";

returnmyword;

break;

case']':

myword->typenum=31;

myword->word="]";

returnmyword;

break;

case'{':

myword->typenum=32;

myword->word="{";

returnmyword;

break;

case'}':

myword->typenum=33;

myword->word="}";

returnmyword;

break;

case',':

myword->typenum=34;

myword->word=",";

returnmyword;

break;

case':

':

if(input[p_input]=='=')

{

myword->typenum=18;

myword->word=":

=";

returnmyword;

}

else

myword->typenum=17;

myword->word=":

";

returnmyword;

break;

case';':

myword->typenum=26;

myword->word=";";

returnmyword;

break;

case'>':

m_getch();

if(ch=='=')

{

myword->typenum=24;

myword->word=">=";

returnmyword;

}

retract();

myword->typenum=23;

myword->word=">";

returnmyword;

break;

case'<':

m_getch();

if(ch=='=')

{

myword->typenum=22;

myword->word="<=";

returnmyword;

}

retract();

myword->typenum=20;

myword->word="<";

returnmyword;

break;

case'!

':

m_getch();

if(ch=='=')

{

myword->typenum=40;

myword->word="!

=";

returnmyword;

}

retract();

myword->typenum=-1;

myword->word="ERROR";

returnmyword;

break;

case'\0':

myword->typenum=100;

myword->word="OVER";

returnmyword;

break;

default:

myword->typenum=-1;

myword->word="ERROR";

returnmyword;

}

}

附录二:

语法分析程序

#include

#include

#include

intsyn,p_input,p_token,kk;

charch;

charinput[100];

chartoken[100]="";

char*key_words[]={"begin","if","then","while","do","end"};

intexpression();

voidm_getch();

intletter();

intdigit();

intcompare();

voidc_token();

voidscaner();

intlrparser();

intyuju();

voidscaner();

voidm_getch();

voidc_token();

intcompare();

intletter();

intdigit();

intexpression();

intfactor();

intterm();

intstatement();

intmain()

{

FILE*fin;

charbuffer[100];

intsize;

while

(1){

printf("\n按任意键开始从文件中读取信息进行分析!

\n");

getchar();

if((fin=fopen("test.txt","r"))==NULL)

{

printf("Cannotopenthefile!

\n");

exit(-1);

}

fin=fopen("test.txt","r");

while(fgets(buffer,100,fin)!

=NULL)

{

strcat(input,buffer);

}

lrparser();

//printf("\npress#toexit:

\n");

//s

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

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2