实验一词法分析Word文档下载推荐.docx

上传人:b****4 文档编号:13736626 上传时间:2022-10-13 格式:DOCX 页数:13 大小:290.08KB
下载 相关 举报
实验一词法分析Word文档下载推荐.docx_第1页
第1页 / 共13页
实验一词法分析Word文档下载推荐.docx_第2页
第2页 / 共13页
实验一词法分析Word文档下载推荐.docx_第3页
第3页 / 共13页
实验一词法分析Word文档下载推荐.docx_第4页
第4页 / 共13页
实验一词法分析Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验一词法分析Word文档下载推荐.docx

《实验一词法分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验一词法分析Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

实验一词法分析Word文档下载推荐.docx

由以上可得出该语言的文法可表示如下:

G(S)=(VN,VT,P,S)

 

其中VN 

{S,X’,Y’,Z’,M’,W’,α,β,γ,μ,υ,ω}

VT 

={0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,

A,B,C,D,E,F,G,H,I,G,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}

α=0|1|2|3|4|5|6|7|8|9

β 

=a|b|c|d|e|f|A|B|C|D|E|F

γ 

=g| 

h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|G|H|I|G|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z

→ 

X’|Y’|Z’

X’ 

υ|υM’

M’ 

→ω|ωM’

υ 

→β|γ

ω 

→α|β|γ

Y’ 

α|αY’

Z’ 

αH|αW’H

W’ 

→μ|μW’

μ 

→α|β

可见,上式方法中,X’表示出了语言的标识符,而Y’表示出了语言的无符号的十进制,Z’表示出了语言中的十六进制。

∵ 

上式G(S)文法中,各式右边只有单个的终结符号

∴ 

显然,以上文法G(S)已是正规文法。

(2)正规文法转成正规式:

具体步骤如下:

ω|ωM’ 

 

可表示为M’ 

→ω*ω

μ|μW’ 

可表示为W’ 

→μ*μ 

α|αZ’ 

可表示为Z’ 

α*α

∴转换成正规表达式为:

S=υ|υω*ω|αH|αμ*μH|α*α

代入可得:

S=(β|γ)|(β|γ)(α|β|γ)*(α|β|γ)|αH|α(α|β)* 

(α|β)H|α*α

(3)正规式转成NFA(分裂法)

初始的NFA图下所示:

图1 

初始NFA图

经过替换规则替换后得到的最终NFA图如下所示:

图2 

最终的NFA图

(4)NFA转成DFA及DFA最小化(造表法)

对应以上的NFA图,我们可用造表法来表示如下:

显然,由图可看出,状态2与状态5等价,而状态1与状态3等价,这里省去状态3和状态5,并将所以指向状态3的状态都指向状态1,指向状态5的都指向状态2。

由此可画出最小化的DFA图如下:

图3 

最小化的DFA图

可见,终结状态1表示出了无符号的十进制,终结状态2表示出了标识符,状态6表示出了十六进制的整数。

b、

单词的BNF表示

<

标识符>

->

字母>

<

字母数字串>

|<

数字>

|

下划线>

无符号整数>

数字串>

加法运算符>

+

减法运算符>

-

大于关系运算符>

>

大于等于关系运算符>

=

由此可知,需将单词分为五种:

关键字1

标识符2

常数3

运算符4

分隔符5

printf

a

+

main

b

1

_

;

int

c

2

*

if

student

3

/

then

sum

4

{

else

k

5

>

}

return

m

6

….

7

8

9

!

(2)编码实现

#include<

stdio.h>

main(intargc,char*argv[]){

inti,j,state,ERROR=-1;

/*state控制状态的转移1表示0~9数字,2表示字母,4表示a~f,6表示H,0为未输入状态

*ERROR=-1表示未输入任何字符串=1表示输入出错*/

charc;

/*暂时存放所取得的一个字符*/

char*string[]={"

"

"

UnsignedInteger"

Identifier"

Hex"

};

/*输出结果时用*/

for(i=1;

i<

argc;

i++){

state=0;

/*初始态为0*/

ERROR=0;

/*控制是否为可识别词or非法字符*/

for(j=0;

(c=argv[i][j])!

='

\0'

j++){

switch(state){

case0:

if(c>

0'

&

c<

9'

state=1;

elseif

((c>

a'

z'

)||(c>

A'

Z'

))

state=2;

elseERROR=1;

break;

/*ERROR=1,表示当前字符c为非法字符。

*即此时无状态可转向。

*/

case1:

elseif((c>

f'

F'

))

state=4;

elseif(c=='

H'

state=6;

else

ERROR=1;

case2:

if((c>

case4:

elseif(c=='

case6:

ERROR=1;

}/*endswitch*/

if(ERROR==1)

/*退出内for的循环,完成一个词的分析。

}/*endinside-for*/

if(ERROR==1)

printf("

%-15sisaun-identifyword!

\n"

argv[i]);

elseif(ERROR==0)

%-15sisa%s\n"

argv[i],string[state]);

}/*endoutside-for*/

/*未输入任何字符串时(除文件名外)*/

if(ERROR==-1)printf("

Youinputnothing!

);

exit(0);

/*正常退出程序*/

}/*endmain*/

#include<

string.h>

stdlib.h>

ctype.h>

//定义关键字

char*table[7]={"

continue"

main"

int"

if"

then"

else"

return"

},TOKEN[20],ch;

boolzimu(charch)//判断是否为字母

if(ch>

ch<

||ch>

returntrue;

else

returnfalse;

//判断是否为数字

boolshuzi(charch)

intlookup(char*TOKEN)//关键字匹配函数,查询所述程序中的关键字

{

intm,i;

for(i=0;

6;

i++)

{

if((m=strcmp(TOKEN,table[i]))==0)

return1;

}

return0;

voidout(intc,char*TOKEN)//输出函数

{printf("

(%d,%s)\n"

c,TOKEN);

}

voidscanner(FILE*fp)//扫描函数

charTOKEN[20]={'

charch;

inti;

ch=fgetc(fp);

//获取字符,指针fp并自动指向下一个字符

if(zimu(ch)//判断该字符是否是字母,若ch指的是字母,返回非0,否则返回0

{TOKEN[0]=ch;

ch=fgetc(fp);

//fgetc(fp)从数据流中区下一个字符

i=1;

while(shuzi(ch)||zimu(ch))//判断该字符是否是字母或数字

{

TOKEN[i]=ch;

ch=fgetc(fp);

i++;

}

fseek(fp,-1,1);

if(lookup(TOKEN))//判断是关键字还是普通的标识符

out(1,TOKEN);

else

out(2,TOKEN);

elseif(shuzi(ch))

TOKEN[0]=ch;

while(shuzi(ch))//判断该字符是否是字母或数字

fseek(fp,-1,1);

out

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

当前位置:首页 > 小学教育 > 语文

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

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