编译原理实验报告册_第1页
编译原理实验报告册_第2页
编译原理实验报告册_第3页
编译原理实验报告册_第4页
编译原理实验报告册_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理实 验 报 告专业: 软件工程 班级: 2013 级 3 班学号: 姓名: 雷 涛 2015至2016学年 第2学期计算机科学学院实 验 报 告 说 明本课程实验从开课学期第9周开始,每周2学时上机实验课,第16周结束,其中第16周为实验检测,共14学时。除统一安排的时间外,学生还可根据自己的实际适当安排课余时间上机。实验课注意事项如下:(1) 每次实验前学生必须充分准备每次的实验内容,以保证每次上机实验的效果。实验过程中必须独立完成。(2) 每次实验课将考勤,并作为实验成绩的重要依据。(3) 每次实验完成后,及时撰写实验报告并交实验指导老师批阅。(4) 实验报告中学生必须填写【实验地

2、点】、【实验时间】、【实验过程】以及【实验总结】,注意:必须手写完成,并独立撰写实验总结,严禁抄袭。(5) 每次实验完成后,请将实验结果发送到教师指定邮箱(jkxllj)。(6) 学期结束时,每位同学应将自己的实验报告册交各班级班长或学习委员,由班长或学习委员以班级为单位、按学号从小到大排列好统一交给实验指导老师,否则无实验成绩。附 实验成绩登记表实验名称实验一实验二实验成绩2实验名称:一个简单词法分析器的设计与实现 指导教师:刘丽娟实验地点: 新实验楼项目一实验室 实验日期: 2016年 5 月 10 日 成绩: 实验目的:1 了解词法分析的任务;2 掌握词法分析程序的工作流程。实验内容:

3、定义模拟的简单语言的词法构成,编制词法分析程序,要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件。若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。基本要求:1写出该实验的实验步骤;2写出实验中遇到的问题及解决的方法。实验步骤:1,分析关键字(语言保留标识符等)2,定义模拟的简单语言的词法构成3,将关键字装入HashMap中4,读入要分析的程序文件5,词法分析6,将分析结果tokens保存到List集合中7,输出tokens到文件中核心代码:关键字:public class KeyWords public String ke

