《编译原理实验文档》由会员分享,可在线阅读,更多相关《编译原理实验文档(22页珍藏版)》请在金锄头文库上搜索。
1、 编译原理 实验报告学生姓名: 学 号: 学 院: 计算机与信息工程学院 专业年级: 指导教师: 开始时间: 2012年6月25日 目 录实验一 词法分析31 实验目的32 实验内容33 实验步骤34 实验结果65 实验心得6实验二 LL(1)分析61 实验目的62 实验内容73 实验步骤74 实验结果75 实验心得8实验三 逆波兰式的产生及计算81 实验目的82 实验内容83 实验步骤84 实验结果95 实验心得9实验四 算符优先分析算法101 实验目的102 实验内容103 实验步骤104 实验结果115 实验心得11实验五 LR(1)分析法121 实验目的122 实验内容122 实验步骤
2、124 实验结果135 实验心得14附录:14实验一 词法分析1 实验目的通过设计、调试词法分析程序,实现从源程序中分出 各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的词法分析程序。2 实验内容词法分析是编译程序的第一个阶段,主要任务是对于字符串流的输入,根据词表,将关键字
3、、变量等转化成自定义逻辑结构,就是输入源程序,去除空白符等无意义字符,然后按照各自的分类,转换成一个变量表。3 实验步骤1.词法分析的基本状态转换图图1. 词法分析状态转换图2.程序流程图如下图所示:开始是特殊符号数字掠过空格和回车符error N N N Y Y 取数是字母 Y换成属性字换成属性字读标识符 查保留字表查保留字表 N换成属性字换成属性字 Y 结束图2 词法分析流程图3.程序设计可按照状态转换图来设计,将关键字,界符,运算符保存在数组里。编写函数判断是否数组里有符合的字符串。4程序分析过程可以为一下几个步骤:(1)字符串的输入采用读取文件方式,然后将文件中的数据读入数组中。 St
4、ring strs = null;public void actionPerformed(ActionEvent arg0) if(strBuffer!=null)strs = strBuffer.toString().split(#);elsestrBuffer = new StringBuffer(getContentArea().getText();strs = strBuffer.toString().split(rn);for(String str :strs)analysis.analyse(str);getAnalysisArea().setText();getAnalysisA
5、rea().setText(分析结果如下:+rn+源程序共有+strs.length+行rn+analysis.getBuffer().toString();(2)对标识符和关键字的判断 int x=0;for(int i=0;istr.length;i+)int flag=0;String str1=;char chars=stri.toCharArray();for(int j=0;j=0)&(ch=A)&(ch=a)&(ch=z)return true;elsereturn false;/* * 判断是否为关键字 * * */public void isKeyword(String st
6、r)int i=0;for(;ikeyWord.length;i+)if(str.equals(keyWordi) /是关键字System.out.println(关键字:+str);buffer.append(关键字:+str).append(rn);i=keyWord.length;/结束循环,i等于keyWord.length+1/结束循环,i等于keyWord.lengthif(i=keyWord.length)/普通标志符int j=0;for(;jidLength;j+)/在标志符表中查找是否有该标志符if(str.equals(idj)/标志符表中已经有该标志符System.ou
7、t.println(标识符:+str);/输出该标志符在标志符表中的位置buffer.append(标识符:+str).append(rn);j=idLength;/结束循环,j等于idLength+1if(j=idLength)/标志符表中没有该标志符,将该标志符存入标志符表中,并返回其在符号表中的位置idLength+;/标志符新增一个ididLength-1=str;/将新标志符存放到标志符表中,索引从0开始System.out.println(标识符:+str);buffer.append(标识符:+str).append(rn);/是否为数字public void isNumber(String str)int i=0;for(;inumLength;i+)if(str.equals(numi)System.out.println(常量:+str);buffer.append(常量:+str).append(rn);i=numLength;if(i=numLe