




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验报告学 号:姓 名:提交日期:2016-11-29成 绩:东北大学秦皇岛分校计算机与通信工程学院实验一 词法分析程序的设计与实现一实验内容【实验目的和要求】设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解。【实验内容】通过对PL/0词法分析程序(GETSYM)的分析,并在此基础上按照附录A中给出的PL/0语言的语法描述,编写一个PL/0语言的词法分析程序。此程序应具有如下功能:输入为字符串(待进行词法分析的源程序),输出为单词串,即由(单词、类别)所组成的二元组序列。有一定检查错误的能力,例如发现2A这类不能作为单词的字符串。【实验环境】Windows PC机,任何语言。【提交内容】提交实验报告,报告内容如下:目的要求、算法描述、程序结构、主要变量名说明、程序清单、调试情况、设计技巧、心得体会。提交源程序和可执行文件。2、 程序代码:Package lexical;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;SuppressWarnings(unused)public class a static public Reader reader = null;static public String keyWords = if, else, for, while, do,return, break, continue ;static public String borders = , ;, , , (, ) ;static public String arithmetic = +, -, *, / ;static public String relation1 = ;static public String relation2 = =, ;static public boolean isOver = false;static private char alphaprocess(char buffer) throws Exception int i = -1;StringBuffer sb = new StringBuffer();char temp = buffer;while (Character.isLetter(temp) | Character.isDigit(temp) sb.append(temp);if(temp = (char) reader.read() = -1) isOver = true;if(!search(sb.toString(), 1)search(sb.toString(),2);return temp;static private char digitprocess(char buffer) throws Exception StringBuffer sb = new StringBuffer();char temp = buffer;while(Character.isDigit(temp)sb.append(temp);if(temp = (char) reader.read() = -1) isOver = true;/数字后输入字母if(Character.isLetter(temp)search(sb.toString(), 8);elsesearch(sb.toString(), 3);return temp;static private char otherprocess(char buffer) throws Exception StringBuffer sb = new StringBuffer();char temp = buffer;sb.append(temp);if(temp = (char) reader.read() = -1) isOver = true;if(search(sb.toString(), 4)return temp;else if(search(sb.toString(), 5)return temp;else if(search(sb.toString(), 6)return temp;sb.append(temp);if(search(sb.toString(), 7)if(temp = (char) reader.read() = -1) isOver = true;return temp;static private boolean search(String buffer, int wordtype) int i = 0;switch (wordtype) case 1:for(int j=0;jkeyWords.length;j+)if(keyWordsj.equals(buffer)System.out.println(buffer+保留字+j);return true;return false;case 2:System.out.println(buffer+标示符,长度+buffer.length();return true;case 3:System.out.println(buffer+数字+buffer.length();return true;case 4:for(int j=0;jborders.length;j+)if(bordersj.equals(buffer)System.out.println(buffer+界符+j);return true;return false;case 5:for(int j=0;jarithmetic.length;j+)if(arithmeticj.equals(buffer)System.out.println(buffer+运算符+j);return true;return false;case 6:for(int j=0;jrelation1.length;j+)if(relation1j.equals(buffer)System.out.println(buffer+关系符+j);return true;return false;case 7:for(int j=0;jrelation2.length;j+)if(relation2j.equals(buffer)System.out.println(buffer+关系符+j);return true;return false;default:System.out.println(buffer+未知);return false;case 8:System.out.println(错误,数字后面不能跟字母);System.exit(0);/结束程序return false;public static void main(String args) throws Exception reader = new InputStreamReader(new FileInputStream(d:/source.c);char cbuffer;cbuffer = (char) reader.read();while(!isOver)if (Character.isLetter(cbuffer) cbuffer=alphaprocess(cbuffer); else if (Character.isDigit(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer);程序运行截图:(1) 判断输入的字符(2)字符有误时报错实验2:算符优先分析程序的设计与实现一、实验内容【实验目的和要求】设计、编制、调试一个典型的算符优先语法分析程序,实现对如下文法的算符优先语法分析,进一步掌握常用的语法分析方法。算符优先分析法是Floyd在1963年首先提出来的,是一种古典而又实用的方法,用这种方法在分析程序语言中的各类表达式时尤为有效。不少编译程序中都使用这种方法分析表达式。算符优先分析法就是仿照算术表达式的运算过程而提出的一种自底向上的语法分析方法。其基本思想是:首先规定算符,这里是文法的终极符之间的优先关系,然后根据这种优先关系,通过比较相邻算符的优先次序来确定句型中的“句柄”,然后进行归约。算符优先分析法的关键:算符优先分析法的关键就是寻找当前句型中的最左素短语,并归约它。【实验内容】从键盘输入表达式串,利用算符优先法求出其值,如输入表达式有错,则给出报错提示。表达式以“#”结尾。构造算符优先关系表的算法用程序来实现对文法的算符优先关系表的构造。例如:输入字符串“2*(3+4)+5#”,字符串以#结尾,通过运算输出“2*(3+4)+5=19”【实验环境】Windows PC机,任何版本的C语言。【提交内容】提交实验报告,报告内容可以在如下两种方式中任选一个:1、能够读懂程序代码,正常输入输出(截图),画出核心功能的数据流图,对数据流图进行文字描述。2、按照所讲的思路,用C语言编写程序,程序输入输出正常(提供程序代码、输入输出截图)。二、程序代码:IOUtil类:package yffx;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class IOUtil public static String getStringFromKeyBoard() try BufferedReader reader = new BufferedReader(new InputStreamReader(System.in);System.out.print(请输入一个表达式以#号结束:);String str = reader.readLine(); return str; catch (IOException e) e.printStackTrace();return null;StringUtil类:package yffx;import java.util.Vector;public class StringUtil public static String splitExp(String str) Vector v = new Vector();int beginIndex = 0;for (int i = 0; i 32 & str.charAt(i) 48 & str.charAt(i) != 46)| str.charAt(i) = 94) if (beginIndex != i)v.add(str.substring(beginIndex, i);v.add(String.valueOf(str.charAt(i);beginIndex = i + 1;if (beginIndex != str.length()v.add(str.substring(beginIndex, str.length();String result = new Stringv.size();for (int i = 0; i , , , , , , , , , , , , , , , , , , , , , $, $, , , , , , , , , =, $, , , , $, $, , , , , , , , , $, =, , , , , , , , ; private static int judgePriority(char c) int priority = 0;switch (c) case +:priority = 0;break;case *:priority = 1;break;case /:priority = 2;break;case i:priority = 3;break;case (:priority = 4;break;case ):priority = 5;break;case #:priority = 6;break;case :priority = 7;break;return priority;public static char getPriority(char m, char n) return PriorityTable.tablejudgePriority(m)judgePriority(n);OperatorPriority类:package yffx;import java.math.BigDecimal;import java.util.Stack;import sujun.StringUtil;import sujun.IOUtil;public class OperatorPriority private Stack optrStack; private Stack opndStack;private String input; Public OperatorPriority(String input) super();optrStack = new Stack();opndStack = new Stack();optrStack.push(#);this.input = input;public float operateTwoNum(float a, float b, char op) BigDecimal da = new BigDecimal(Float.toString(a);BigDecimal db = new BigDecimal(Float.toString(b);switch (op) case *:return da.multiply(db).floatValue();case +:return da.add(db).floatValue();case -:return db.subtract(da).floatValue();case /:return db.divide(da, 7, BigDecimal.ROUND_HALF_UP).floatValue();case :return db.pow(int) a).floatValue();return 0;public boolean isOperator(char ch) if (ch = + | ch = - | ch = * | ch = / | ch = (| ch = ) | ch = # | ch = )return true;elsereturn false;public String scanner() throws Exception int postion = 0; char operator = 0; float a = 0, b = 0; String exp = StringUtil.splitExp(input);while (true) if (exppostion.length() = 1& isOperator(exppostion.charAt(0) if (!optrStack.isEmpty() if (PriorityTable.getPriority(optrStack.peek().charValue(),exppostion.charAt(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- CN120208785A 一种碳酸二乙酯热泵精馏装置及工艺
- 老年人保健知识培训小结课件
- 生物的变异和进化-2025年高考生物专项复习原卷版
- 人教版八年级英语下册专练:短文填空20篇(含答案)
- CN120198213A 基于穿透监管的自适应风险评估调整方法及系统
- 人教版八年级英语下册 Unit 1-Unit 10 期末复习之作文书面表达范文
- 配送员礼仪基础知识培训课件
- 2025版水电费远程抄表与用户服务合同
- 2025年企业研发项目抵押借款合同
- 2025版企业合同管理流程再造及优化方案
- DB31T 1400-2023 药品生产全过程数字化追溯体系建设和运行规范
- 综合与实践:数学连环画(大单元教学设计) 一年级数学下册 (苏教版2025)
- 《电子商务基础(第二版)》课件 第三章 网络营销
- GB/T 45637-2025电动牙刷性能测试方法
- 菜鸟驿站合伙合同协议
- 2025年呼伦贝尔农垦集团有限公司工作人员招聘考试试题
- 公司志编纂工作方案
- 新人教版物理八年级下册知识点总结-物理八年级下册考点人教版
- 抗战胜利70周年主题班会教案
- 2025年九年级语文上册课后习题参考答案
- 全套课件-工程建设监理概论
评论
0/150
提交评论