编译原理实验报告(共21页).doc
《编译原理实验报告(共21页).doc》由会员分享,可在线阅读,更多相关《编译原理实验报告(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上编译原理实验报告姓名: 余同庆 班级: 软件1005班 学号: 日期: 2012-6-7 中南大学软件学院2012年06月专心-专注-专业第一部分 词法分析词法分析程序设计与实现一、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。二、实验内容自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。
2、并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)三、实验要求1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号;3. 识别出的单词以的形式保存在符号表中,正确设计和维护符号表;4. 对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;四、程序设计思路这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查、填适当的信息表。经过
3、词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。1. 定义部分:定义常量、变量、数据结构。2. 初始化:从文件将源程序全部输入到字符缓冲区中。3. 取单词前:去掉多余空白。4. 取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。5. 显示结果。五、实验步骤1. 定义目标语言的可用符号表和构词规则;2. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3. 对正确的单词,按照它的种别以的形式保存在符号表中;4. 对不正确的单词,做出错误处理
4、。六、实验代码Lexer.javapackage lexer;import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Lexer / 关键字列表private String keyWords = if, int, for, while, do, return, break, continue ;/ 分隔符列表private char separators = , ;, , , (, ), ,;/ 运算符列表p
5、rivate char operators = =, +, -, *, /, %;/ 关系运算符列表private char relelationOpts = , , !, =;private String fileName;/ 文件名private StringBuffer buffer = new StringBuffer();/ 动态Buffer数组,用于存储从文件中读取的字符串private static int index = 0;private FileWriter writer = null;/ 选择带分析文件public void OpenFile(String fileNam
6、e) this.fileName = fileName;/ 从文件中读取要分析的C语言程序public void readFile() try / 读取文件流BufferedReader fileReader = new BufferedReader(new FileReader(this.fileName);String temp = null;/ 定义一个临时字符串,用于暂时存放读取的文件内容while (temp = fileReader.readLine() != null) buffer.append(temp);/ 将读取的文件内容追价至动态buffer数组中 catch (Exc
7、eption e) System.out.println(文件操作错误: + e.toString();public void writeFile(String fileName) try writer = new FileWriter(fileName); catch (IOException e) System.out.println(文件操作错误: + e.toString();public void closeStream() try writer.flush();writer.close(); catch (IOException e) e.printStackTrace();/ 判
8、断是否为关键字boolean isKeyWord(String ch) / 依次匹配关键字表for (int i = 0; i = 48 & ch = 65 & ch = 97 & ch = 122) | (ch = 95)return true;elsereturn false;/ 判断是否为标识符或关键字boolean isToken(char ch) if (isLetter(ch)StringBuffer temp = new StringBuffer();temp.append(ch);ch = buffer.charAt(+index);while (isLetter(ch) |
9、isDigit(ch) temp.append(ch);ch = buffer.charAt(+index);if (isKeyWord(temp.toString() translate(1, temp.toString();return true; else translate(2, temp.toString();return true;elsereturn false;/ 判断是否是分隔符boolean isSeparator(char ch) / 依次匹配关键字表for (int i = 0; i separators.length; i+)if (separatorsi = ch)
10、translate(5, String.valueOf(ch);index+;return true;return false;/ 判断是否是常数boolean isConstant(char ch)if(isDigit(ch)StringBuffer temp = new StringBuffer();while (isDigit(ch) temp.append(ch);ch = buffer.charAt(+index);translate(3, temp.toString();return true;return false;/ 判断是否是运算符boolean isOperator(ch
11、ar ch) / 依次匹配运算符表for (int i = 0; i operators.length; i+)if (operatorsi = ch)translate(4, String.valueOf(ch);index+;return true;/ 依次匹配关系运算符表for (int i = 0; i relelationOpts.length; i+)if (relelationOptsi = ch)translate(4, String.valueOf(ch);index+;return true;return false;/ 输出格式void translate(int num
12、, String ch)try / 输出到文件writer.write( + num + , + ch + );writer.write(rn); / 换行writer.flush(); catch (IOException e) e.printStackTrace();System.out.println( + num + , + ch + );/ 词法分析过程public void analyze() char ch;while (index buffer.length() ch = buffer.charAt(index);/ 利用短路运算if (isToken(ch) | isSepa
13、rator(ch) | isConstant(ch) | isOperator(ch) else index+; / 字符指针前移TestLexer.javapackage testCompiler;import lexer.Lexer;public class TestLexer public static void main(String args) Lexer lexer = new Lexer();lexer.OpenFile(F:/test.txt);lexer.writeFile(F:/words.txt);lexer.readFile();lexer.analyze();lexe
14、r.closeStream();七、实验结果对于这一段程序:其运行结果如图所示:第二部分 语法分析预测分析法设计与实现一、实验目的加深对语法分析器工作过程的理解;加强对预测分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。二、实验内容在实验1的基础上,用预测分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。三、实验要求1. 对语法规则有明确的定义;2. 编写的分析程序能够对实验一的结果进行正确的语法分析;3. 对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 21
限制150内