实验二 语法分析
算符优先分析程序
一.实验要求
⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法或LR分析法
⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
⑶ 实习时间为6学时
二.实验内容及要求
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表 输出到屏幕或者输出到文件);
(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4)分析的句子为:
(i+i)*i和i+i)*i
三、实验主要代码
# define MAX 100
char *SR;//输入串
char SY[MAX];//移近或规约后剩余串
char S[MAX];//堆栈
char grammer[10][30];//保存输入的语法规则
char chanshengshi[20][10];
char feizhongjie[10];//存放非终结符
char zhongjie[15];//存放终结符
int numf=0;//非终结符个数
int num=0;//终结符个数
int M=0;//转换后产生式个数
char Relation[6][6];//存放优先关系
int FIRSTVT[3][6];//存放firstvt集
int LASTVT[3][6];//存放lastvt集
int type(char s)//在终结符串里查找字符a若a在其中返回下标,否则返回-1
{
int len=strlen(zhongjie);
int tp=-1;
for(int i=0;i<len;i++)
{
if(s==zhongjie[i])
{ tp=i; break; }
}
return tp;
}
int type_fei(char s)
{
int len=strlen(feizhongjie);
int tp=-1;
for(int i=0;i<len;i++)
{ if(s==feizhongjie[i])
{ tp=i; break; }
}
return tp;
}
void transproduct(int n)//原始产生式处理
{
int x=0,y=0;教师业务管理平台
for(int i=0;i<n;i++)
{
for(int j=0;grammer[i][j]!='\0';j++)
{
if(grammer[i][0]<'A'||grammer[i][0]>'Z')
{ cout<<"该文法不是算符文发!"<<endl; return; }
el
{
if(type_fei(grammer[i][0])<0)
feizhongjie[numf++]=grammer[i][0];//获取非终结符符号
}
if(grammer[i][j]>='A'&&grammer[i][j]<='Z')
{
if(grammer[i][j+1]>='A'&&grammer[i][j+1]<='Z')
{ cout<<"该文法不是算符文发!"<<endl; return; }
}
}
}
for(i=0;i<n;i++)
{
for(int j=0;grammer[i][j]!='\0';j++)
{
if((grammer[i][j]>'Z'||grammer[i][j]<'A')
&&grammer[i][j]!='-'&&grammer[i][j]!='>'&&grammer[i][j]!='|')
{ if(type(grammer[i][j])<0) zhongjie[num++]=grammer[i][j];//获取终结符符号 }
}
} zhongjie[num]='#';
zhongjie[num+1]='\0'; x=1;
10寸 for(i=0;i<n;i++)//转换产生式从第二行开始存
{
chanshengshi[x][y]=grammer[i][0]; y++;
for(int j=1;grammer[i][j]!='\0';j++)
{
if(grammer[i][j]=='|')
{ chanshengshi[x][y]='\0'; x++; y=0; chanshengshi[x][y]=grammer[i][0]; y++;
生活的作文 chanshengshi[x][y++]='-'; chanshengshi[x][y++]='>';
}
el
{ chanshengshi[x][y]=grammer[i][j]; y++; }
}
chanshengshi[x][y]='\0'; x++; y=0;
}
chanshengshi[0][0]=feizhongjie[0];//将开始符号以#_#形式存入第一行产生式数组,以便优先关系构造时使用
chanshengshi[0][1]='-'; chanshengshi[0][2]='>'; chanshengshi[0][3]='#'; chanshengshi[0][4]=feizhongjie[0]; chanshengshi[0][5]='#'; chanshengshi[0][6]='\0';
M=x; cout<<"转换后产生式如下:"<<endl;
for(int j=0;j<x;j++)
{ cout<<chanshengshi[j]<<endl; } cout<<"产生式包含的终结符有:";
for(i=0;i<=num;i++)
{ cout<<zhongjie[i]<<" "; } cout<<endl; cout<<"产生式包含的非终结符有:";
for(i=0;i<numf;i++)
{ cout<<feizhongjie[i]<<" "; } cout<<endl;
}
void fristvt()//计算firstvt集并填入FIRSTVT中
{
int r1,x,y;
for(int i=0;i<numf;i++)
{ for(int j=0;j<num;j++) FIRSTVT[i][j]=0; }
for(i=1;i<=M;i++)
{ r1=type_fei(chanshengshi[i][0]); x=type(chanshengshi[i][3]); y=type(chanshengshi[i][4]);
if(x>=0)
{ FIRSTVT[r1][x]=1;}
el
{ if(y>=0) FIRSTVT[r1][y]=1; }
}
for(i=M;i>=1;i--)
{
int y=type(chanshengshi[i][3]);
if(y<0)
{ int m=type_fei(chanshengshi[i][0]); int m1=type_fei(chanshengshi[i][3]);
集中注意力
if(m!=m1)
{ for(int t=0;t<num;t++) if(FIRSTVT[m1][t]!=0)
{ FIRSTVT[m][t]=FIRSTVT[m1][t]; }
}
}
}
cout<<"非终结符的firstvt集:"<<endl;
for(i=0;i<numf;i++)
{ cout<<feizhongjie[i]<<" ";
for(int j=0;j<num;j++)
{ if(FIRSTVT[i][j]!=0)
{ cout<<zhongjie[j]<<" "; }
} cout<<endl;
}
}
void lastvt()//求非终结符的lastvt集
{
int d=0, r1,x,y;
同加偏旁 for(int i=0;i<numf;i++)
{ for(int j=0;j<num;j++) LASTVT[i][j]=0; }
for(i=1;i<=M;i++)
{ r1=type_fei(chanshengshi[i][0]);//判断是否为非终结符
for(int cl=0;chanshengshi[i][cl]!='\0';cl++)
{ d=cl; }
x=type(chanshengshi[i][d]); y=type(chanshengshi[i][d-1]);
if(x>=0)
{ LASTVT[r1][x]=1; }
el
{ if(y>=0) LASTVT[r1][y]=1; }
}
for(i=M;i>=1;i--)
{
int y=type(chanshengshi[i][3]);
if(y<0)
形容老年人
{ int m=type_fei(chanshengshi[i][0]); int m1=type_fei(chanshengshi[i][3]);
义愤填膺造句
if(m!=m1)
{ for(int t=0;t<num;t++)
if(LASTVT[m1][t]!=0)
{ LASTVT[m][t]=LASTVT[m1][t]; }
}
}
} cout<<"非终结符的lastvt集:"<<endl;
for(i=0;i<numf;i++)
{ cout<<feizhongjie[i]<<" ";
for(int j=0;j<num;j++)
march三月怎么读
{ if(LASTVT[i][j]!=0)
{ cout<<zhongjie[j]<<" "; }
} cout<<endl;
}
}
void creatRelation()///创建优先关系表
{ int a=strlen(feizhongjie),b=strlen(zhongjie),c=strlen(*chanshengshi),x,x1,y,y1,f;
for(int i=0;i<=c;i++)
{ int j=strlen(chanshengshi[i]);
for(int v=3;v<j;v++)
{ x=type(chanshengshi[i][v]); x1=type_fei(chanshengshi[i][v]); y=type(chanshengshi[i][v+1]);
y1=type_fei(chanshengshi[i][v+1]); f=type(chanshengshi[i][v+2]);
if((x>=0)&&(y>=0))
{ Relation[x][y]='='; }