//LL(1)文法(源代码)#include "stdio.h"#include "stdlib.h"#define MaxRuleNum 8#define MaxVnNum 5#define MaxVtNum 5#define MaxStackDepth 20#define MaxPLength 20#define MaxStLength 50struct pRNode /*产生式右部结构*/{ int rCursor; struct pRNode *next;};struct pNode { int lCursor; int rLength; /*右部长度*/ struct pRNode *rHead; /*右部结点头指针*/};char Vn[MaxVnNum + 1]; /*非终结符集*/int vnNum;char Vt[MaxVtNum + 1]; /*终结符集*/int vtNum;struct pNode P[MaxRuleNum]; int PNum; char buffer[MaxPLength + 1];char ch; char st[MaxStLength]; /*要分析的符号串*/struct collectNode { int nVt; struct collectNode *next;};struct collectNode* first[MaxVnNum + 1]; /*first 集*/struct collectNode* follow[MaxVnNum + 1]; /*follow 集*/int analyseTable[MaxVnNum + 1][MaxVtNum + 1 + 1];int analyseStack[MaxStackDepth + 1]; /*分析栈*/int topAnalyse; /*分析栈顶*/void Init();/*初始化*/int IndexCh(char ch);void InputVt(); /*输入终结符*/void InputVn();/*输入非终结符*/void ShowChArray(char* collect, int num);/*输出 Vn 或 Vt 的内容*/void InputP();/*产生式输入*/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 和 follow*/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); printf("所得 follow 集为:"); ShowCollect(follow); CreateAT(); ShowAT(); todo = 'y'; while('y' == todo) { printf("\n 是否继续进行句型分析?(y / n):"); todo = g...