词法分析器含完整源码Word格式.docx

上传人:b****2 文档编号:14109581 上传时间:2022-10-18 格式:DOCX 页数:22 大小:225.48KB
下载 相关 举报
词法分析器含完整源码Word格式.docx_第1页
第1页 / 共22页
词法分析器含完整源码Word格式.docx_第2页
第2页 / 共22页
词法分析器含完整源码Word格式.docx_第3页
第3页 / 共22页
词法分析器含完整源码Word格式.docx_第4页
第4页 / 共22页
词法分析器含完整源码Word格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

词法分析器含完整源码Word格式.docx

《词法分析器含完整源码Word格式.docx》由会员分享,可在线阅读,更多相关《词法分析器含完整源码Word格式.docx(22页珍藏版)》请在冰豆网上搜索。

词法分析器含完整源码Word格式.docx

(2)、测试2:

能输出结果:

单词符号(码形式)、各种信息表(如符号表、常量表等);

(3)、测试程序:

varx,y,z;

begin

x:

=2;

y:

=3;

if(x+5>

=y*y)then

begin

z:

=y*y-x;

=z+x*x;

end

else

=x+y;

prnz;

end.

(4)、结果:

①、从键盘读入;

部分结果如下:

(类型:

该标识符所属的类型,如关键字,变量等;

下标:

该标识符所对应表(如变量标识符表,常量标识符表等)中其相应的位置,下同)

②、从文件读入,输出到文件;

其他测试及结果如下:

③、出错处理;

注:

若有错误,则只指出错误,不输出各个表;

(5)、评价:

这个小语言程序基本上能完成词法分析阶段的工作,识别诸如begin,if等保留字;

在扫描源程序串的同时,能进行一些简单的处理,如删除空格、tab、换行等无效字符,也进行了一些基本的错误处理,如变量长度的判别等。

遇到的问题:

(a)、判别标识符超过规定长度(20)时,未输出处理结果;

(b)、整数长度过长输出结果仍为整数类型3;

(c)、对于小数如﹒045,被解释为界符和整数;

(d)、对以数字开头的一般标识符的处理,如100nuts被解释为整数类型和标识符,未给出错误提示。

如上测试,出现前两个问题时已报错并输出所在行,而后两个问题待解决。

2、对小语言的词法规则(正规式)画出一个确定的有限自动机(见附录2、3)

四、实验的源代码:

(见附录1)

五、实验中发现的问题和遇到的困难及解决方法:

由于以前未曾接触过编译原理,在该实验的设计中,的确遇到一定的困难。

主要是display表结构的设计,由于语法分析和语义分析还未学习,无法站在全局的角度统筹兼顾,在表结构设计时,不知该往表结构体中添加哪些容,可以为后续的工作做铺垫,这是刚开始就遇到的最大的困难,也是最难的。

经过分析,我们在现有局限性的基础上,设计出一种折中的表结构,即在表结构中只添加标识符在其相应表中的对应下表,标记符类型码等关键的几处,这样既能唯一确定一标识符,达到该实验的要求,同时又为表保留了很好的扩充性,以达到后续实验的要求。

表结构设计好后,其余的工作就是提取字符串和写入display表,在提取单字符还是双字符组成的运算符时有些麻烦,不过利用数据结构的相关知识也是容易做到。

六、总结:

词法分析是构造编译器的起始阶段,也是相应比较简单的一个环节。

词法分析的主要任务是:

根据构造的状态转换图,从左到右逐个字符地対源程序进行扫描,识别开源程序中具有独立含义的最小语法单位——符号或单词,如变量标识符,关键字,常量,运算符,界符等。

然后将提取出的标识符以码的形式表示,即用int类型的数字来表示其类型和在display表中的位置,而无须保留原来标识符本身的字符串,这不仅节省了存空间,也有利于下一阶段的分析工作。

当然,在扫描源程序串的同时,进行一些简单的处理,如删除空格、tab、换行等无效字符,也进行了一些基本的错误处理,如变量长度的判别,有些不合词法规则的标识符判别等。

总之,严格说来,词法分析程序只进行和词法分析相关的工作。

七、实验感想:

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;

熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。

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

附录1(代码)

#include<

iostream>

fstream>

string>

math.h>

ctype.h>

cstdlib>

usingnamespacestd;

#defineMax655//最大代码长度

#defineWordMaxNum256//变量最大个数

#defineDigitNum256//常量最大个数

#defineMaxKeyWord32//关键字数量

#defineMaxOptANum8//运算符最大个数

#defineMaxOptBNum4//运算符最大个数

#defineMaxEndNum11//界符最大个数

typedefstructDisplayTable

{

intIndex;

//标识符所在表的下标

inttype;

//标识符的类型

intline;

//标识符所在表的行数

charsymbol[20];

//标识符所在表的名称

}Table;

intTableNum=0;

//display表的下标

charWord[WordMaxNum][20];

//标识符表

charDigit[WordMaxNum][20];

//数字表

intWordNum=0;

//变量表的下标

intDigNum=0;

//常量表的下标

boolerrorFlag=0;

//错误标志

constchar*constKeyWord[MaxKeyWord]={"

and"

"

array"

begin"

case"

"

char"

"

constant"

do"

else"

end"

false"

for"

if"

input"

integer"

not"

of"

or"

output"

packed"

procedure"

program"

read"

real"

repeat"

set"

then"

to"

type"

until"

var"

while"

with"

prn"

};

//关键字

constcharOptA[]={'

+'

'

-'

*'

/'

='

#'

<

'

>

//单目运算

constchar*OptB[]={"

="

:

"

//双目运算符

constcharEnd[]={'

('

'

)'

'

;

.'

['

]'

{'

}'

//界符

voiderror(charstr[20],intnLine,interrorType)

{

cout<

\nError:

switch(errorType)

case1:

cout<

第"

<

nLine-1<

行"

str<

变量的长度超过限制!

\n"

errorFlag=1;

break;

case2:

小数点错误!

case3:

常量的长度超过限制!

}

}//error

voidScanner(charch[],intchLen,Tabletable[Max],intnLine)

intchIndex=0;

while(chIndex<

chLen)//对输入的字符扫描

/**************************处理空格和tab************************/

while(ch[chIndex]=='

'

||ch[chIndex]==9)//忽略空格和tab

{chIndex++;

/***************************处理换行符*************************************/

while(ch[chIndex]==10)//遇到换行符,行数加1

{nLine++;

chIndex++;

}

/***************************标识符***************************************/

if(isalpha(ch[chIndex]))//以字母、下划线开头

{

charstr[256];

intstrLen=0;

while(isalpha(ch[chIndex])||ch[chIndex]=='

_'

)//是字母、下划线

{

str[strLen++]=ch[chIndex];

chIndex++;

while(isdigit(ch[chIndex]))//不是第一位,可以为数字

{

str[strLen++]=ch[chIndex];

chIndex++;

}

}

str[strLen]=0;

//字符串结束符

if(strlen(str)>

20)//标识符超过规定长度,报错处理

error(str,nLine,1);

else{inti;

for(i=0;

i<

MaxKeyWord;

i++)//与关键字匹配

if(strcmp(str,KeyWord[i])==0)//是关键字,写入table表中

strcpy(table[TableNum].symbol,str);

table[TableNum].type=1;

table[TableNum].line=nLine;

table[TableNum].Index=i;

TableNum++;

break;

if(i>

=MaxKeyWord)//不是关键字

{

t

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

当前位置:首页 > 自然科学 > 生物学

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

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