最新广东海洋大学编译原理LL(1)文法分析器实验(java)_第1页
最新广东海洋大学编译原理LL(1)文法分析器实验(java)_第2页
最新广东海洋大学编译原理LL(1)文法分析器实验(java)_第3页
最新广东海洋大学编译原理LL(1)文法分析器实验(java)_第4页
最新广东海洋大学编译原理LL(1)文法分析器实验(java)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、 精品文档gdou-b-11-112广 东 海 洋 大 学 学 生 实 验 报 告 书 ( 学 生 用 表 )实验名称学院(系) 数学与计算机学院 专业 计算机科学与技术学生姓名 学号 实验地点实验 3:语法分析课程名称编译原理课程号16242211班级 计科 1141实验日期科 4252017.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;/预测分析表指针stri

5、ng inputstring = ; / 输入的字符串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 set

6、p() / 初始化预测分析表for (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.prin

7、tln();精品文档 精品文档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.e

8、quals(#)&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.t

9、ostring(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; k

10、+) 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 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 false;for (int

14、 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 (fenxii = null) b

15、reak; 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 - fenxizhan.length();for (int

16、 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(); else / 产生式不推出“”时int k =

17、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 (int o=0; ofarway; o+) system.ou

18、t.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 + pcount3count2);for (int i=1; i=k; i+

19、) / 将产生式右部的各个符号入栈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+;/ system.out.println(count1= + count1);/ sy

20、stem.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();l.setp();string input = ;boolean flag = true;while (flag) try inputstreamr

温馨提示

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

评论

0/150

提交评论