当前位置:文档之家› 编译原理实验报告

编译原理实验报告

《编译原理》实验报告姓名:余同庆班级:软件1005班学号: 3902100509 日期: 2012-6-7中南大学软件学院2012年06月第一部分词法分析词法分析程序设计与实现一、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。

二、实验内容自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。

词法分析程序的实现可以采用任何一种编程语言和编程工具。

从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。

并依次输出各个单词的内部编码及单词符号自身值。

(遇到错误时可显示“Error”,然后跳过错误部分继续显示)三、实验要求1.对单词的构词规则有明确的定义;2.编写的分析程序能够正确识别源程序中的单词符号;3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护符号表;4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;四、程序设计思路这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。

在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查、填适当的信息表。

经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。

1.定义部分:定义常量、变量、数据结构。

2.初始化:从文件将源程序全部输入到字符缓冲区中。

3.取单词前:去掉多余空白。

4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。

5.显示结果。

五、实验步骤1.定义目标语言的可用符号表和构词规则;2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3.对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;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 = {',', ';', '{', '}', '(', ')', '\'','\"'};// 运算符列表private 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 fileName) {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 (Exception 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();}}// 判断是否为关键字boolean isKeyWord(String ch) {// 依次匹配关键字表for (int i = 0; i < keyWords.length; i++){if (keyWords[i].equals(ch)){return true;}}return false;}// 判断是否为数字boolean isDigit(char ch) {if (ch >= 48 && ch <= 57)return true;elsereturn false;}// 判断是否为字母boolean isLetter(char ch) {// 分别对应大写字母,小写字母,下划线if ((ch >= 65 && ch <= 90) || (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) || 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 (separators[i] == ch){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(char ch) {// 依次匹配运算符表for (int i = 0; i < operators.length; i++){ if (operators[i] == ch){translate(4, String.valueOf(ch));index++;return true;}}// 依次匹配关系运算符表for (int i = 0; i < relelationOpts.length; i++){ if (relelationOpts[i] == ch){translate(4, String.valueOf(ch));index++;return true;}}return false;}// 输出格式void translate(int num, String ch){try {// 输出到文件writer.write("(" + num + ", \"" + ch + "\")");writer.write("\r\n"); // 换行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) || isSeparator(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();lexer.closeStream();}}七、实验结果对于这一段程序:其运行结果如图所示:第二部分语法分析预测分析法设计与实现一、实验目的加深对语法分析器工作过程的理解;加强对预测分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。

相关主题