哈工大编译原理实验1——词法分析
2016-02-23 16:33
861 查看
设计实现类高级语言的词法分析器,基本功能如下:
(1) 能识别以下几类单词:
标识符(由大小写字母、数字以及下划线组成,但必须以字母或者下划线开头)
关键字(①类型关键字:整型、浮点型、布尔型、记录型;②分支结构中的if和else;③循环结构中的do和while;④过程声明和调用中的关键字)
运算符(①算术运算符;②关系运算符;③逻辑运算)
界符(①用于赋值语句的界符,如“=”;②用于句子结尾的界符,如“;”;③用于数组表示的界符,如“[”和“]”;④用于浮点数表示的界符“.”)
常数(无符号整数和浮点数,包括指数形式)
注释(/*……*/形式)
(2)能够进行词法错误处理。识别出输入程序中的词法错误,准确给出错误所在位置,并采用可行的错误恢复策略。输出的错误提示信息格式如下:
Error at Line [行号]:[说明文字]
(3)系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖第(1)条中列出的各类单词,并包含各种单词拼写错误。
这里采用的token字符串识别方法是基于DFA状态转移
与之对应可以建立一个二维数组进行状态判断
//DFA of digit
public static String digitDFA[] = {
全部工程源代码:https://github.com/SalamanderJY/Compiler_Experiment
(1) 能识别以下几类单词:
标识符(由大小写字母、数字以及下划线组成,但必须以字母或者下划线开头)
关键字(①类型关键字:整型、浮点型、布尔型、记录型;②分支结构中的if和else;③循环结构中的do和while;④过程声明和调用中的关键字)
运算符(①算术运算符;②关系运算符;③逻辑运算)
界符(①用于赋值语句的界符,如“=”;②用于句子结尾的界符,如“;”;③用于数组表示的界符,如“[”和“]”;④用于浮点数表示的界符“.”)
常数(无符号整数和浮点数,包括指数形式)
注释(/*……*/形式)
(2)能够进行词法错误处理。识别出输入程序中的词法错误,准确给出错误所在位置,并采用可行的错误恢复策略。输出的错误提示信息格式如下:
Error at Line [行号]:[说明文字]
(3)系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖第(1)条中列出的各类单词,并包含各种单词拼写错误。
这里采用的token字符串识别方法是基于DFA状态转移
与之对应可以建立一个二维数组进行状态判断
//DFA of digit
public static String digitDFA[] = {
"#d#####", "#d.#e##", "###d###", "###de##", "#####-d", "######d", "######d" };
//判断输入符号是否符合状态机 public static int in_digitDFA(char ch, char test) { if (test == 'd') { if (isDigit(ch)) return 1; else return 0; } else { if (ch == test) return 1; else return 0; } }
//初始化进入1状态 int state = 1; //声明计数变量 int k; Boolean isfloat = false; while ( (ch != '\0') && (isDigit(ch) || ch == '.' || ch == 'e' || ch == '-')) { if (ch == '.' || ch == 'e') isfloat = true; for (k = 0; k <= 6; k++) { char tmpstr[] = digitDFA[state].toCharArray(); if (ch != '#' && 1 == in_digitDFA(ch, tmpstr[k])) { token += ch; state = k; break; } } if (k > 6) break; //遍历符号先前移动 i++; if(i>=strline.length) break; ch = strline[i]; }
全部工程源代码:https://github.com/SalamanderJY/Compiler_Experiment
相关文章推荐
- 实现一个简单的计算器
- NOP(N) NOP_##N
- 编译器是如何工作的?(转)
- 写给想学java的朋友!
- 学java的必看!
- java中的加密!
- java中的使用类!
- LEX/FLEX词法分析器
- 如何模仿人的学习模式来教计算机程序解数学题?
- 上下文无关文法1
- 上下文无关文法2
- 编译原理——词法分析器
- 编译原理预习笔记------名词理解
- Simple scanner of c
- 编译原理:短语、直接短语、句柄、素短语
- 编译原理中FIRST集合与FOLLOW集合的算法
- 上下文无关文法解析
- 识别浮点常量问题-编译原理程序实现
- 计算的哲学(philosophy in coding)
- 编译原理 Chapter1 Introduction 第一章 简介