算符优先分析程序Word文件下载.docx

上传人:b****6 文档编号:17515061 上传时间:2022-12-06 格式:DOCX 页数:19 大小:103.71KB
下载 相关 举报
算符优先分析程序Word文件下载.docx_第1页
第1页 / 共19页
算符优先分析程序Word文件下载.docx_第2页
第2页 / 共19页
算符优先分析程序Word文件下载.docx_第3页
第3页 / 共19页
算符优先分析程序Word文件下载.docx_第4页
第4页 / 共19页
算符优先分析程序Word文件下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

算符优先分析程序Word文件下载.docx

《算符优先分析程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《算符优先分析程序Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。

算符优先分析程序Word文件下载.docx

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;

}

r;

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

{

for(j=0;

st[i][j]!

='

\0'

;

j++)

{

if(st[i][0]<

'

A’||st[i][0]〉’Z’)

{

printf("

不是算符文法!

\n”);

exit(-1);

}

if(st[i][j]〉=’A’&&st[i][j]〈=’Z'

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

=’A'

&

&st[i][j+1]〈='

Z'

printf("

);

}

st[i][j]!

=’\0’;

if((st[i][j]<

’A’||st[i][j]>

)&&

st[i][j]!

=’-'

st[i][j]!

=’〉’&&

|’)

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

lable[k]='

#’;

lable[k+1]=’\0’;

table();

printf(”每个非终结符的FIRSTVT集为:

\n”);

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

for(i=0;

printf("

%c:

”,st[i][0]);

for(j=0;

j〈first[i][0];

printf(”%c"

first[i][j+1]);

每个非终结符的LASTVT集为:

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

%c:

”,st[i][0]);

j〈last[i][0];

printf("

%c”,last[i][j+1]);

printf(”算符优先分析表如下:

lable[i]!

=’\0'

i++)

printf(”\t%c"

,lable[i]);

printf(”\n"

k+1;

printf(”%c\t"

,lable[i]);

j<

%c\t”,data[i][j]);

printf(”\n”);

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

scanf(”%s"

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;

st[i][j]!

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

text[x][y]=’\0'

x++;

y=0;

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

y++;

text[x][y++]='

-’;

text[x][y++]='

〉'

else

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

y++;

text[x][y]=’\0’;

x++;

y=0;

r1=x;

printf(”转化后的文法为:

x;

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

printf(”%s\n”,text[i]);

i〈x;

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]=’\0’;

for(j=1;

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]!

\0’&&zhongjie(text[i][j])&

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

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

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

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

data[m][n]='

=’;

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

&!

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

for(k=0;

k<

k++)

{

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

break;

}

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

for(t=0;

t<

first[k][0];

t++)

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

data[m][n]='

<

’;

if(!

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

k〈r;

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

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

t〈last[k][0];

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

data[m][n]='

m=xiabiao(’#’);

for(t=0;

t〈first[0][0];

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

data[m][n]='

n=xiabiao('

#’);

for(t=0;

t〈last[0][0];

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

data[m][n]='

〉’;

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;

t〈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]!

=’\0’);

first[i][n]=’\0’;

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

fflag[i]=1;

voidlastvt(charc)//求LASTVT集

inti,j,k,m,n;

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

break;

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]);

for(j=0;

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

k〈last[j][0];

intt;

for(t=0;

{

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

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

n++;

}while(st[i][m]!

last[i][n]='

\0’;

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);

printf(”规约\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);

a);

out(i+1,z,input);

结束\n"

printf(”输入串符合文法的定义!

return1;

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

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

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

{//移进

printf(”%c”,a);

out(i+1,z,input);

移进\n”);

k++;

s[k]=a;

i++;

printf(”\nflase"

return0;

\nflase"

return0;

voidout(intj,intk,char*s)

intn=0;

inti;

for(i=j;

=k;

printf(”%c”,s[i]);

n++;

for(;

n<

15;

printf(””);

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

inti;

lable[i]!

if(c==lable[i])

returni;

return-1;

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

lable[i]!

return1;

return0;

四、结果验证

给定文法:

E→E+T|T

T→T*F|F

F→(E)|i

验证输入串:

i*i+i

输出结果:

五、实验总结分析

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

熟悉了构造算符优先分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。

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

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

当前位置:首页 > 教学研究 > 教学案例设计

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

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