发布时间 : 星期日 文章算符优先分析方法更新完毕开始阅读9436228102d276a200292e00
{
w.E=s.base[s.top].E; w.e=s.base[s.top].e; s.top--; }
int IsEmpty(charstack s) {
if(s.top==-1) return 1; else return 0; }
int IsLetter(char ch) {
if(ch>='A'&&ch<='Z') return 1; else return 0; }
//judge1是判断是否是算符文法:若产生式中含有两个相继的非终结符则不是算符文法 int judge1(int n) {
int j=3,flag=0; for(int i=0;i<=n;i++) while(str[i][j]!='\\0') {
char a=str[i][j]; char b=str[i][j+1];
if(IsLetter(a)&&IsLetter(b)) {flag=1;break;} else j++; }
8
if(flag==1) return 0; else return 1; }
//judge2是判断文法G是否为算符优先文法:若不是算符文法或若文法中含空字或终结符的优先级不唯一则不是算符优先文法 void judge2(int n) {
for(int i=0;i<=n;i++)
if(str[i][3]=='~'||judge1(n)==0||FLAG==1)//'~'代表空字 {cout<<\该文法不是算符优先文法!\ if(i>n)
cout<<\该文法是算符优先文法!\}
//search1是查看存放终结符的数组r中是否含有重复的终结符 int search1(char r[],int kk,char a) {
for(int i=0;i if(i==kk) return 0; else return 1; } //createF函数是用F数组存放每个终结符与非终结符和组合,并且值每队的标志位为0;F数组是一个结构体 void createF(int n) { int k=0,i=1;char g; char t[10];//t数组用来存放非终结符 9 t[0]=str[0][0]; while(i<=n) { if(t[k]!=str[i][0]) {k++;t[k]=str[i][0];g=t[k];i++;} else i++; } kk=0; char c; for(i=0;i<=n;i++) { int j=3; while(str[i][j]!='\\0') { c=str[i][j]; if(IsLetter(c)==0) { if(!search1(r,kk,c)) r[kk]=c;kk++;//r数组用来存放终结符 } j++; } } m=0; for(i=0;i for(int j=0;j F[m].R=t[i]; F[m].r=r[j]; F[m].flag=0; m++; 10 } } //search函数是将在F数组中寻找到的终结符与非终结符对的标志位值为1 void search(charLode w) { for(int i=0;i if(F[i].R==w.E&&F[i].r==w.e) {F[i].flag=1;break;} } void FirstVT(int n)//求FirstVT { charstack sta; charLode w; int i=0; Initstack(sta); while(i<=n) { int k=3; w.E=str[i][0]; char a=str[i][k]; char b=str[i][k+1]; if(!IsLetter(a))//产生式的后选式的第一个字符就是终结符的情况 { w.e=a; push(sta,w); search(w); i++; } else if(IsLetter(a)&&b!='\\0'&&!IsLetter(b))//产生式的后选式的第一个字符是非终结符的情况 11