算符优先分析程序.docx

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

算符优先分析程序.docx

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

算符优先分析程序.docx

算符优先分析程序

南华大学

 

实验名称:

算符优先分析程序

学    院:

计算机学院

专业班级:

本2010电气信息类03班 

学     号:

20104030342

 姓    名:

    谢志兴

指导教师:

吴取劲

 

日期:

2012年6月12日

实验二算符优先分析程序

一、实验目的

调试并完成一个算符优先分析程序,加深对算符优先分析原理的理解。

二、实验要求

算符优先分析程序的功能:

输入:

所给文法的源程序字符串、待匹配字符串。

输出:

转化后的文法、每个非终结符的FIRSTVT集和LASTVT集、算符优先分析表、规约过程。

三、源程序代码:

#include"stdio.h"

#include"stdlib.h"

#include"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);

printf("请输入文法规则:

\n");

for(i=0;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;

}

for(i=0;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("不是算符文法!

\n");

exit(-1);

}

}

}

}

for(i=0;i

{

for(j=0;st[i][j]!

='\0';j++)

{

if((st[i][j]<'A'||st[i][j]>'Z')&&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;i

{

printf("%c:

",st[i][0]);

for(j=0;j

{

printf("%c",first[i][j+1]);

}

printf("\n");

}

printf("每个非终结符的LASTVT集为:

\n");//输出每个非终结符的LASTVT集

for(i=0;i

{

printf("%c:

",st[i][0]);

for(j=0;j

{

printf("%c",last[i][j+1]);

}

printf("\n");

}

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

\n");

for(i=0;lable[i]!

='\0';i++)

printf("\t%c",lable[i]);

printf("\n");

for(i=0;i

{

printf("%c\t",lable[i]);

for(j=0;j

{

printf("%c\t",data[i][j]);

}

printf("\n");

}

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

");

scanf("%s",input);

deal();

}

voidtable()

{

chartext[20][10];

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

intm,n;

x=0;

for(i=0;i

{

firstvt(st[i][0]);

lastvt(st[i][0]);

}

for(i=0;i

{

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

y++;

for(j=1;st[i][j]!

='\0';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("转化后的文法为:

\n");

for(i=0;i

{

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

}

for(i=0;i"后的转化文法,用于最后的规约)*/

{

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

for(j=3,l=1;text[i][j]!

='\0';j++,l++)

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

string[i][l]='\0';

}

 

for(i=0;i

{

for(j=1;text[i][j+1]!

='\0';j++)

{

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

{

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

break;

}

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

for(t=0;t

{

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

data[m][n]='<';

}

}

if(!

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

{

for(k=0;k

{

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

break;

}

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

for(t=0;t

{

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

data[m][n]='>';

}

}

}

}

m=xiabiao('#');

for(t=0;t

{

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

data[m][n]='<';

}

n=xiabiao('#');

for(t=0;t

{

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

data[m][n]='>';

}

data[n][n]='=';

}

voidfirstvt(charc)//求FIRSTVT集

{

inti,j,k,m,n;

for(i=0;i

{

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

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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