⑴ 选择算符优先分析方法;
⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作
为分析对象,并且与所选语法分析方法要比较贴切。
(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
using namespace std;
#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
int x=0,y=0;
for(int i=0;i
'Z')
{
else
{
}
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<<"error!"<'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;
for(i=0;iif(grammer[i][j]=='|')//出现或则将其分开
{
chanshengshi[x][y]='\0';
x++;
y=0;
chanshengshi[x][y]=grammer[i][0];
y++;
chanshengshi[x][y++]='-';
chanshengshi[x][y++]='>';
}
else
{
}
chanshengshi[x][y]=grammer[i][j];
y++;
}
chanshengshi[x][y]='\0';
x++;
y=0;
}
}
cout<
';
chanshengshi[0][5]='#';
chanshengshi[0][0]=feizhongjie[0];//将开始符号以#_#形式存入第一行产生式数组,以便优先
关系构造时使用
chanshengshi[0][1]='-';
chanshengshi[0][4]=feizhongjie[0];
M=x;
for(int j=0;jr1=type_fei(chanshengshi[i][0]);
x=type(chanshengshi[i][3]);//找终结符
y=type(chanshengshi[i][4]);
if(x>=0)
{
FIRSTVT[r1][x]=1;
}
else
{
}
if(y>=0)
FIRSTVT[r1][y]=1;
}
for(i=M;i>=1;i--)//出现 E->T
{
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
for(int j=0;j
=0)
{
LASTVT[r1][x]=1;
}
else
{
}
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;tcout<=0)&&(y>=0))//前面是终结符 后面是终结符
{
Relation[x][y]='=';
}
if((v<=(j-2))&&x>=0&&f>=0&&y<0)//两个终结符加一个非终结符
{
Relation[x][f]='=';
}
if(x>=0&&y<0)//前面是终结符,后面非终结符
{
for(int h=0;h=0)//前面非终结符,后面终结符
{
for(int g=0;g';
}
}
}
}
}