1、(3)能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟。三、实验过程1 文法:E-TEE-+TE|T-FTT-*FT|F-(E)|i:2 程序描述(LL(1)文法)本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为
2、终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。 3流程图 本程序中使用以下文法作对用户输入的字符串进行分析: ETE E+TE| TFT T*FT| Fi|(E) 该文法的预测分析表为: 四、结果及截图1 1、显示预测分析表,提示用户输入字符串 2、输入的字符串为正确的句子: 3、输入的字符串中包含了不属于终结符集的字符 4、输入的字符串不是该文法能推导出来的句子 五、程序代码: packa
3、ge complier;import java.io.*;public class LL String Vn = E, ETTF ; / 非终结符集 String Vt = i+*()# / 终结符集 String P = new String56; / 预测分析表 String fenxi ; / 分析栈 int count = 1; / 步骤 int count1 = 1;/分析栈指针int count2 = 0, count3 = 0;/预测分析表指针 String inputString = ; / 输入的字符串 boolean flag; public void setCount(i
4、nt count, int count1, int count2, int count3) this.count = count; this.count1 = count1; this.count2 = count2; this.count3 = count3; flag = false; public void setFenxi() / 初始化分析栈 fenxi = new String20; fenxi0 = fenxi1 = public void setP() / 初始化预测分析表 for (int i = 0; i 5; i+) for (int j = 0; j TE P03 =
5、P11 = +TE P14 = P15 = P20 = FT P23 = P31 = P32 = *FT P34 = P35 = P40 = P43 = (E) / 打印出预测分析表 System.out.println( 已构建好的预测分析表);- for (int i=0; i6; System.out.print( +Vti); System.out.println();5;+Vni+ for (int j=0; j0) l = 10-Pij-1.length(); for (int k=0; k= 0) for (int i=0; if (fenxicount1.equals(Vti)
6、 / 判断分析栈栈顶的字符是否为终结符 flage = true; break; if (flage) / 为终结符时 if (fenxicount1.equals(inputChar) if (fenxicount1.equals()&inputString.length()=1) / 栈顶符号为结束标志时 / System.out.println(最后一个 String fenxizhan = for (int i=0;=P.length; i+) / 拿到分析栈里的全部内容(滤去null) if (fenxii = null) break; else fenxizhan = fenxiz
7、han + fenxii; / 输出当前分析栈情况,输入字符串,所用产生式或匹配 + count); String countToString = Integer.toString(count); int farWay = 14 - countToString.length(); for (int k=0;farWay; System.out.print( System.out.print(fenxizhan); farWay = 20 - fenxizhan.length(); System.out.print(inputString); farWay = 25 - inputString.
8、length(); System.out.println(接受 flag = true; return true; else / 分析栈栈顶符号不为结束标志符号时+count); + inputChar + + 匹配 / 将栈顶符号出栈,栈顶指针减一 fenxicount1 = null; count1 -= 1; if (inputString.length() 1) / 当当前输入字符串的长度大于1时,将当前输入字符从输入字符串中除去 inputString = inputString.substring(1, inputString .length(); else / 当前输入串长度为1
9、时 inputChar = inputString;+count+fenxizhan+ / +inputString +Pcount3count2); / System.out.println(count + inputChar + 匹配 count+; judge(); else / 判断与与输入符号是否一样为结束标志 System.out.println( 分析到第 + count + 步时出错! flag = false; return false; else / 非终结符时 boolean fla = false; i+) / 查询当前输入符号位于终结符集的位置 if (inputCh
10、ar.equals(Vti) fla = true; count2 = i; if(!fla) i+) / 查询栈顶的符号位于非终结符集的位置 if (fenxicount1.equals(Vni) count3 = i; if (Pcount3count2 != ) / 栈顶的非终结符与输入的终结符存在产生式时 String p = Pcount3count2; String s1 = p.substring(2, p.length(); / 获取对应的产生式 if (s1.equals() / 产生式推出“”时 System.out.println(fenxicount1 + Pcount
11、3count2); / 将栈顶符号出栈,栈顶指针指向下一个元素 else / 产生式不推出“”时 int k = s1.length(); for (int o=0; o o+) for (int i=1;=k; i+) / 将产生式右部的各个符号入栈 String s2 = s1.substring(s1.length() - 1, s1.length(); s1 = s1.substring(0, s1.length() - 1); if (s2.equals() s2 = s1.substring(s1.length() - 1, s1.length()+ s2; i+; s1 = s1
12、.substring(0, s1.length() - 1); fenxicount1 = s2; if (i k) count1+; / System.out.println(count1= + count1); / System.out.println(count); else return flag; public static void main(String args) LL l = new LL(); l.setP(); String input = boolean flag = true; while (flag) try InputStreamReader isr = new
13、InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println(); System.out.print(请输入字符串(输入exit退出): input = br.readLine(); catch (Exception e) e.printStackTrace(); if(input.equals(exit) else l.setInputString(input); l.setCount(1, 1, 0, 0); l.setFenxi();分析过程 步骤 | 分析栈 | 剩余输入串 | 所用产生式 boolean b = l.judge();
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2