编译原理实验报告一简单样本语言的词法分析器.docx

上传人:b****6 文档编号:5102581 上传时间:2022-12-13 格式:DOCX 页数:10 大小:147.96KB
下载 相关 举报
编译原理实验报告一简单样本语言的词法分析器.docx_第1页
第1页 / 共10页
编译原理实验报告一简单样本语言的词法分析器.docx_第2页
第2页 / 共10页
编译原理实验报告一简单样本语言的词法分析器.docx_第3页
第3页 / 共10页
编译原理实验报告一简单样本语言的词法分析器.docx_第4页
第4页 / 共10页
编译原理实验报告一简单样本语言的词法分析器.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

编译原理实验报告一简单样本语言的词法分析器.docx

《编译原理实验报告一简单样本语言的词法分析器.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告一简单样本语言的词法分析器.docx(10页珍藏版)》请在冰豆网上搜索。

编译原理实验报告一简单样本语言的词法分析器.docx

编译原理实验报告一简单样本语言的词法分析器

昆明理工大学信息工程与自动化学院学生实验报告

(2012—2013学年第一学期)

课程名称:

开课实验室:

2012年12月03日

年级、专业、班

学号

姓名

成绩

实验项目名称

简单样本语言的词法分析器

指导教师

教师评语

该同学是否了解实验原理:

A.了解□B.基本了解□C.不了解□

该同学的实验能力:

A.强□B.中等□C.差□

该同学的实验是否达到要求:

A.达到□B.基本达到□C.未达到□

实验报告是否规范:

A.规范□B.基本规范□C.不规范□

实验过程是否详细记录:

A.详细□B.一般□C.没有□

教师签名:

年月日

一、实验目的及内容

编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的内容,用来完成一个小型编译程序。

从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。

调试并完成一个词法分析程序,加深对词法分析原理的理解。

二、实验原理及基本技术路线图(方框原理图或程序流程图)

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为整型常数。

二、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC以及VISUALC++6.0软件。

三、实验方法、步骤(或:

程序代码或操作过程)

(1)程序代码:

#include

#include

#include

charprog[80],token[8];

charch;

intsyn,p,m=0,n,row,sum=0;

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

voidscaner()

{

for(n=0;n<8;n++)token[n]=NULL;

ch=prog[p++];

while(ch=='')

{

ch=prog[p];

p++;

}

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

{

m=0;

while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{

token[m++]=ch;

ch=prog[p++];

}

token[m++]='\0';

p--;

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

}

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

{

{

sum=0;

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

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

}

p--;

syn=11;

if(sum>32767)

syn=-1;

}

elseswitch(ch)

{

case'<':

m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='>')

{

syn=21;

token[m++]=ch;

}

elseif(ch=='=')

{

syn=22;

token[m++]=ch;

}

else

{

syn=23;

p--;

}

break;

case'>':

m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{

syn=24;

token[m++]=ch;

}

else

{

syn=20;

p--;

}

break;

case':

':

m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{

syn=18;

token[m++]=ch;

}

else

{

syn=17;

p--;

}

break;

case'*':

syn=13;token[0]=ch;break;

case'/':

syn=14;token[0]=ch;break;

case'+':

syn=15;token[0]=ch;break;

case'-':

syn=16;token[0]=ch;break;

case'=':

syn=25;token[0]=ch;break;

case';':

syn=26;token[0]=ch;break;

case'(':

syn=27;token[0]=ch;break;

case')':

syn=28;token[0]=ch;break;

case'#':

syn=0;token[0]=ch;break;

case'\n':

syn=-2;break;

default:

syn=-1;break;

}

}

voidmain()

{

p=0;

row=1;

cout<<"Pleaseinputstring:

"<

do

{

cin.get(ch);

prog[p++]=ch;

}

while(ch!

='#');

p=0;

do

{

scaner();

switch(syn)

{

case11:

cout<<"("<

case-1:

cout<<"Errorinrow"<

"<

case-2:

row=row++;break;

default:

cout<<"("<

}

}

while(syn!

=0);

}

(2)创建编辑程序

 

(3)连接、编译和调试程序

 

(4)运行程序

 

五、实验过程原始记录(测试数据、图表、计算等)

(1)给定源程序

beginx:

=8;ifx>0thenx:

=2*x+1/5;end#

输出结果

 

(2)源程序(包括上式未有的while、do以及判断错误语句):

begin

x<=$;

while

a<0

do

b<>9-x;

end

#

 

六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)

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

通过本试验的完成,更加加深了对词法分析原理的理解。

通过这次实验,我对编译原理这门专业必修课有了进一步的深层次了解,把理论知识应用于实验中,也让我重新熟悉了C++语言的相关内容,加深了对C++语言知识的深化和用途的理解。

相信在以后的毕业设计以及读研自己做项目时可以有更大的提升。

同时这次试验让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。

另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。

比如:

main()函数中,用cin>>ch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。

另外,我在程序中加入了row变量,以便能够准确得到错误所在。

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

当前位置:首页 > 高等教育 > 军事

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

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