1、最新广东海洋大学编译原理LL1文法分析器实验javaGDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验3:语法分析课程名称编译原理课程号16242211学院(系)数学与计算机学院专业计算机科学与技术班级 计科1141学生姓名学号实验地点 科425实验日期2017.4.21一、实验目的熟悉语法分析的过程;理解相关文法的步骤;熟悉First集和Follow集生成二、实验要求对于给定的文法,试编写调试一个语法分析程序:要求和提示:(1)可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、SLR(1)等)作为编制语法分析程序的依据。(2)对于所选定的分析方法,如
2、有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。(3)能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟。三、实验过程1:文法:E-TEE-+TE|T-FTT-*FT|F-(E)|i:2程序描述(LL(1)文法)本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进
3、行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。四、程序流程图本程序中使用以下文法作对用户输入的字符串进行分析:ETEE+TE|TFTT*FT|Fi|(E)该文法的预测分析表为:五:结果及截图1、显示预测分析表,提示用户输入字符串2、输入的字符串为正确的句子:3、输入的字符串中包含了不属于终结符集的字符4、输入的字符串不是该文法能推导出
4、来的句子程序代码:package complier;import java.io.*;public class LL String Vn = E, E, T, T, F ; / 非终结符集 String Vt = i, +, *, (, ), # ; / 终结符集 String P = new String56; / 预测分析表 String fenxi ; / 分析栈 int count = 1; / 步骤 int count1 = 1;/分析栈指针int count2 = 0, count3 = 0;/预测分析表指针 String inputString = ; / 输入的字符串 bool
5、ean flag; public void setCount(int 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 = E; public void setP() / 初始化预测分析表 for (int i = 0
6、; i 5; i+) for (int j = 0; j TE; P03 = -TE; P11 = -+TE; P14 = -; P15 = -; P20 = -FT; P23 = -FT; P31 = -; P32 = -*FT; P34 = -; P35 = -; P40 = -i; P43 = -(E); / 打印出预测分析表 System.out.println( 已构建好的预测分析表); System.out.println(-); for (int i=0; i6; i+) System.out.print( +Vti); System.out.println(); System.
7、out.println(-); for (int i=0; i5; i+) System.out.print( +Vni+ ); for (int j=0; j0) l = 10-Pij-1.length(); for (int k=0; k= 0) for (int i=0; i6; i+) if (fenxicount1.equals(Vti) / 判断分析栈栈顶的字符是否为终结符 flage = true; break; if (flage) / 为终结符时 if (fenxicount1.equals(inputChar) if (fenxicount1.equals(#)&input
8、String.length()=1) / 栈顶符号为结束标志时 / System.out.println(最后一个); String fenxizhan = ; for (int i=0; i=P.length; i+) / 拿到分析栈里的全部内容(滤去null) if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii; / 输出当前分析栈情况,输入字符串,所用产生式或匹配 System.out.print( + count); String countToString = Integer.toString(count); i
9、nt farWay = 14 - countToString.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.print(fenxizhan); farWay = 20 - fenxizhan.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.print(inputString); farWay = 25 - inputString.length(); for (int k=0; kfarWay; k+) System
10、.out.print( ); System.out.println(接受); flag = true; return true; else / 分析栈栈顶符号不为结束标志符号时 String fenxizhan = ; for (int i=0; i=P.length; i+) / 拿到分析栈里的全部内容(滤去null) if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii; / 输出当前分析栈情况,输入字符串,所用产生式或匹配 System.out.print( +count); String countToString
11、= Integer.toString(count); int farWay = 14 - countToString.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.print(fenxizhan); farWay = 20 - fenxizhan.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.print(inputString); farWay = 25 - inputString.length(); for (
12、int k=0; k 1) / 当当前输入字符串的长度大于1时,将当前输入字符从输入字符串中除去 inputString = inputString.substring(1, inputString .length(); else / 当前输入串长度为1时 inputChar = inputString; / System.out.println( +count+ +fenxizhan+ / +inputString + +Pcount3count2); / System.out.println(count + inputChar + 匹配 ); count+; judge(); else /
13、 判断与与输入符号是否一样为结束标志 System.out.println( 分析到第 + count + 步时出错!); flag = false; return false; else / 非终结符时 boolean fla = false; for (int i=0; i6; i+) / 查询当前输入符号位于终结符集的位置 if (inputChar.equals(Vti) fla = true; count2 = i; break; if(!fla) System.out.println( 分析到第 + count + 步时出错!); flag = false; return fals
14、e; for (int i=0; i5; i+) / 查询栈顶的符号位于非终结符集的位置 if (fenxicount1.equals(Vni) count3 = i; break; if (Pcount3count2 != error) / 栈顶的非终结符与输入的终结符存在产生式时 String p = Pcount3count2; String s1 = p.substring(2, p.length(); / 获取对应的产生式 if (s1.equals() / 产生式推出“”时 String fenxizhan = ; for (int i=0; i=P.length; i+) if
15、(fenxii = null) break; else fenxizhan = fenxizhan + fenxii; / 输出当前分析栈情况,输入字符串,所用产生式或匹配 System.out.print( + count); String countToString = Integer.toString(count); int farWay = 14 - countToString.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.print(fenxizhan); farWay = 20 - fenx
16、izhan.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.print(inputString); farWay = 25 - inputString.length(); for (int k=0; kfarWay; k+) System.out.print( ); System.out.println(fenxicount1 + Pcount3count2); / 将栈顶符号出栈,栈顶指针指向下一个元素 fenxicount1 = null; count1 -= 1; count+; judge();
17、else / 产生式不推出“”时 int k = s1.length(); String fenxizhan = ; for (int i=0; i=P.length; i+) if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii; / 输出当前分析栈情况,输入字符串,所用产生式或匹配 System.out.print( +count); String countToString = Integer.toString(count); int farWay = 14 - countToString.length(); for
18、(int o=0; ofarWay; o+) System.out.print( ); System.out.print(fenxizhan); farWay = 20 - fenxizhan.length(); for (int o=0; ofarWay; o+) System.out.print( ); System.out.print(inputString); farWay = 25 - inputString.length(); for (int o=0; ofarWay; o+) System.out.print( ); System.out.println(fenxicount1
19、 + Pcount3count2); for (int i=1; i=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.substring(0, s1.length() - 1); fenxicount1 = s2; if (i k) count1+; /
20、 System.out.println(count1= + count1); / System.out.println( +count+ +fenxizhan+ / +inputString + +Pcount3count2); count+; / System.out.println(count); judge(); else System.out.println( 分析到第 + count + 步时出错!); flag = false; return false; return flag; public static void main(String args) LL l = new LL
21、(); 自制性手工艺品。自制饰品其实很简单,工艺一点也不复杂。近两年来,由于手机的普及,自制的手机挂坠特别受欢迎。 l.setP(); String input = ; boolean flag = true;在调查中我们注意到大多数同学都比较注重工艺品的价格,点面氛围及服务。 while (flag) 1、作者:蒋志华 市场调查与预测,中国统计出版社 2002年8月 11-2市场调查分析书面报告 try 手工艺制品是我国一种传统文化的象征,它品种多样,方式新颖,制作简单,深受广大学生朋友的喜欢。当今大学生的消费行为表现在追求新颖,追求时尚。追求个性,表现自我的消费趋向:购买行为有较强的感情色
22、彩,比起男生热衷于的网络游戏,极限运动,手工艺制品更得女生的喜欢。 InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println();调研结论:综上分析,我们认为在学院内开发“DIY手工艺品”商店这一创业项目是完全可行的。 System.out.print(请输入字符串(输入exit退出):); input = br.readLine(); catch (Exception e) 图1-5 购物是对消费环境的要求分布 e.printStackTrace(); 市场环境所提供的创业机会是客观的,但还必须具备自身的创业优势,才能使我们的创业项目成为可行。作为大学生的我们所具有的优势在于: if(input.equals(exit) flag = false; else6、你购买DIY手工艺制品的目的有那些? l.setInputString(input);(二)大学生对DIY手工艺品消费态度分析 l.setCount(1, 1, 0, 0);在上海, 随着轨道交通的发展,地铁商铺应运而生,并且在重要商圈已经形成一定的气候,投资经营地铁商铺逐渐为一大热门。在人民广场地下的迪美购物中心,有一家DIY自制
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2