您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 广东海洋大学编译原理实验3
1广东海洋大学学生实验报告书(学生用表)实验名称实验3:LL(1)语法分析课程名称编译原理课程号16242211学院(系)数学与计算机学院专业计算机科学与技术班级计科1141学生姓名学号实验地点科425实验日期2017.4.21一、实验目的熟悉语法分析的过程;理解相关文法的步骤;熟悉First集和Follow集生成。二、实验要求对于给定的文法,试编写调试一个语法分析程序:要求和提示:(1)可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、SLR(1)等)作为编制语法分析程序的依据。(2)对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。(3)能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟。三、实验过程1文法:E-TE’E’-+TE’|εT-FT’T’-*FT’|εF-(E)|i:2程序描述(LL(1)文法)本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。GDOU-B-11-11223流程图本程序中使用以下文法作对用户输入的字符串进行分析:E→TE’E’→+TE’|εT→FT’T’→*FT’|εF→i|(E)该文法的预测分析表为:3四、结果及截图11、显示预测分析表,提示用户输入字符串2、输入的字符串为正确的句子:43、输入的字符串中包含了不属于终结符集的字符4、输入的字符串不是该文法能推导出来的句子五、程序代码:5packagecomplier;importjava.io.*;publicclassLL{StringVn[]={E,E',T,T',F};//非终结符集StringVt[]={i,+,*,(,),#};//终结符集StringP[][]=newString[5][6];//预测分析表Stringfenxi[];//分析栈intcount=1;//步骤intcount1=1;//’分析栈指针intcount2=0,count3=0;//预测分析表指针StringinputString=;//输入的字符串booleanflag;publicvoidsetCount(intcount,intcount1,intcount2,intcount3){this.count=count;this.count1=count1;this.count2=count2;this.count3=count3;flag=false;}publicvoidsetFenxi(){//初始化分析栈fenxi=newString[20];fenxi[0]=#;fenxi[1]=E;}publicvoidsetP(){//初始化预测分析表for(inti=0;i5;i++){for(intj=0;j6;j++){P[i][j]=error;}}P[0][0]=-TE';P[0][3]=-TE';P[1][1]=-+TE';P[1][4]=-ε;P[1][5]=-ε;P[2][0]=-FT';P[2][3]=-FT';P[3][1]=-ε;P[3][2]=-*FT';P[3][4]=-ε;6P[3][5]=-ε;P[4][0]=-i;P[4][3]=-(E);//打印出预测分析表System.out.println(已构建好的预测分析表);System.out.println(----------------------------------------------------------------------);for(inti=0;i6;i++){System.out.print(+Vt[i]);}System.out.println();System.out.println(----------------------------------------------------------------------);for(inti=0;i5;i++){System.out.print(+Vn[i]+);for(intj=0;j6;j++){intl=0;if(j0){l=10-P[i][j-1].length();}for(intk=0;kl;k++){System.out.print();}System.out.print(P[i][j]+);}System.out.println();}System.out.println(----------------------------------------------------------------------);}publicvoidsetInputString(Stringinput){inputString=input;}publicbooleanjudge(){StringinputChar=inputString.substring(0,1);//当前输入字符booleanflage=false;if(count1=0){for(inti=0;i6;i++){7if(fenxi[count1].equals(Vt[i])){//判断分析栈栈顶的字符是否为终结符flage=true;break;}}}if(flage){//为终结符时if(fenxi[count1].equals(inputChar)){if(fenxi[count1].equals(#)&&inputString.length()==1){//栈顶符号为结束标志时//System.out.println(最后一个);Stringfenxizhan=;for(inti=0;i=P.length;i++){//拿到分析栈里的全部内容(滤去null)if(fenxi[i]==null){break;}else{fenxizhan=fenxizhan+fenxi[i];}}//输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print(+count);StringcountToString=Integer.toString(count);intfarWay=14-countToString.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.print(fenxizhan);farWay=20-fenxizhan.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.print(inputString);farWay=25-inputString.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.println(接受);flag=true;returntrue;}else{//分析栈栈顶符号不为结束标志符号时Stringfenxizhan=;for(inti=0;i=P.length;i++){//拿到分析栈里的全部内容(滤去8null)if(fenxi[i]==null){break;}else{fenxizhan=fenxizhan+fenxi[i];}}//输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print(+count);StringcountToString=Integer.toString(count);intfarWay=14-countToString.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.print(fenxizhan);farWay=20-fenxizhan.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.print(inputString);farWay=25-inputString.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.println(\+inputChar+\+匹配);//将栈顶符号出栈,栈顶指针减一fenxi[count1]=null;count1-=1;if(inputString.length()1){//当当前输入字符串的长度大于1时,将当前输入字符从输入字符串中除去inputString=inputString.substring(1,inputString.length());}else{//当前输入串长度为1时inputChar=inputString;}//System.out.println(+count++fenxizhan+//+inputString++P[count3][count2]);//System.out.println(count+inputChar+匹配);count++;judge();}}else{//判断与与输入符号是否一样为结束标志System.out.println(分析到第+count+步时出错!);flag=false;returnfalse;9}}else{//非终结符时booleanfla=false;for(inti=0;i6;i++){//查询当前输入符号位于终结符集的位置if(inputChar.equals(Vt[i])){fla=true;count2=i;break;}}if(!fla){System.out.println(分析到第+count+步时出错!);flag=false;returnfalse;}for(inti=0;i5;i++){//查询栈顶的符号位于非终结符集的位置if(fenxi[count1].equals(Vn[i])){count3=i;break;}}if(P[count3][count2]!=error){//栈顶的非终结符与输入的终结符存在产生式时Stringp=P[count3][count2];Strings1=p.substring(2,p.length());//获取对应的产生式if(s1.equals(ε)){//产生式推出“ε”时Stringfenxizhan=;for(inti=0;i=P.length;i++){if(fenxi[i]==null){break;}else{fenxizhan=fenxizhan+fenxi[i];}}//输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print(+count);StringcountToString=Integer.toString(count);intfarWay=14-countToString.length();for(intk=0;kfarWay;k++){System.out.print();}System.out.print(fenxizhan);farWay=20-fenxizhan.length();for(intk=0;kfarWay;k++){10System.out.prin
本文标题:广东海洋大学编译原理实验3
链接地址:https://www.777doc.com/doc-6096350 .html