编译原理LL文法分析器实验_第1页
编译原理LL文法分析器实验_第2页
编译原理LL文法分析器实验_第3页
编译原理LL文法分析器实验_第4页
编译原理LL文法分析器实验_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理LL(1)文法分析器实验本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串 进行分析,判断输入的字符串是否属于该文法的句子。基本实现思想接收用户输入的字符串(字符串以“#表示结束)后,对 用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的 栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符 号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不 为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串 中除去,进入下一个字符的分析。若不为且不与当前输入符号一样,则出 错。若栈顶符号为非终结符时,查看预测

2、分析表,看栈顶符号和当前输入符号是 否构成产生式,若产生式的右部为,则将栈顶符号出栈,取岀栈顶符号进入下 一个字符的分析。若不为 ,将产生式的右部逆序的入栈,取岀栈顶符号进入下 一步分析。程序流程图:本程序中使用以下文法作对用户输入的字符串进行分析:E_TE,E, -+TE,| eT_FT,T -*FT, | eF-i| (E)该文法的预测分析表为:预测分析表+*()EFE-TEJf 8f 8TFTFTTf Ff if (E)1、显示预测分析表,提示用户输入字符串LL Java Application D:Program FilesJavajdkl.7.0_03binjavaw.exe (20

3、12-6-13 bFO2:20:30)已构建好的预测分析表i+*()E-TEerrorerror-TEferrorerrorEerror-+TEerrorerror一E-eT-FTerrorerror-FT,errorerrorTerror-eerror-e-XF-ierrorerror-(Eerrorerror请編入字符串:2、输入的字符串为正确的句子:请输入宇符串:二*分析过程步骤1分析栈1剩余输入串1所用产生式1#Ei+i*i#E-TE2#ETi+i*i#T-FT3lETFi+i*i#F-i4#ETii+i*i#匹酉?5tET+i*i#T-?6#E-+i*i#E-+TE7#ET+i*i#

4、匹酉?8#E-Ti*i#T-FT9lETFi*i#F-i10lETii匹酉?11#ETT,-*FT,12#ETF*匹酉?13#ETFi#F-i14#E-Tii#匹酉?15#ET#T-e16#EE-r17#接受|您输入的字符串是该文发的一个句子3、输入的字符串中包含了不属于终结符集的字符i青输入字符爭:i-re*i#分析过程步骤1分析栈1剩余输入串1所用产生式1#Ei+e*i#E-TE12#E-Ti+e*i#T-FT3#ETFi+e*i#F-i4#ETiS”匹现5fET+e*i#E+e*i#E-+TE7*ET+e*i#”十”匹酉?分析到第8步时出諂! 1|您输入的字符串有词法错误:4、输入的字符

5、串不是该文法能推导岀来的句子请输入宁符串:i+i#分析过程步骤1分析栈I剩余输入串1所用产生式1#Ei+i#E-TE2*ETi 卄T-FT3iETFi+i#F-i44E-T-ii+i#U”匹闻5#ET+i#T-e6E-+TE7#ET+十”十”匹凯分析到第8步时出诸!您输入的字符串i+2l#有词法诸渓!程序代码:package zhuangms; import java io. *;public class LL String Vn = , E,T,,F ; / 非终结符集String Vt = ; / 终结符集String P = new String56; / 预测分析表String fen

6、xi : / 分析栈int count = 1; / 步骤int count 1 = 1;/分析栈指针int count2 = 0, count3 = 0;/预测分析表指针String inputstring = Mw; / 输入的字符串 boolean flag;public void setCount (int count, int count 1, this.count = count;this.count 1 = count 1;thiscount? = count2;this.count3 = count3;flag = false;)public void setFenxi ()

7、/ 初始化分析栈 fenxi = new String20I; fenxi0 = ”#”;fenxi 1 = MEH;count2, int count3)public void for (intsetPO /初始化预测分析表i = 0; i 5; i+) for (int j = 0; j TEM;P03=TE;Pll=+TE;Pl4=M- ”;Pl5=M- ”;P20W 、LT : H =一FT ;P23M 、LTM-/r 1;P3l=M- P32=M-*FTM;P34=M- P35=- ”;P40=”-i”;P43=”-(E)”;/打印出预测分析表System, out printing

8、已构建好的预测分析表System, out println(M“);for (int i=0; i6; i+) System out print (,rSystem out. println();System, out. println(H);for (int i二0; i5; i+) System, out. print(n +Vni + ”);for (int j=0; j0) 1 = 10-Pij-l. lengthO;for (int k二0; k= 0) for (int i=0; i6; i+) if (fenxi countl. equals(Vti) / 判断分析栈栈顶的字符

9、是否为终结符flage = true;break;if (flage) /为终结符时if (fenxicountl equals(inputChar) if (fenxicount 1equals(M#)&inputString.1ength()=l) / 栈顶符号为结束标志时/ System, out. printin(f最后一个);String fenxizhan =for (int i=0; i=P. length; i+) / 拿到分析栈里的全部 容(滤去null)if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii

10、:/输出当前分析栈情况,输入字符串,所用产生式或匹配System .out. pri nt( ” + count):String countToString = IntegertoString(count); int farWay = 14 - countToString length。; for (int k=0; kfarWay; k+) System out print(H ”);System out print(fenxizhan); farWay = 20 - fenxizhan. length。; for (int k=0; kfarWay; k+) System, out pri

11、nt (M ”);System out print(inputString); farWay = 25 - inputString length(); for (int k=0; kfarWay; k+) System. out print(” ”);System, out. println(,r接受);flag = true;return true; else /分析栈栈顶符号不为结束标志符号时String fenxizhan =for (int i=0; i=P. length; i+) / 拿到分析栈里的全部 容(滤去null)if (fenxii = null) break; else

12、 fenxizhan = fenxizhan + fenxii;/输出当前分析栈情况,输入字符串,所用产生式或匹配System out print ( *r+count);String countToString = IntegertoString(count); int farWay = 14 - countToString length。; for (int k=0; kfarWay; k+) System out print(H ”);System out print(fenxizhan); farWay = 20 - fenxizhan length。; for (int k=0; k

13、farWay; k+) System, out print (M ”);System out print(inputString); farWay = 25 - inputString length(); for (int k=0; k 1) /当当前输入字符串的长 度大于1时,将当前输入字符从输入字符串中除去inputString = inputString. substring(l, inputString length (); else /当前输入串长度为1时inputChar = inputString;/ System out. println(, ,r+coun+fenxizhan

14、+/ ,r + inputString +,r ,f+Pcount3 count2):/ System .out. print In (count + inputChar + 匹配 ); count+; judge ();else /判断与与输入符号是否一样为结束标志System, out. println(M分析到第” + count + 步时出错!flag = false;return false;/非终结符时boolean fla = false;for (int i=0; i6; i+) /查询当前输入符号位于终结符集的位置 if (inputChar equals(Vti) fla

15、= true;count2 = i; break;)if(!fla) System, out. print In (M分析到第+ count + 步时出错!”);flag = false;return false;)for (int i=0; i5; i+) /查询栈顶的符号位于非终结符集的位置 if (fenxicounti l, equals(Vni) count3 = i;break;if (Pcount3 count2 != 0error1) /栈顶的非终结符与输入的终 结符存在产生式时String p = Pcount3count2;String si = p. substring(

16、2, p. length() ; / 获取对应的产生式 if (si. equals(” e ”) / 产生式推出 “” 时String fenxizhan =”;for (int i=0; i=P. length; i+) if (fenxiti = null) break; else fenxizhan = fenxizhan + fenxii;/输出当前分析栈情况,输入字符串,所用产生式或匹配System .out. print (,r + count):String countToString = IntegertoString(count); int farWay = 14 - co

17、untToString length。; for (int k=0; kfarWay; k+) System, out print (H ”);System out print(fenxizhan); farWay = 20 一 fenxizhan. length(); for (int k=0; kfarWay; k+) System. out print(H ”);System out print(inputString);farWay = 25 - inputString length。;for (int k=0; kfarWay; k+) System. out print (r, ”

18、);System out println(fenxicountl + Pcount3jcount2j);/将栈顶符号出栈,栈顶指针指向下一个元素fenxicountl = null;countl -= 1:count+;judge (): else /产生式不推出“”时int k = si. length();String fenxizhan =”;for (int i二0; i=P. length; i+) if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/输出当前分析栈情况,输入字符串,所用产生式或匹配System

19、 out print (,r ,r+count);String countToString = IntegertoString(count); int farWay = 14 - countToString length。; for (int o=0; ofarWay; o+) System. out print (” H);System out print(fenxizhan);farWay = 20 - fenxizhan length();for (int o=0; ofarWay; o+) System out print(H ”);System out print(inputStri

20、ng);farWay = 25 - inputString length();for (int o=0; ofarWay; o+) System. out print(H H);System out println(fenxicountl + Pcount3count2); for (int i=l; i=k; i+) /将产生式右部的各个符号入栈 String s2 = slsubstring(sl length() 一 1, si. lengthO);si = si. substr in g(0, si. len gth() - 1);if (s2.equals(MM) s2 = si.

21、substring(sl length() 一 1, sl length() + s2;i+;si = sl substring(O, sl 1 ength() 一 1):fenxicountl = s2;if (i k)countl+;/ System.out.println(countl=M + coun11):/ System out. println(r +count+ ,r+fenxizhan+/ ,r+inputString + ,r+Pcount3 count2):count+;/ Systemout. println(count):judge (); else System, out. println(M分析到第+ count + 步时出错!flag = false;return false;return flag;)public static void main(String args) LL 1 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论