算符优先分析法sWord文档下载推荐.docx

上传人:b****1 文档编号:397931 上传时间:2023-04-28 格式:DOCX 页数:19 大小:113.66KB
下载 相关 举报
算符优先分析法sWord文档下载推荐.docx_第1页
第1页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第2页
第2页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第3页
第3页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第4页
第4页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第5页
第5页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第6页
第6页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第7页
第7页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第8页
第8页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第9页
第9页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第10页
第10页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第11页
第11页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第12页
第12页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第13页
第13页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第14页
第14页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第15页
第15页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第16页
第16页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第17页
第17页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第18页
第18页 / 共19页
算符优先分析法sWord文档下载推荐.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

算符优先分析法sWord文档下载推荐.docx

《算符优先分析法sWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《算符优先分析法sWord文档下载推荐.docx(19页珍藏版)》请在冰点文库上搜索。

算符优先分析法sWord文档下载推荐.docx

#include"

stdio.h"

stdlib.h"

iostream.h"

chardata[20][20];

//算符优先关系表

chars[100];

//模拟符号栈s

charlable[20];

//文法终极符集

charinput[100];

//文法输入符号串

charstring[20][10];

//用于输入串的分析

intk;

chara;

intj;

charq;

intr;

//文法规则个数

intr1;

//转化后文法规则个数

charst[10][30];

//用来存储文法规则

charfirst[10][10];

//文法非终结符FIRSTVT集

charlast[10][10];

//文法非终结符LASTVT集

intfflag[10]={0};

//标志第i个非终结符的FIRSTVT集是否已求出

intlflag[10]={0};

//标志第i个非终结符的LASTVT集是否已求出

intdeal();

//对输入串的分析

intzhongjie(charc);

//判断字符c是否是终极符

intxiabiao(charc);

//求字符c在算符优先关系表中的下标

voidout(intj,intk,char*s);

//打印s栈

voidfirstvt(charc);

//求非终结符c的FIRSTVT集

voidlastvt(charc);

//求非终结符c的LASTVT集

voidtable();

//创建文法优先关系表

voidmain()

{

inti,j,k=0;

printf("

请输入文法规则数:

"

);

scanf("

%d"

&

r);

请输入文法规则:

\n"

for(i=0;

i<

r;

i++)

{

scanf("

%s"

st[i]);

//存储文法规则,初始化FIRSTVT集和LASTVT集*/

first[i][0]=0;

/*first[i][0]和last[i][0]分别表示st[i][0]非终极

符的FIRSTVT集和LASTVT集中元素的个数*/

last[i][0]=0;

}

i++)//判断文法是否合法

for(j=0;

st[i][j]!

='

\0'

;

j++)

{

if(st[i][0]<

'

A'

||st[i][0]>

Z'

{

printf("

不是算符文法!

exit(-1);

}

if(st[i][j]>

&

st[i][j]<

if(st[i][j+1]>

st[i][j+1]<

{

printf("

}

}

if((st[i][j]<

||st[i][j]>

)&

-'

>

|'

lable[k++]=st[i][j];

lable[k]='

#'

lable[k+1]='

table();

每个非终结符的FIRSTVT集为:

//输出每个非终结符的FIRSTVT集

printf("

%c:

"

st[i][0]);

j<

first[i][0];

printf("

%c"

first[i][j+1]);

每个非终结符的LASTVT集为:

//输出每个非终结符的LASTVT集

last[i][0];

last[i][j+1]);

算符优先分析表如下:

lable[i]!

i++)

\t%c"

lable[i]);

k+1;

%c\t"

data[i][j]);

请输入文法输入符号串以#结束:

input);

deal();

}

voidtable()

chartext[20][10];

inti,j,k,t,l,x=0,y=0;

intm,n;

x=0;

firstvt(st[i][0]);

lastvt(st[i][0]);

text[x][y]=st[i][0];

y++;

for(j=1;

if(st[i][j]=='

text[x][y]='

x++;

y=0;

text[x][y]=st[i][0];

y++;

text[x][y++]='

else

text[x][y]=st[i][j];

text[x][y]='

x++;

y=0;

r1=x;

转化后的文法为:

x;

i++)//输出转化后的文法规则串

%s\n"

text[i]);

i++)/*求每个终结符的推导结果(去掉"

->

后的转化文法,用于最后的规约)*/

string[i][0]=text[i][0];

for(j=3,l=1;

text[i][j]!

j++,l++)

string[i][l]=text[i][j];

string[i][l]='

text[i][j+1]!

if(zhongjie(text[i][j])&

zhongjie(text[i][j+1]))

