编译原理语法分析报告_第1页
编译原理语法分析报告_第2页
编译原理语法分析报告_第3页
编译原理语法分析报告_第4页
编译原理语法分析报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

编译原理编译原理 课程课程 实验报告实验报告 哈哈尔尔滨滨工工程程大大学学软软件件学学院院 2 20 01 15 5 年年 5 5 月月 实验实验 2 语法分析 语法分析 一 实验目的一 实验目的 1 巩固对语法分析的基本功能和原理的认识 2 通过对语法分析表的自动生成加深语法分析表的认识 3 理解并处理语法分析中的异常和错误 二 实验内容二 实验内容 题目题目 语法分析器的设计与实现语法分析器的设计与实现 专业专业 软件工程软件工程 班级班级 学号学号 姓名姓名 指导教师指导教师 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析 判断输入的字符串是 否属于该文法的句子 基本实现思想 接收用户输入的字符串 字符串以 表示结束 后 对用做分析栈的一维数组和存放 分析表的二维数组进行初始化 然后取出分析栈的栈顶字符 判断是否为终结符 若为终结符则判断是否为 且与当前输入符号一样 若是则语法分析结束 输入的字符串为文法的一个句子 否则出错若不为 且与当前输入符号一样则将栈顶符号出栈 当前输入符号从输入字符串中除去 进入下一个字符的分析 若不 为 且不与当前输入符号一样 则出错 若栈顶符号为非终结符时 查看预测分析表 看栈顶符号和当前输入符号是否构成产生式 若产生式的右 部为 则将栈顶符号出栈 取出栈顶符号进入下一个字符的分析 若不为 将产生式的右部逆序的入栈 取出栈顶符号进入下一步分析 程序流程图 程序流程图 本 程序 中使 用以 下文 法作 对用 户输 入的 字符 串进 行分 析 E TE E TE T FT T FT F i E 该文法的预测分析表为 代码 package import java io public class LL String Vn E E T T F 非终结符集 String Vt i 终结符集 String P new String 5 6 预测分析表 String fenxi 分析栈 int count 1 步骤 int count1 1 分析栈指针 int count2 0 count3 0 预测分析表指针 String 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 String 20 fenxi 0 fenxi 1 E public void setP 初始化预测分析表 for int i 0 i 5 i for int j 0 j TE P 0 3 TE P 1 1 TE P 1 4 P 1 5 P 2 0 FT P 2 3 FT P 3 1 P 3 2 FT P 3 4 P 3 5 P 4 0 i P 4 3 E 打印出预测分析表 System out println 已构建好的预测分析表 System out println for int i 0 i 6 i System out print Vt i System out println System out println for int i 0 i 5 i System out print Vn i for int j 0 j0 l 10 P i j 1 length for int k 0 k 0 for int i 0 i 6 i if fenxi count1 equals Vt i 判断分析栈栈顶的字符是否为终结符 flage true break if flage 为终结符时 if fenxi count1 equals inputChar if fenxi count1 equals String fenxizhan for int i 0 i P length i 拿到分析栈里的全部内容 滤去null if fenxi i null break else fenxizhan fenxizhan fenxi i 输出当前分析栈情况 输入字符串 所用产生式或匹配 System out print count String countToString Integer toString count int farWay 14 countToString length for int k 0 k farWay k System out print System out print fenxizhan farWay 20 fenxizhan length for int k 0 k farWay k System out print System out print inputString farWay 25 inputString length for int k 0 k farWay k System out print System out println 接受 flag true return true else 分析栈栈顶符号不为结束标志符号时 String fenxizhan for int i 0 i P length i 拿到分析栈里的全部内容 滤去null if fenxi i null break else fenxizhan fenxizhan fenxi i 输出当前分析栈情况 输入字符串 所用产生式或匹配 System out print count String countToString Integer toString count int farWay 14 countToString length for int k 0 k farWay k System out print System out print fenxizhan farWay 20 fenxizhan length for int k 0 k farWay k System out print System out print inputString farWay 25 inputString length for int k 0 k 1 当当前输入字符串的长度大于1时 将当前输入字符从输入 字符串中除去 inputString inputString substring 1 inputString length else 当前输入串长度为1时 inputChar inputString System out println count fenxizhan inputString P count3 count2 System out println count inputChar 匹配 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 Vt i fla true count2 i break if fla System out println 分析到第 count 步时出错 flag false return false for int i 0 i 5 i 查询栈顶的符号位于非终结符集的位置 if fenxi count1 equals Vn i count3 i break if P count3 count2 error 栈顶的非终结符与输入的终结符存在产生式时 String p P count3 count2 String s1 p substring 2 p length 获取对应的产生式 if s1 equals 产生式推出 时 String fenxizhan for int i 0 i P length i if fenxi i null break else fenxizhan fenxizhan fenxi i 输出当前分析栈情况 输入字符串 所用产生式或匹配 System out print count String countToString Integer toString count int farWay 14 countToString length for int k 0 k farWay k System out print System out print fenxizhan farWay 20 fenxizhan length for int k 0 k farWay k System out print System out print inputString farWay 25 inputString length for int k 0 k farWay k System out print System out println fenxi count1 P count3 count2 将栈顶符号出栈 栈顶指针指向下一个元素 fenxi count1 null count1 1 count judge else 产生式不推出 时 int k s1 length String fenxizhan for int i 0 i P length i if fenxi i null break else fenxizhan fenxizhan fenxi i 输出当前分析栈情况 输入字符串 所用产生式或匹配 System out print count String countToString Integer toString count int farWay 14 countToString length for int o 0 o farWay o System out print System out print fenxizhan farWay 20 fenxizhan length for int o 0 o farWay o System out print System out print inputString farWay 25 inputString length for int o 0 o farWay o System out print System out println fenxi count1 P count3 count2 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 fenxi count1 s2 if i k count1 System out println count1 count1 System out println count fenxizhan inputString P count3 count2 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 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 if b System out println 您输入的字符串 input 是该文发的一个句子 else System out println

温馨提示

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

评论

0/150

提交评论