编 译 原 理实验报告 实验名称:预测分析法姓名: 专业班级:计科学号: 指导老师: 日期:2025 年 6 月 1 日目的要求1. 构造文法的语法分析程序,要求采纳预测分析法对输入的字符串进行语法分析。2. 加深对预测分析 LL(1)分析法的理解和掌握。 实验内容对文法 G 进行语法分析,文法 G 如下所示:*0. S→a */*1. S→^ *2. S→(T) *3. T→SW **4. W→,SW *5. W→ε;并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,假如不符合(编译出错),则输出错误信息。程序输入/输出示例: 输入: 一个以 # 结束的符号串:例如:(a,a)# 输出: 步数 分析栈 输入串 所用规则 (1) #S (a,a))# 2源程序://LL(1)预测分析控制程序#include #include #include char str[100]; //存储待分析的句子const char T[ ] = "a^(),#"; //终结符,分析表的列符const char NT[ ] = "STW"; //非终结符,分析表的行符/*指向产生式右部符号串*/const char *p[] = {/*0.S→a */ "a",/*1. S→^ */ "^",/*2.S→(T) */"(T)",/*3.T→SW */"SW",/*4. W→,SW */",SW",/*5.W→ε; */""}; //设 M[i][j]=x,通过 p[M[i][j]]=p[x]猎取右部符号串。const int M[][6] = { /* a ^ ( ) , # *//*S*/{ 0, 1, 2, -1, -1, -1 }, /*T*/{ 3, 3, 3, -1, -1, -1 }, /*W*/{ -1, -1,-1, 5, 4, -1 } };void init()//输入待分析的句子{printf("请输入待分析的句子(以$结束):\n");scanf("%s",str);}int lin(char c);//非终结符转换为行号int col(char c);//终结转换为列号bool isNT(char c);//isNT 推断是否是非终结符bool isT(char c);//isT 推断是否是终结符。void main(void){int i,j=0;int flag=1,flag2=0;char A; //设置指示句子的当前字符char stack[20]={'#','S'}; //栈赋初值int top = 1 ;//设置栈顶指针char X = ' ' ; //存储栈顶字符init();A=str[0]; printf("\t 步数\t 分析栈\t 输入串\t 所用规则\n"); //在屏幕上输出列表标题while ( 1 ){printf("\n\t(%d)\t",++j);//输出当前执行步数for ( i = 0 ; i <= top ; i++ ) //输出当前栈的内容(出栈前){printf("%c",stack[i]);}printf("\t");for ( i = flag-1 ; str[i]!='$' ; ...