本文共 2979 字,大约阅读时间需要 9 分钟。
#include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-6;using namespace std;const int Maxn=110;const int maxn=20;char str[maxn][Maxn];//输入文法char st[maxn];//输入串char stac[maxn];//模拟栈的数组char nstr[maxn][maxn];//储存转化文法char mstr[maxn][maxn];char fin[maxn];//存储终结符char firstvt[maxn][maxn],lastvt[maxn][maxn];char cmp[maxn][maxn];//存储表中的比较符int firstflag[maxn],lastflag[maxn];//非终结符的firstvt,lastvt是否求出int fcnt[maxn],lcnt[maxn];//非终结符firsvt和lastvt的个数int is_fin(char c) { //判断终结符 for(int i=0; fin[i]!='\0'; i++) { if(fin[i]==c) return 1; } return 0;}int site(char c) { //求在表中的下标 for(int i=0; fin[i]!='\0'; i++) { if(fin[i]==c) return i; }}void get_firstvt(char s,int t) { //求s非终结符的firstvt值 int i,j,ii,jj,tt; for(i=0; i " if(str[i][j]="='|')" nstr[x][y]="\0" x++; y="0;" 对于s1-> #S#; char a='#'; cmp[site(a)][site(a)]='='; for(i=0; i " 对于初始的文法 i" if(is_fin(nstr[i][j])&&!is_fin(nstr[i][j+1])) 对于终结符在非终结符之前 jj ='A'&&c<='Z') return 1; return 0;}void exchange(){ int ecnt=0; for(int i=0;i<10;i++){ int mcnt=0; for(int j=3;nstr[i][j]!='\0';j++){ if(isDX(nstr[i][j])&&strlen(nstr[i])!=4) mstr[ecnt][mcnt++]='N'; else if(!isDX(nstr[i][j])) mstr[ecnt][mcnt++]=nstr[i][j]; else{ break; } } mstr[ecnt][mcnt]='\0'; if(strlen(mstr[ecnt])!=0) ecnt++; }}int get_process(char *st)//{ exchange(); int len=strlen(st); int t=0;//栈内元素的个数 int i=0,j; int bz=1; stac[0]='#'; while(st[i]!='\0'){ if(is_fin(stac[t])) j=t; else j=t-1; int a=site(stac[j]); int b=site(st[i]); if(cmp[a][b]=='<'||cmp[a][b]=='='){ printf("\t%d",bz++); output(0,t,stac); printf("\t%c",cmp[a][b]); printf("\t%c",st[i]); output(i+1,len-1,st); printf("\t移进"); puts(""); t++; stac[t]=st[i]; i++; } else if(cmp[a][b]=='>'){ printf("\t%d",bz++); output(0,t,stac); printf("\t%c",cmp[a][b]); printf("\t%c",st[i]); output(i+1,len-1,st); printf("\t归约"); puts(""); int ii,jj,kk; int flag=0; for(ii=t;ii>=0;ii--){ for(jj=0;jj =0;kk--){ if(stac[ii]==mstr[jj][kk]){ ii--; kkn++; } else break; } if(strlen(mstr[jj])==kkn){ t=ii+1; stac[t++]='N'; stac[t]='\0'; t--; flag=1; break; } else{ ii=ii+kkn; } } if(!flag){ printf("\t错误"); return 0; } else{ if(t==1&&st[i]=='#'){ printf("\t%d",bz++); output(0,t,stac); printf("\t="); printf("\t%c",st[i]); output(i+1,len,st); printf("\t接受"); return 1; } break; } } } }}int main() { int T; int cnt=0;//终结符的个数 memset(firstflag,0,sizeof(firstflag)); memset(lastflag,0,sizeof(lastflag)); memset(cmp,0,sizeof(cmp)); scanf("%d",&T); for(int i=0; i 'Z')&&(str[i][j]!='-'&&str[i][j]!='>')&&str[i][j]!='|') fin[cnt++]=str[i][j]; } } fin[cnt++]='#'; fin[cnt]='\0'; printf("输出文法的Firstvt集和Lastvt集\n"); output_firstvt(T); output_lastvt(T); printf("输出算符优先关系表\n"); get_table(T,cnt); printf("请输入输入串\n"); scanf("%s",st); printf("输出输入串的分析过程\n"); printf("PS:分析过程每一列从左到右依次是:步骤 栈 有限关系 当前符号 剩余输入串 移进或规约\n\n"); get_process(st); return 0;}/*2T->T,S|SS->a|@|(T)(a,a)#3B->BoT|TT->TaF|FF->nF|(B)|t|fntofat#*/