编译原理实验之词法分析程序.docx

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

《编译原理》实验报告

——之词法分析程序

姓名:卢旭

学号:U200917806

班级:软工0901班

2011年10月22日

目录

TOC\o1-3\h\z\u一、实验题目 3

二、实验目的 3

三、实验要求 4

四、实验报告 4

总体设计思想 4

详细算法设计 4

流程框图 5

函数相关说明 6

输入与输出 10

程序运行结果 11

词法分析器使用说明 12

心得与体会 12

源程序清单 12

一、实验题目

对下述单词表定义的语言设计编制一个词法分析器。

各种单词符号对应的种别码如下表:

单词符号

种别编码

begin

1

if

2

then

3

while

4

do

5

end

6

l(l|d)*

10

dd*

11

+

13

-

14

*

15

/

16

:

17

:=

18

20

21

=

22

23

=

24

=

25

;

26

(

27

)

28

#

0

二、实验目的

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

三、实验要求

处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。

四、实验报告

总体设计思想

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

详细算法设计

设置3个初值变量和一个关键字表:

chartoken[8]用来存放构成单词符号的字符串;

doublesum用来存放无符号整数或者浮点数;

intsyn用来存放单词符号的种别码;

关键字表:char*rwtab[6]={“begin”,”if”,”then”,”while”,”do”,”end”};

设置重要的全局变量:

charch用来存放当前镀金的源程序字符;

charprog[80]用来存放所有用户输入的字符;

intisDecimal是否为浮点数,值为1表示为浮点数,否那么不是浮点数

doubledecimal双精度,浮点数的小数局部

intisE是否为指数形式表示的浮点数,值为1:表示是指数形式表示的浮点数

intindex指数形式的幂

intisNeg是否为负数幂,值为1:表示为负数幂

设置关键的函数:

voidscanner()词法扫描程序

getchar()从控制台读取一个字符数据

intstrcmp(char*str1,char*str2),字符串的比拟

doublepow(doublex,doubley)计算x的y次幂

流程:

记录下输入的源程序字符串

调用scanner()函数对字符串进行各种关键字、运算符和界符、数字的扫描匹配,并且给出相应的种别码,输出单词二元组

流程框图

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

图C.2词法分析程序流程

函数相关说明

getchar()该函数用来接收用户输入:

借助do……while()循环来记录用户输入的源程序字符串

do{

ch=getchar();//将用户输入的字符读入到ch变量中

prog[p++]=ch;//将字符存于数组中

}while(ch!=‘#’);//当用户输入’#’号时,结束输入。

scanner()该函数用来扫描源程序字符串并进行区别分类

如果是字母字符,那么进行关键字的匹配:

if(((ch=a)(ch=z))||((ch=A)(ch=Z)))//ch是字母字符

{

while(((ch=a)(ch=z))||((ch=A)(ch=Z))||((ch=0)(ch=9)))

{

token[m++]=ch;//ch=token以便进行关键字的匹配

ch=prog[p++];//读下一个字符

}

token[m++]=\0;

p--;//回退一格

syn=10;//标识符

//判断是否是begin,if,then,while,do,end标识符中的一个

for(n=0;n6;n++)

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

{

syn=n+1;

break;

}

}

对数字进行判断,并且进行数值的计算:

else if((ch=0)(ch=9))//对数字进行识别

{

IsNum://在此处设置一个goto的标识符以便实现“数字识别代码段”的复用

if(isSignal==1)

{

//token[m++]=-;

}

while((

文档评论(0)

199****4744 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7002121022000045

1亿VIP精品文档

相关文档