ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:228.61KB ,
资源ID:4628592      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4628592.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(广东海洋大学编译原理实验3.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

广东海洋大学编译原理实验3.docx

1、广东海洋大学编译原理实验3GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验3:LL(1)语法分析课程名称编译原理课程号16242211学院(系)数学与计算机学院专业计算机科学与技术班级 计科1141学生姓名学号实验地点 科425实验日期2017.4.211、实验目的 熟悉语法分析的过程;理解相关文法的步骤;熟悉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、。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。 3流程图 本程序中使用以下文法作对用户输入的字符串进行分析: ETE E+TE| TFT T*FT| Fi|(E) 该文法的预测分析表为: 四、结果及截图1 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 = ; /

5、输入的字符串 boolean 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

6、 (int i = 0; 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

7、(); System.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.equa

8、ls(#)&inputString.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.toStrin

9、g(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 (int k=0; kfarWay;

10、 k+) System.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 cou

11、ntToString = 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.leng

12、th(); for (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+; judg

13、e(); else / 判断与与输入符号是否一样为结束标志 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;

14、return false; 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.leng

15、th; i+) if (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

16、= 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.out.print( ); System.out.println(fenxicount1 + Pcount3count2); / 将栈顶符号出栈,栈顶指针指向下一个元素 fenxicount1 = null; count1 -= 1; count+

17、; judge(); 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.len

18、gth(); for (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(

19、fenxicount1 + 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)

20、 count1+; / 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

21、 l = new LL(); l.setP(); String input = ; boolean flag = true; while (flag) try InputStreamReader isr = new 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) flag = false; else l.setInputString(input); l.setCount(1, 1, 0, 0); l.setFenxi(); System.out.println(); System.out.println(分析过程); System.out.println(-); System.out.println( 步骤 | 分析栈 | 剩余输入串 | 所用产生式 ); System.out.println(-); boolean b = l.judge(); System.out.println(-

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2