编译原理报告 6.docx

上传人:b****2 文档编号:1847474 上传时间:2023-05-01 格式:DOCX 页数:15 大小:230.28KB
下载 相关 举报
编译原理报告 6.docx_第1页
第1页 / 共15页
编译原理报告 6.docx_第2页
第2页 / 共15页
编译原理报告 6.docx_第3页
第3页 / 共15页
编译原理报告 6.docx_第4页
第4页 / 共15页
编译原理报告 6.docx_第5页
第5页 / 共15页
编译原理报告 6.docx_第6页
第6页 / 共15页
编译原理报告 6.docx_第7页
第7页 / 共15页
编译原理报告 6.docx_第8页
第8页 / 共15页
编译原理报告 6.docx_第9页
第9页 / 共15页
编译原理报告 6.docx_第10页
第10页 / 共15页
编译原理报告 6.docx_第11页
第11页 / 共15页
编译原理报告 6.docx_第12页
第12页 / 共15页
编译原理报告 6.docx_第13页
第13页 / 共15页
编译原理报告 6.docx_第14页
第14页 / 共15页
编译原理报告 6.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理报告 6.docx

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

编译原理报告 6.docx

编译原理报告6

1.词法分析

1.1实验目的

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

1.2实验要求

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

(1)关键字:

beginifthenwhiledoend

所有的关键字都是小写

(2)运算符和界符:

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

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

ID=letter(letter|digit)*

NUM=digitdigit*

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

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

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

表1各种单词符号对应的种别码

单词符号

种别码

begin

1

if

2

then

3

while

4

do

5

end

6

letter(letter|digit)*

10

digitdigit*

11

+

13

-

14

*

15

/

16

单词符号

种别码

17

=

18

<

20

<>

21

<=

22

>

23

>=

24

=

25

26

27

28

#

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.主程序示意图

主程序示意图如图1所示。

其中初值包括如下两个方面。

(1)关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(成为关键字表),当扫描程序识别出标识符时,查关键字表。

如能查到匹配的单词,则该单词为关键字,否则为一般标识符。

关键字表为一个字符串数组,其描述如下:

char*rwtab[6]={“begin”,”if”,”then”,”while”,”do”,”end”};

(2)程序中需要用到的主要变量为syn,token和sum.

2.扫描子程序的算法思想

首先设置3个变量,1.token用来构成单词符号的字符串;2.sum用来存放整形单词3.syn用来存放单词符号的种别码。

扫描子程序的主要流程部分如图2所示。

图1词法分析主程序示意图

图2.词法分析程序流程

1.4函数与使用说明

charinput[255];/*输入缓冲区*/

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

intp_input;/*输入缓冲区指针*/

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

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

/*可扩充的关键数组*/

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

typedefstruct/*单词二元组的结构,可以根据需要继续扩充*/

{

inttypenum;

char*word;

}WORD;

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

charm_getch();/*需要用到的自编函数从缓冲区读取的一个字符到ch中*/

voidgetbc();/*去掉空白符号*/

voidconcat();/*拼接单词*/

intletter();/*判断是否是字母*/

intdigit();/*判读是否为数字*/

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

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

1.5实验与体会

本实验首先要求输入源程序存入到输入缓冲区中。

然后不断地读取源程序。

根据构成规则,标识符必须是以字母开头的,即ID=letter(letter|digit)*。

则在scaner函数的匹配规则中,当其判断是否为标识符,会首先判断读入的第一个字符,如果其为字母,则继续判断直至把该字符串读取完毕,直至读取的字符不为字母或数字,则读取完毕,然后对其与单词符号进行匹配,确定其为关键字还是标识符。

匹配结束,退回一个字符。

这样每次再进行匹配时都需要读入一个新字符,起点相同。

若是第一次读入的是数字,则下次匹配的只能是数字,当读入的不是数字时,退回一个字符,确定读入的字符串为数字。

然后重新匹配。

其他的会根据事先约定好的算符进行匹配。