4、yWord = "" public KeyWords (String keyWord) this.keyWord = keyWord; public String toString() return this.keyWord; /*列举写关键字*/ public static final KeyWords and = new KeyWords("&&"), or = new KeyWords("|"), equal = new KeyWords ("="), For = new KeyWords(&

5、quot;for"), Do = new KeyWords("do"), private static List<KeyWords> keyWordsLists = new ArrayList<KeyWords>(); /*向外界提供对象集合*/ public static List<KeyWords> getKeyWordsLists() keyWordsLists.add(and); keyWordsLists.add(or); keyWordsLists.add(equal); keyWordsLists.add(For)

6、; keyWordsLists.add(Do); return keyWordsLists;数据类型:public class DataType extends KeyWordspublic String dataType=""public DataType(String s) super(s);this.dataType=s;/*八种基本数据类型*/ public static final DataType Int = new DataType("int"), Float = new DataType("float"), priva

7、te static List<DataType> dataTypeLists = new ArrayList<DataType>(); /*向外界提供对象集合*/ public static List<DataType> getDataTypeLists() dataTypeLists.add(Boolean); dataTypeLists.add(Float); return dataTypeLists; public String toString() return this.dataType; 词法分析引擎:public class LexicalAn

8、alysis /* 下一个读入字符 */char nextChar = ' '/* 将KeyWords对象装在hashMap中 */private HashMap<String, String> keyWords = new HashMap<String, String>();/* 将DataTypes对象装在hashMap中 */private HashMap<String, String> dataTypes = new HashMap<String, String>();/* token序列 (遍历过程中所有字符串的分割列表

9、,以便于保存到文件中) */private List<String> tokenLists = new LinkedList<String>();/* 读取文件变量 */BufferedReader reader = null;/* 保存当前是否读取到了文件的结尾 */private Boolean isEnd = false;/* 记录行号 */public static int lineNum = 1;/* 将保存keyWords对象保存到HashMap中便于查询(其实key=value) */void reserve(KeyWords w) keyWords.pu

10、t(w.keyWord, w.toString();/*装数据类型*/void reservedataTypes(DataType d) dataTypes.put(d.dataType, d.toString();/* * 构造函数中将关键字和类型添加到hashtable words中 */public LexicalAnalysis(String filePath) /* 初始化读取文件变量 */try reader = new BufferedReader(new FileReader(filePath);/ 读入文件 catch (IOException e) System.out.p

11、rint(e);/* 关键字对象 */List<KeyWords> list1 = KeyWords.getKeyWordsLists();for (KeyWords k : list1) this.reserve(k);/* 数据类型 */List<DataType> list = DataType.getDataTypeLists();for (DataType dataType : list) this.reserve(dataType);this.reservedataTypes(dataType);public void readChar() throws I

12、OException /* 这里应该是使用的是 */nextChar = (char) reader.read();if (int) nextChar = 0xffff) / 标志文件已读完this.isEnd = true;public Boolean readChar(char ch) throws IOException readChar();if (this.nextChar != ch) return false;this.nextChar = ' 'return true;public void scan() throws IOException /* 消除空白 *

13、/for (; readChar() if (nextChar = ' ' | nextChar = 't') continue; else if (nextChar = 'n') tokenLists.add("第-" + lineNum + "-行");lineNum = lineNum + 1; elsebreak;/* 下面开始分割关键字,标识符等信息 */switch (nextChar) /* 对于 =, >=, <=, !=的区分使用状态机实现 */case '='

14、:if (readChar('=') tokenLists.add("=" + "-KeyWords");break; else tokenLists.add("=" + "-KeyWords");break;case '>':if (readChar('=') tokenLists.add(">=" + "-KeyWords");break; else tokenLists.add(">"

15、 + "-KeyWords");break;case '<':if (readChar('=') tokenLists.add("<=" + "-KeyWords");break; else tokenLists.add("<" + "-KeyWords");break;case '!':if (readChar('=') tokenLists.add("!=" + "-KeyWord

16、s");break; else tokenLists.add("!" + "-KeyWords");break;case '(':if (readChar('(') tokenLists.add("(" + "-KeyWords");break;case ')':if (readChar(')') tokenLists.add(")" + "-KeyWords");break;/* * 下面是对数字的识

17、别,根据文法的规定的话,这里的 数字只要是能够识别整数就行 isDigit确定指定字符(Unicode代码点)是否为数字。 */if (Character.isDigit(nextChar) int value = 0;do value = 10 * value + Character.digit(nextChar, 10);readChar(); while (Character.isDigit(nextChar);tokenLists.add(value + "-Number");return;/* * 关键字或者是标识符的识别 isLetter确定指定字符是否为字母

18、*/if (Character.isLetter(nextChar) StringBuffer sb = new StringBuffer();/* 首先得到整个的一个分割 */do sb.append(nextChar);readChar(); while (Character.isLetterOrDigit(nextChar); / isLetterOrDigit确定指定字符是否为字母或数字/* 判断是关键字还是标识符 */String s = sb.toString();String datatype = dataTypes.get(s);/* 如果是关键字或者是类型的话,w不应该是空的

19、 */if (s != null) if (datatype!=null) tokenLists.add(datatype+"-DataType");return;tokenLists.add(s);return; /* 说明是关键字 或者是类型名 */* 否则就是一个标识符id */tokenLists.add(s);keyWords.put(s, s);return;/* nextChar中的任意字符都被认为是词法单元返回 */if (int) nextChar != 0xffff)tokenLists.add(nextChar + "");next

20、Char = ' 'return;/* 是否读取到文件的结尾 */public Boolean getReaderState() return this.isEnd;/* 保存Tokens */public void saveTokens() throws IOException FileWriter writer = new FileWriter("Tokens表.txt");writer.write("符号 符号类型信息n");writer.write("rn");for (int i = 0; i < to

21、kenLists.size(); +i) String tok = (String) tokenLists.get(i);/* 写入文件 */writer.write(tok + "rn");writer.flush();writer.close();主方类:public class Main public static void main(String args) throws IOException String filePath="D:/Lexer.java"LexicalAnalysis lexicalAnalysis = new Lexical

22、Analysis(filePath);while (lexicalAnalysis.getReaderState() = false) lexicalAnalysis.scan();/* 保存相关信息 */lexicalAnalysis.saveTokens();System.out.println("词法分析完毕");遇到的问题:1,字符的读取2,关键字的读取解决的方法:上网查询资料实验结果截图:实验总结(学生)请手工填写实验评价(教师)对应后面打“”熟练完成(无错误),对应级别A基本完成(有错误),对应级别B部分完成(部分没做),对应级别C没有做(与题目无关、空白),记

23、0分实验名称:一个简单语法分析器的设计与实现 指导教师: 刘丽娟 实验地点: 新实验楼项目一实验室 实验日期: 2016年 5 月 20 日 成绩: 实验目的:1.掌握语法分析的基本任务;2.掌握语法分析器的工作流程;3.能设计一个简单的语法分析器,并完成对指定句子的分析。实验内容: 给定一个LL(1)文法,编制语法分析程序,输出其预测分析表,用LL(1)预测分析程序实现其分析过程并输出分析过程和分析结果。基本要求:1写出实验步骤;2写出实验中遇到的问题及解决的方法。实验步骤:1,根据文法构造LL(1)分析表2,编写分析程序主要代码:public class LL1 /文法/(1)E->

24、TG/(2)G->+TG|-TG/(3)G->/(4)T->FS/(5)S->*FS|/FS/(6)S->/(7)F->(E)/(8)F->ipublic LL1(String str) super();strToken = new StringBuilder(str);/ LL(1)分析表private String analysisTable = new String "TG", "", "", "TG", "", "",&quo

25、t;","", "", "+TG", "", "", "", "-TG","","", "FS", "", "", "FS", "", "","","" , "", "", "*FS", &

26、quot;", "", "" ,"/FS","", "i", "", "", "(E)", "", "","","" ;/ 存储终结符private String VT = new String "i", "+", "*", "(", ")", &q

27、uot;-","/","#" ;/ 存储终结符private String VN = new String "E", "G", "T", "S", "F" ;/ 输入串private StringBuilder strToken;/ 分析栈private Stack<String> stack = new Stack<String>();/ a保存从输入串中读取的一个输入符号,当前符号private String a =

28、null;/ topChar中保存stack栈顶符号private String topChar = null;/ flag标志预测分析是否成功private boolean flag = true;/ 记录输入串中当前字符的位置private int cur = 0;/ 记录步数private int count = 0;/*初始化*/protected void init() strToken.append("#");stack.push("#");System.out.printf("%-9s %-38s %6s %-20sn"

29、, "步骤 ", "符号栈 ", "输入串 ","所用产生式 ");stack.push("E");curCharacter();System.out.printf("%-6d %-20s %6s n", count, stack.toString(),strToken.substring(cur, strToken.length();/*读取当前栈顶符号*/protected String stackPeek() topChar = stack.peek();return

30、topChar;/*返回输入串中当前位置的字母*/private String curCharacter() a = String.valueOf(strToken.charAt(cur);return a;/*判断topChar是否是终结符*/protected boolean topCharisVT() for (int i = 0; i < (VT.length - 1); i+) if (VTi.equals(topChar) return true;return false;/*查找topChar在非终结符中分析表中的横坐标*/protected String VNTI() i

31、nt Ni = 0, Tj = 0;for (int i = 0; i < VN.length; i+) if (VNi.equals(topChar) Ni = i;for (int j = 0; j < VT.length; j+) if (VTj.equals(a) Tj = j;return analysisTableNiTj;/ 判断MA,a=X->X1X2.Xk/ 把X1X2.Xk推进栈/ X1X2.Xk=,不推什么进栈protected boolean productionType() if (VNTI() != "") return tru

32、e;return false;/ 推进stack栈protected void pushStack() stack.pop();String M = VNTI();String ch;for (int i = (M.length() - 1); i >= 0; i-) ch = String.valueOf(M.charAt(i);stack.push(ch);System.out.printf("%-6d %-20s %6s %-1s->%-12sn", (+count),stack.toString(), strToken.substring(cur, st

33、rToken.length(),topChar, M);/ 主程序public void LL1Analysis() while (flag = true) stackPeek();if (topCharisVT() = true) if (topChar.equals(a) cur+;a = curCharacter();stack.pop();System.out.printf("%-6d %-20s %6s n", (+count),stack.toString(),strToken.substring(cur, strToken.length(); else ERR

34、OR(); else if (topChar.equals("#") if (topChar.equals(a) flag = false; else ERROR(); else if (productionType() = true) if (VNTI().equals("synch") ERROR(); else if (VNTI().equals("") stack.pop();System.out.printf("%-6d %-20s %6s %-1s->%-12sn",(+count), stack.toString(),strToken.substring(cur, strToken.length(), topChar,VNTI(); else pushStack(); else ERROR();/ 出现错误protected void ERROR() System.out.println("输入串出现错误,无法进行

温馨提示

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

评论

0/150

提交评论