logo资料库

语法分析(算符优先).doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
⑴ 选择算符优先分析方法; ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作 为分析对象,并且与所选语法分析方法要比较贴切。 (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
#include #include #include
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;i
if(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<
r1=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;t
cout<=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
分享到:
收藏