在这里仅有词法的分析,机械性的匹配,所以当出现“123abc234”时,匹配的字符串为两个,“123”和“abc234”。

1.6程序执行结果

图3运行结果

图4运行结果

2.语法分析

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语法分析程序的算法思想

(1)主程序示意图如图3所示。

(2)递归下降分析示意图如图4所示。

(3)语句串分析过程示意图如图5所示。

(4)Statement语句分析函数流程图如图6、图7、图8、图9所示。

图5语法分析主程序示意图

图6递归下降分析程序示意图

图7语句串分析示意图

图8statement语句分析示意图

图9expression表达式分析函数示意图

图10term分析函数示意图

图11factor分析过程示意图

2.4函数与使用说明

语法分析是在语义分析的基础上做的,故在词法分析里介绍的函数这里不再重复介绍,仅对新出现的函数做结束

intIrparser();

/*本函数开始对语句串的分析,其先判断以一个输入的是否为“begin”关键字,若是的话调用yucu()函数*/

intIrparser(){

if(oneword->typenum==1){

oneword=scaner();

yucu();

if(oneword->typenum==6){

oneword=scaner();

if(oneword->typenum==1000&&(kk==0))

printf("success");

}else{if(kk!

=1)printf("缺'end'错误;");kk=1;}

}else{

printf("输出'begin'错误");kk=1;

}

return0;

}

 

intfactor(){

if(oneword->typenum==10||oneword->typenum==11){

oneword=scaner();

}elseif(oneword->typenum==27){

oneword=scaner();

expression();

if(oneword->typenum==28)

oneword=scaner();

else{

printf("')'错误");

kk=1;

}

}else{

printf("输出表达错误\n");

kk=1;

}

return0;

}

intterm(){

factor();

while(oneword->typenum==15||oneword->typenum==16){

oneword=scaner();

factor();

}

return0;

}

 

intexpression(){

term();

while(oneword->typenum==13||oneword->typenum==14){

oneword=scaner();

term();

}

return0;

}

intstatement(){

if(oneword->typenum==10){

oneword=scaner();

if(oneword->typenum==18){

oneword=scaner();

expression();

}else{

printf("赋值号错误\n");

kk=1;

}

}

else{

printf("赋值语句错误\n");

kk=1;

}

return0;

}

intyucu(){

statement();

/*当是分号时,读入新单词*/

while(oneword->typenum==26){

oneword=scaner();

statement();

}

return0;

}

2.5实验与体会

本次的语法分析是在词法分析的基础之上做的,采用的是递归下降的分析程序。

程序会首先判定第一个输入字符是不是“begin”,不是的话直接报错,如果满足条件再进行下面的分析。

在总控程序的下面又分成很多子程序,相互调用。

输入字符串后首先检查是否第一个是否是输入了关键字“begin”,不是直接报错。

如果是的话则需要检测第二个是否是标识符,不是的话直接报错,若是的话检测下一个标识符是否为赋值符“:

=”,不是的话报错。

是的话检测是否为标识符或者数字,不是的话直接报错。

是的话调用,直至此赋值语句结束。

最后检测是否以关键字“end”结束。

本语法分析比较简单,只实现了对赋值语句的判断。

其他的判断没有实现,故若出现了除“begin”和“end”以外的关键字会报错。

2.6程序执行结果

图12语义分析执行结果

图13语义分析执行结果

实验总结

通过这两次上机实验我更加清楚的明白了词法分析和语法分析的原理,对词法分析与语法分析有了更加清楚的认识。

词法分析的逻辑相对简单,因为课本上代码很完善,实现起来很容易。

难点是语法分析,在理解课本上的代码时,因为很多函数之间是相互调用的关系,因此写函数的时候很困难。

在课本上提供了源码的基础上写起来难度大大降低,但是如果全部是自己写的话,难度会很大。

这不但是对我基础知识掌握的考验,也是对我编程能力的考验。

上机实验最重要的就是对课本的只是进行巩固,同时提高自己的编程能力,我在这两方面还应该继续加强。

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

当前位置:首页 > 总结汇报 > 学习总结

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

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