1、char VnMaxVnNum + 1; /*非终结符集*/int vnNum;char VtMaxVtNum + 1; /*终结符集*/int vtNum;struct pNode PMaxRuleNum;int PNum;char bufferMaxPLength + 1;char ch;char stMaxStLength; /*要分析的符号串*/struct collectNode int nVt; struct collectNode *next;struct collectNode* firstMaxVnNum + 1; /*first集*/struct collectNode*
2、followMaxVnNum + 1; /*follow集*/int analyseTableMaxVnNum + 1MaxVtNum + 1 + 1;int analyseStackMaxStackDepth + 1; /*分析栈*/int topAnalyse; /*分析栈顶*/void Init();/*初始化*/int IndexCh(char ch);void InputVt(); /*输入终结符*/void InputVn();/*输入非终结符*/void ShowChArray(char* collect, int num);/*输出Vn或Vt的内容*/void InputP()
3、;/*产生式输入*/bool CheckP(char * st);/*判断产生式正确性*/void First(int U);void AddFirst(int U, int nCh); /*加入first集*/bool HaveEmpty(int nVn);void Follow(int V);/*计算follow集*/void AddFollow(int V, int nCh, int kind);void ShowCollect(struct collectNode *collect);/*输出first或follow集*/void FirstFollow();/*计算first和fol
4、low*/void CreateAT();/*构造预测分析表*/void ShowAT();/*输出分析表*/void Identify(char *st);void InitStack();void ShowStack();void Pop();void Push(int r);int main() char todo,ch; Init(); InputVn(); InputVt(); InputP(); getchar(); FirstFollow(); printf(所得first集为:); ShowCollect(first);所得follow集为: ShowCollect(follo
5、w); CreateAT(); ShowAT(); todo = y; while( = todo) n是否继续进行句型分析?(y / n): todo = getchar(); != todo & n= todo)n(y / n)? if( int i; InitStack();请输入符号串(以#结束) : ch = getchar(); i = 0;#= ch & i MaxStLength)n= ch) sti+ = ch; = ch & sti = ch; Identify(st); else 输入出错!nvoid Init() int i,j; vnNum = 0; vtNum =
6、0; PNum = 0; for(i = 0;= MaxVnNum; i+) Vni = 0= MaxVtNum; Vti = MaxRuleNum; Pi.lCursor = NULL; Pi.rHead = NULL; Pi.rLength = 0;= MaxPLength; bufferi = MaxVnNum; firsti = NULL; followi = NULL; for(j = 0; j = MaxVnNum + 1; j+) analyseTableij = -1;int IndexCh(char ch) int n; n = 0; /*is Vn?*/ while(ch
7、!= Vnn &= Vnn) n+; return 100 + n; /*is Vt?= Vtn &= Vtn) return n; return -1;void ShowChArray(char* collect) int k = 0;= collectk) %c , collectk+);void InputVn() int inErr = 1; int n,k; char ch; while(inErr)n请输入所有的非终结符,注意:请将开始符放在第一位,并以#号结束: ch = /*初始化数组*/ while(n MaxVnNum) Vnn+ = while(= ch) & (n Ma
8、xVnNum) -1 = IndexCh(ch) Vnn+ = ch; vnNum+; Vnn = /*以“#”标志结束用于判断长度是否合法*/ k = n; if( = (ch = getchar() ;n符号数目超过限制! inErr = 1; continue; /*正确性确认,正确则,执行下下面,否则重新输入*/ Vnk = ShowChArray(Vn);输入正确确认?(y/n): scanf(%c, &ch); = ch)录入错误重新输入! else inErr = 0;/*输入终结符*/void InputVt()n请输入所有的终结符,注意:以#号结束: MaxVtNum) Vtn+ = MaxVtNum) Vtn+ = ch; vtNum+; Vtn = Vtk = ShowChArray(Vt);void InputP() int i = 0, n,num; prin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1