m=xiabiao(text[i][j]);

n=xiabiao(text[i][j+1]);

data[m][n]='

if(text[i][j+2]!

zhongjie(text[i][j])&

zhongjie(text[i][j+2])&

!

n=xiabiao(text[i][j+2]);

for(k=0;

k<

k++)

if(st[k][0]==text[i][j+1])

break;

for(t=0;

t<

first[k][0];

t++)

n=xiabiao(first[k][t+1]);

data[m][n]='

<

if(!

if(st[k][0]==text[i][j])

last[k][0];

m=xiabiao(last[k][t+1]);

m=xiabiao('

for(t=0;

first[0][0];

n=xiabiao(first[0][t+1]);

data[m][n]='

n=xiabiao('

last[0][0];

m=xiabiao(last[0][t+1]);

data[n][n]='

voidfirstvt(charc)//求FIRSTVT集

inti,j,k,m,n;

if(st[i][0]==c)

break;

if(fflag[i]==0)

n=first[i][0]+1;

m=0;

do

if(m==2||st[i][m]=='

if(zhongjie(st[i][m+1]))

first[i][n]=st[i][m+1];

n++;

else

if(zhongjie(st[i][m+2]))

{

first[i][n]=st[i][m+2];

n++;

}

if(st[i][m+1]!

=c)

firstvt(st[i][m+1]);

for(j=0;

{

if(st[j][0]==st[i][m+1])

break;

}

for(k=0;

first[j][0];

intt;

for(t=0;

n;

{

if(first[i][t]==first[j][k+1])

break;

}

if(t==n)

first[i][n]=first[j][k+1];

n++;

m++;

}while(st[i][m]!

first[i][n]='

first[i][0]=--n;

fflag[i]=1;

voidlastvt(charc)//求LASTVT集

if(lflag[i]==0)

n=last[i][0]+1;

if(st[i][m+1]=='

||st[i][m+1]=='

if(zhongjie(st[i][m]))

last[i][n]=st[i][m];

if(zhongjie(st[i][m-1]))

last[i][n]=st[i][m-1];

if(st[i][m]!

lastvt(st[i][m]);

if(st[j][0]==st[i][m])

last[j][0];

if(last[i][t]==last[j][k+1])

last[i][n]=last[j][k+1];

last[i][n]='

last[i][0]=--n;

lflag[i]=1;

intdeal()

inti,j;

intx,y;

intz;

//输入串的长度

k=1;

s[k]='

//栈置初值

input[i]!

i++);

//计算输入串的长度

z=i--;

i=0;

while((a=input[i])!

if(zhongjie(s[k]))

j=k;

else

j=k-1;

x=xiabiao(s[j]);

y=xiabiao(a);

if(data[x][y]=='

out(1,k,s);

%c"

a);

out(i+1,z,input);

规约\n"

do

q=s[j];

if(zhongjie(s[j-1]))

j=j-1;

elsej=j-2;

x=xiabiao(s[j]);

y=xiabiao(q);

}while(data[x][y]!

intm,n,N;

for(m=j+1;

m<

=k;

m++)

for(N=0;

N<

r1;

N++)

for(n=1;

string[N][n]!

n++)

if(!

zhongjie(s[m])&

zhongjie(string[N][n]))

if(zhongjie(s[m+1])&

zhongjie(string[N][n+1])

s[m+1]==string[N][n+1])

s[j+1]=string[N][0];

break;

else

if(zhongjie(s[m]))

if(s[m]==string[N][n])

{

s[j+1]=string[N][0];

}

k=j+1;

if(k==2&

a=='

out(1,k,s);

out(i+1,z,input);

结束\n"

输入串符合文法的定义!

return1;

//输入串符合文法的定义

if(data[x][y]=='

||data[x][y]=='

{//移进

移进\n"

k++;

s[k]=a;

i++;

\nflase"

return0;

return0;

voidout(intj,intk,char*s)

intn=0;

inti;

for(i=j;

s[i]);

n++;

for(;

n<

15;

intxiabiao(charc)//求字符c在算符优先关系表中的下标

if(c==lable[i])

returni;

return-1;

intzhongjie(charc)//判断字符c是否是终极符

return1;

运行截图如图所示:

1.输入文法,输出其FIRSTVT集、LASTVT集,如图1.1所示。

图1.1求FIRSTVT集、LASTVT集

2.输出其算符优先分析表,输入句子进行分析如图1.2所示。

图1.2进行算符优先分析

五、成绩评定

及格

不及格

出勤

内容

格式

创新

效果

总评

指导教师:

年月日

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

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

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

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