《编译原理实验设计》由会员分享,可在线阅读,更多相关《编译原理实验设计(14页珍藏版)》请在金锄头文库上搜索。
1、编译原理课程设计哈尔滨师范大学计算机科学与技术编编 译译 原原 理理 课课 程程 设设 计计姓名:姓名:XXX学号:学号:XXXXXX班级:班级:XXXXX年级:年级:XXXXXX编译原理课程设计哈尔滨师范大学计算机科学与技术1词词 法法 分分 析析一、一、 实验目的实验目的设计、编制并调试一个词法分析程序,掌握词法分析的基本原理和词法分析在编译过程 中的作用,熟悉关键字表等相关的数据结构与单词的类方法,加深对词法分析原理的理解, 把握词法分析器的实现方法和技术。二、二、 实验要求实验要求1. 待分析的简单词法待分析的简单词法 (1)关键字:main int while if break el
2、se(2)运算符和界符+ - ( ) ; (3)其他单词是标识符(ID)和整型常熟(NUM) ,通过以下正规式定义:ID=letter(letter | digit)*NUM=digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔 ID、NUM、运算符、界符 和关键字,词法分析阶段通常被忽略。2. 各种单词符号对应的简单编码各种单词符号对应的简单编码表表 1 简单语言单词符号及内部表示简单语言单词符号及内部表示 单词符号种别编码单词值单词符号种别编码单词值 main3343 Int3444 While3545 If36(46 break37)47 esle3848 le
3、tter(letter|digit)3949 digit digit*40;50 +41内部字符串二进制数值表示=51内部字符串二进制数值表示-423. 词法分析程序的功能词法分析程序的功能输入:所给文法的源程序字符串 输出:二元组(temp,lexeme 或 value)构成的序列 其中,temp 为单词种别码,lexeme 为存放的单词自身字符串;value 位整型常数。4. 识别语言单词的状态转换图识别语言单词的状态转换图我们知道,从语言单词符号的两种描述方式可以构造出识别语言单词的有穷自动机,它 的非形式化描述就是状态转换图。 通常,构造词法分析程序有两种方法。第一种方法是用手工方式,
4、即根据识别语言单词编译原理课程设计哈尔滨师范大学计算机科学与技术2的状态图,使用某种高级语言,例如,java 语言直接编写此法分析程序。第二种方法就是利 用词法分析程序的自动生成工具 LEX 自动生成词法分析程序。下面以某种语言为例,对第 一种方法做简要的介绍。例如,图 2.1 是识别表 1 的单词符号的状态转换图。l 非 d非 ld 非 d+-/: =非=;其他图图 2.1 识别表识别表 1 所列的语言单词的状态转换图所列的语言单词的状态转换图三、三、 词法分析程序的算法思想词法分析程序的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立的单词符号,其基本思是根 据扫描到的单词符号
5、的第一字种类,拼出相应的单词符号。1.1. 主程序示意图主程序示意图主程序示意图如图 3.1 所示。其中初值包括如下两个方面。 (1) 关键字表的初值01234567 78910111213编译原理课程设计哈尔滨师范大学计算机科学与技术3关键字作为特殊标识符处理,把它们预先安排在一张表格中(称关键字表) ,当扫 描程序识别吃标识符时,查关键字表。如能查到匹配的单词,则该单词位关键字,否则 为一般标识符。 (2) 程序中需要用到的主要变量为 temp,lexeme 和 value。是否图图 3.13.1 词法分析主程序示意图词法分析主程序示意图2.2. 扫描子程序的算法思想扫描子程序的算法思想首
6、先设置 3 个变量: lexeme 用来存放构成单词符号的字符串;value 用来存放整 型单词;temp 用来存放单词符号的种别码。扫描子程序主要部分流程如图 3.2 所示。是 否数字 运算符、 界符等符号 其他符号否是 开始置初值调用扫描子程序输出单词二元组输入串结束结束开始变量初始化忽略空格是否文件结束拼字符串报错对不同符号给出 相应的 temp拼数temp=11Temp 为对应关键字的单词种别码temp=10是否关键字结束编译原理课程设计哈尔滨师范大学计算机科学与技术4图图 3.23.2 词法分析流程图词法分析流程图四、运行结果四、运行结果1. 正确的输入(正确的输入(test.in)
7、及结果)及结果test.in 文件内容如图 4.1 所示:图图 4.14.1 正确的输入的结果正确的输入的结果result.out 文件内容如图 4.2 所示:结束编译原理课程设计哈尔滨师范大学计算机科学与技术5图图 4.24.2 result.outresult.out 文件内容文件内容如果 test.in 中输入有误,则运行时提示:2. 有误的输入及结果有误的输入及结果有误的输入结果分别如图 4.3 和图 4.4 所示:编译原理课程设计哈尔滨师范大学计算机科学与技术6图图 4.34.3 有误的输入的结果图有误的输入的结果图图图 4.44.4 有误的输入的结果有误的输入的结果五、源程序(五、
8、源程序(Token.java Main.java lexer.java)编译原理课程设计哈尔滨师范大学计算机科学与技术71.1. Token.javaToken.java 源代码如下:源代码如下:package SimpleLexer;class Tag public final static int MAIN = 33, INT = 34, WHILE = 35, IF = 36, BREAK = 37, ELSE = 38,NUMBER = 39, REAL = 40, TRUE = 41, FALSE = 42, BASIC = 43, ID = 44, LE = 45, GE = 46
9、, NE = 47, EQ = 48, AND = 49, OR = 50; public class Token public final int tag; public Token(int t) tag = t; public String toString() String temp = “; switch (tag) case +: case -: case *: case /: case =: case : temp = “OPERATOR,“; break; case (: case ): case : case : case ;: temp = “DELIMITER,“; bre
10、ak; return “; class Num extends Token public final int value;public Num(int v) super(Tag.NUMBER); value = v;编译原理课程设计哈尔滨师范大学计算机科学与技术8public String toString() return “; class Real extends Token public final float value;public Real(float v) super(Tag.REAL); value = v; public String toString() return “;
11、 class Word extends Token public String lexeme = “;public Word(String s, int tag) super(tag); lexeme = s; public String toString() String temp = “; switch (tag) case Tag.MAIN: case Tag.WHILE: case Tag.BREAK: case Tag.IF: case Tag.ELSE: temp = “KEYWORD“; break; case Tag.ID: temp = “ID“; break; case T
12、ag.TRUE: case Tag.FALSE: temp = “BOOLVALUE“; break; case Tag.LE: case Tag.GE:编译原理课程设计哈尔滨师范大学计算机科学与技术9case Tag.NE: case Tag.EQ: temp = “OPERATOR“; break; return “; public static final Word and = new Word(“public static final Word True = new Word(“true“, Tag.TRUE), False = new Word(“false“, Tag.FALSE)
13、; class Type extends Word public int width = 0;public Type(String s, int tag, int w) super(s, tag); width = w; public String toString() return “; public static final Type Int = new Type(“int“, Tag.BASIC, 4), Float = new Type(“float“, Tag.BASIC, 8), Char = new Type(“char“, Tag.BASIC, 1), Bool = new T
14、ype(“bool“, Tag.BASIC, 1);2.2. Main.javaMain.java 源代码如下:源代码如下:package SimpleLexer; import java.io.*; public class Main public static void main(String args) throws IOException if (args.length 0); out.close(); System.setOut(console); class LexError extends Exception public LexError() / TODO Auto-gener
15、ated constructor stub public LexError(String msg) super(msg); 3.3. lexer.javalexer.java 源代码如下:源代码如下:package SimpleLexer; import java.io.*; import java.util.*;public class lexer public static int line = 1; char peek = ; Hashtable words = new Hashtable();void reserve(Word w) words.put(w.lexeme, w); public lexer() reserve(new Word(“if“, Tag.IF); reserve(new Word(“else“, Tag.ELSE); reserve(new Word(“while“, Tag.WHILE);编译原理课程设计哈尔滨师范大学计算机科学与技术11reserve(new Word(“break“, Tag.BREAK); reserve(new Word(“main“, Tag.MAIN); reserve(