自上而下语法分析实验报告_第1页
自上而下语法分析实验报告_第2页
自上而下语法分析实验报告_第3页
自上而下语法分析实验报告_第4页
自上而下语法分析实验报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、实验二:自上而下语法分析1、 实验目的和要求根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对自上而下分析法的理解,从而实现一个LL(1)文法分析器。2、 实验内容(1) 功能描述:LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以LL(1)预测分析表,对输入符号串自上而下的分析过程。本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。(2) 程序基本实现思想:接收用户输入的字符串(字符串以

2、“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,若产生式的右部为,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。若不为,将产生式的右部逆序的入栈,取出栈顶符号进入下一步分析。(3) 程序

3、要求:程序输入/输出示例:对下列文法,用LL(1)分析法对任意输入的符号串进行分析:ETEE+TE|TFTT*FT|Fi|(E)该文法的预测分析表为: 输出的格式如下: LL(1)分析:输入一以#结束的符号串(包括+*/()i#):在此位置输入符号串例如:i+i*i#输出结果:显示步骤、分析栈、剩余输入串和所用产生式的分析推导过程,若出错,则显示出在哪一步出错,并显示i+i*i#为不合法符号串。 (4)程序流程图:(5) 程序结构描述: public boolean judge() String inputChar = inputString.substring(0, 1); / 当前输入字符

4、boolean flage = false;if (count1 = 0) for (int i = 0; i 6; i+) if (fenxicount1.equals(Vti) / 判断分析栈栈顶的字符是否为终结符flage = true;break;if (flage) / 为终结符时if (fenxicount1.equals(inputChar) if (fenxicount1.equals(#) & inputString.length() = 1) / 栈顶符号为结束标志时String fenxizhan = ;for (int i =0; i fenxi.length; i+)

5、 / 拿到分析栈里的全部内容if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print( + count);String countToString = Integer.toString(count);int farWay = 12 - countToString.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(new StringBuffer

6、(fenxizhan).reverse();/输出分析栈farWay = 17 - fenxizhan.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(inputString);farWay = 20 - inputString.length();for (int k = 0; k 1) / 当当前输入字符串的长度大于1时,将当前输入字符从输入字符串中除去inputString = inputString.substring(1,inputString.length(); else / 当前

7、输入串长度为1时inputChar = inputString;count+;judge(); else / 判断与输入符号是否一样System.out.println( 分析到第 + count + 步时出错!);flag = false;return false; else / 非终结符时boolean fla = false;for (int i = 0; i 6; i+) / 查询当前输入符号位于终结符集的位置if (inputChar.equals(Vti) fla = true;count2 = i;/终结符位置break;if (!fla) System.out.println(

8、 分析到第 + count + 步时出错!);flag = false;return false;for (int i = 0; i 5; i+) / 查询栈顶的符号位于非终结符集的位置if (fenxicount1.equals(Vni) count3 = i;/非终结符位置break; if (Pcount3count2 != error) / 栈顶的非终结符与输入的终结符存在产生式时String p = Pcount3count2;String s1 = p.substring(2, p.length(); / 获取对应的产生式if (s1.equals() / 产生式推出“”时。/ 将

9、栈顶符号出栈,栈顶指针指向下一个元素fenxicount1 = null;count1 -= 1;count+;judge(); else / 产生式不推出“”时int k = s1.length();。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 = s2+s1.substring(s1.length() - 1,

10、s1.length();/,+倒数第二个字符i+;s1 = s1.substring(0, s1.length() - 1);fenxicount1 = s2;if (i k)count1+;count+;judge(); else System.out.println( 分析到第 + count + 步时出错!);flag = false;return false;return flag;3、 实验结果1、显示预测分析表,提示用户输入字符串2、输入的字符串为正确的句子测试数据:输入字符串i*i+i#3、输入的字符串中包含了不属于终结符集的字符四、实验总结这次实验让我更加熟悉了LL(1)的工作

11、流程以及LL(1)预测分析表的构造方法,我加深了对预测分析LL(1)分析法的理解,同时体验到了编译原理中一些算法的巧妙。以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。通过本次上机实验,由于LL(1)分析法程序是一个相当复杂的程序,它需要利用到大量的编译原理,编程技巧和数据结构。由于先前掌握的知识不够牢固深刻使之在实验过程中出现了大量的问题。由于课前的充分准备,不断地调试最后顺利完成了实验。5、 源码 /* * */package com.fgy.practice;import java.io.BufferedReader;import java.io.InputStreamReade

12、r;/* * author guiyang */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 = ; / 输入的字符串boolean flag;public void setC

13、ount(int count, int count1, int count2, int count3) this.count = count;/1this.count1 = count1;/1this.count2 = count2;/0this.count3 = count3;/0flag = false;public void setFenxi() / 初始化分析栈fenxi = new String20;fenxi0 = #;fenxi1 = E;public void setP() / 初始化预测分析表for (int i = 0; i 5; i+) for (int j = 0; j

14、 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; i 6; i+) System.out.print( + Vti);/11System.out.println();System.out.println(-);for (int i = 0; i 5; i+)

15、 System.out.print( + new StringBuffer(Vni).reverse() + );/9for (int j = 0; j = 0) for (int i = 0; i 6; i+) if (fenxicount1.equals(Vti) / 判断分析栈栈顶的字符是否为终结符flage = true;break;if (flage) / 为终结符时if (fenxicount1.equals(inputChar) if (fenxicount1.equals(#) & inputString.length() = 1) / 栈顶符号为结束标志时String fen

16、xizhan = ;for (int i =0; i fenxi.length; i+) / 拿到分析栈里的全部内容(滤去null)if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print( + count);String countToString = Integer.toString(count);int farWay = 12 - countToString.length();for (int k = 0; k farWay; k+) S

17、ystem.out.print( );System.out.print(new StringBuffer(fenxizhan).reverse();/输出分析栈farWay = 17 - fenxizhan.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(inputString);farWay = 20 - inputString.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.println(接受)

18、;flag = true;return true; else / 分析栈栈顶符号不为结束标志符号时String fenxizhan = ;for (int i = 0; i fenxi.length; i+) / 拿到分析栈里的全部内容(滤去null)if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print( + count);String countToString = Integer.toString(count);int farWay =

19、 12 - countToString.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(new StringBuffer(fenxizhan).reverse();/输出分析栈farWay = 17 - fenxizhan.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(inputString);farWay = 20 - inputString.length();for (int k =

20、 0; k 1) / 当当前输入字符串的长度大于1时,将当前输入字符从输入字符串中除去inputString = inputString.substring(1,inputString.length(); else / 当前输入串长度为1时inputChar = inputString;count+;judge(); else / 判断与输入符号是否一样System.out.println( 分析到第 + count + 步时出错!);flag = false;return false; else / 非终结符时boolean fla = false;for (int i = 0; i 6;

21、i+) / 查询当前输入符号位于终结符集的位置if (inputChar.equals(Vti) fla = true;count2 = i;/终结符位置break;if (!fla) System.out.println( 分析到第 + count + 步时出错!);flag = false;return false;for (int i = 0; i 5; i+) / 查询栈顶的符号位于非终结符集的位置if (fenxicount1.equals(Vni) count3 = i;/非终结符位置break;if (Pcount3count2 != error) / 栈顶的非终结符与输入的终结

22、符存在产生式时String p = Pcount3count2;String s1 = p.substring(2, p.length(); / 获取对应的产生式if (s1.equals() / 产生式推出“”时String fenxizhan = ;for (int i = 0; i fenxi.length; i+) if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print( + count);String countToString =

23、 Integer.toString(count);int farWay = 12 - countToString.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(new StringBuffer(fenxizhan).reverse();/输出分析栈farWay = 17 - fenxizhan.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.print(inputString);farWay = 2

24、0 - inputString.length();for (int k = 0; k farWay; k+) System.out.print( );System.out.println(new StringBuffer(fenxicount1).reverse() + Pcount3count2);/ 将栈顶符号出栈,栈顶指针指向下一个元素fenxicount1 = null;count1 -= 1;count+;judge(); else / 产生式不推出“”时int k = s1.length();String fenxizhan = ;for (int i = 0; i = fenxi

25、.length; i+) if (fenxii = null) break; else fenxizhan = fenxizhan + fenxii;/ 输出当前分析栈情况,输入字符串,所用产生式或匹配System.out.print( + count);String countToString = Integer.toString(count);int farWay = 12 - countToString.length();for (int o = 0; o farWay; o+) System.out.print( );StringBuffer buffer=new StringBuff

26、er(fenxizhan);System.out.print(buffer.reverse();/输出分析栈farWay = 17 - fenxizhan.length();for (int o = 0; o farWay; o+) System.out.print( );System.out.print(inputString);farWay = 20 - inputString.length();for (int o = 0; o farWay; o+) System.out.print( );System.out.println(new StringBuffer(fenxicount1).reverse() + 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 = s2+s1.substring(s1.length() - 1, s1.length();/,+倒数第二

温馨提示

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

评论

0/150

提交评论