www.pudn.com > LL1.rar > 1.cpp
#include#include using namespace std; const int NonterminalNum=5; //非终结符个数 const int TerminalNum=9; //终结符个数 char nonterminal[NonterminalNum]={'E', 'A', 'T', 'B','F'}; //定义非终结符 char terminal[TerminalNum]={'i', '+', '*', '(', ')', 'e','-','/'}; //定义终结符 stack s; // 1=E->TA; 2=A->+TA; 3=A->e; 4=A->-TA; 5=T->FB; // 6=B->e; 7=B->/FB; 8=B->*FB; 9=F->(E); 0=F->id void Event0(); void Event1(); void Event2(); void Event3(); void Event4(); void Event5(); void Event6(); void Event7(); void Event8(); void Event9(); void Error(); typedef void (*Action)(); Action ParseTable[NonterminalNum][TerminalNum]={ {Event1, Error, Error, Event1, Error, Error,Error,Error,Error}, {Error, Event2, Error, Error, Event3, Event3,Event3,Event4,Error}, {Event5, Error, Error, Event5, Error, Error, Error, Error,Error}, {Error, Event6, Event8, Error, Event6, Event6,Event6,Event6,Event7,}, {Event0, Error, Error, Event9, Error, Error,Error,Error,Error} }; // 定义事件 void Event1() { s.pop(); s.push('A'); s.push('T'); }; void Event2() { s.pop(); s.push('A'); s.push('T'); s.push('+'); }; void Event3() { s.pop(); }; void Event4() { s.pop(); s.push('A'); s.push('T'); s.push('-'); }; void Event5() { s.pop(); s.push('B'); s.push('F'); }; void Event6() { s.pop(); }; void Event7() { s.pop(); s.push('B'); s.push('F'); s.push('/'); }; void Event8() { s.pop(); s.push('B'); s.push('F'); s.push('*'); }; void Event9() { s.pop(); s.push(')'); s.push('E'); s.push('('); }; void Event0() { s.pop(); s.push('i'); }; // 出错处理 void Error() { cerr<<"------分析失败!------\n"; exit(1); }; // 判断 Token 是终结符还是非终结符 bool isVt(char ch) { for(int i=0; i<9; i++) { if(terminal[i]==ch) return true; else continue; } return false; } void pushTogether(char nonterminal, char terminal) { switch(nonterminal) { case 'E': switch(terminal) { case 'i': ParseTable[0][0](); break; case '+': ParseTable[0][1](); break; case '*': ParseTable[0][2](); break; case '(': ParseTable[0][3](); break; case ')': ParseTable[0][4](); break; case '$': ParseTable[0][5](); break; case 'e': ParseTable[0][6](); break; case '-': ParseTable[0][7](); break; case '/': ParseTable[0][8](); break; case '#': ParseTable[0][9](); break; default: break; } break; case 'A': switch(terminal) { case 'i': ParseTable[1][0](); break; case '+': ParseTable[1][1](); break; case '*': ParseTable[1][2](); break; case '(': ParseTable[1][3](); break; case ')': ParseTable[1][4](); break; case '$': ParseTable[1][5](); break; case 'e': ParseTable[1][6](); break; case '-': ParseTable[1][7](); break; case '/': ParseTable[1][8](); break; case '#': ParseTable[1][9](); break; default: break; } break; case 'T': switch(terminal) { case 'i': ParseTable[2][0](); break; case '+': ParseTable[2][1](); break; case '*': ParseTable[2][2](); break; case '(': ParseTable[2][3](); break; case ')': ParseTable[2][4](); break; case '$': ParseTable[2][5](); break; case 'e': ParseTable[2][6](); break; case '-': ParseTable[2][7](); break; case '/': ParseTable[2][8](); break; case '#': ParseTable[2][9](); break; default: break; } break; case 'B': switch(terminal) { case 'i': ParseTable[3][0](); break; case '+': ParseTable[3][1](); break; case '*': ParseTable[3][2](); break; case '(': ParseTable[3][3](); break; case ')': ParseTable[3][4](); break; case '$': ParseTable[3][5](); break; case 'e': ParseTable[3][6](); break; case '-': ParseTable[3][7](); break; case '/': ParseTable[3][8](); break; case '#': ParseTable[3][9](); break; default: break; } break; case 'F': switch(terminal) { case 'i': ParseTable[4][0](); break; case '+': ParseTable[4][1](); break; case '*': ParseTable[4][2](); break; case '(': ParseTable[4][3](); break; case ')': ParseTable[4][4](); break; case '$': ParseTable[4][5](); break; case 'e': ParseTable[4][6](); break; case '-': ParseTable[4][7](); break; case '/': ParseTable[4][8](); break; case '#': ParseTable[4][9](); break; default: break; } break; default: Error(); break; } } void print(stack s,char a[],int i) { stack t=s; int j=0; char b[10]={' '}; while(!t.empty()) { b[j++]=t.top(); t.pop(); } for(int m=j-1;m>=0;m--) cout<>a[i]; i=0; bool flag=true; while(flag) { char X=s.top(); if(isVt(X)) { print(s,a,i); if(X==a[i]) //match { s.pop(); i++; } else Error(); } else if(X=='$') { print(s,a,i); if(X==a[i]) //parse successfully { flag=false; s.pop(); } else Error(); } else //reverse, push into s { print(s,a,i); pushTogether(X, a[i]); } } if(s.empty()) cout<<"分析成功!"< TA \nA->+TA\nA->e\nA->-TA\nT->FB\nB->e\nB->/FB\nB->*FB\nF->(E)\nF->i\n"; LL1Parse(); }