编译原理 结课论文
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验
1、数字检测,对照符号表输出,若匹配成功,则返回序号; 2、字符串检测, 对照符号表输出,若匹配成功,则返回序号; 3、基本保留字检测,对照符号表输出,若匹配成功,则返回序号; 4、运算符检测,对照符号表输出,若匹配成功,则返回序号; 5、分隔符(界符)检测,对照符号表输出,若匹配成功,则返回序号; 6、排错处理; 结束。 3.以下给定一个 C 语言的符号表的设计和结构:
整体框架................................................................................................7 5.分析程序代码:..................................................................................... 8
语法分析的方法通常分为两类: 自上而下分析法和自下而上分析法 这次是编制一个读标识符过程,从输入的源程序中,识别出各个具有独立意义的,即标 识符基本保留字母、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编 码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续进行) 1.1 涉及知识点: 词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token) 序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称 Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。 词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一 个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单 词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用 Lex 等工具 自动生成。词法分析器(词法分析程序):从源代码中读取输入字符,产生单词序列(生成独 立的有意义的逻辑单元称作单词(token)),提交给语法分析使用。 任务:逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立 意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。
塔里木大学-信息工程学院
编译原理实验
编译原理结课论文
题目: 词法分析
作者: 电话: Email:
李健豪 15299585826
教师: 肖少拥 、 吴刚
递交日期: 2013 年 11 月 28 日
-1-
塔里木大学-信息工程学院
编译原理实验
目录
1.实验的目的与任务:............................................................................. 3 1.1 涉及知识点:................................................................................ 3 1.2 涉及技能点:................................................................................ 4
语法树
检索关键字表格
代码生成
结束
符号表
-7-
塔里木大学-信息工程学院
编译原理实验
5.分析程序代码:
5.1 部分代码分析 #include<stdio.h> #include<stdlib.h> #include<string.h> #define _KEY_WORD_END "waiting fou your expanding"/*定义关键字的结束标志*/ typedef struct { int typenum; /*种别码*/ 种别码:表示单词的类别,提供给语法分析使用。一般用整数表示,比如标识符的种别
码为 1,常数为 2,保留字为 3,运算符为 4,界符为 5。
char *word;
}WORD;
char input[255];
/*源程序缓字符冲区*/
创建一个数组用来记录源程序缓字符冲区,数组中包含的个数为 256。
char token[255]="";
/*单词缓冲区*/
创建一个数组用来记录单词缓冲区,数组中包含的个数为 256。
5.1 部分代码分析................................................................................ 8 5.2 功能实现:.................................................................................. 10 6 程序测试.................................................................................................12 7.思考总结................................................................................................13 8.参考文献................................................................................................13 9.学习编译原理后的感想....................................................................... 14
-3-
塔里木大学-信息工程学院
编译原理实验
识别出源程序中的单词; 删除无用的空白字符及注释(空格、回车 等),这些信息仅增加了源程序的可读性,便 于程序员阅读和维护程序,而对于语法分析是完全无用的。 进行词法检查,能够检测出输入中不能形成源语言任何单词的错误字符串。 1.2 涉及技能点: 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常 简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、 匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、 替换那些符合某个模式的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在 Perl 中就内建了 一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 Unix 中的工具软件(例如 sed 和 grep)普及开的。正则表达式通常缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另 一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任 意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件 地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字 符串更加灵活方便。(3)用来替换,比普通的替换更强大。正则表达式学习起来其实是很简 单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂, 一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的 理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特 有的功能并不是我们首先要理解的
I
int p_input; /*源程序字符指针*/
定义一个字符指针,指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一
个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,
指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
int p_token;
/*单词缓冲区指针*/
2 题目分析
1.这里采用 C 语言编写的源程序作为词法分析程序的输入数据,输入数据和分析结果将 在文本框中显示。词法分析器的源代码使用 C++语言编写。
2. 下面就词法分析程序中的主要变量进行说明: 主函数 main():
打开要分析的 C 语言源程序,若不能正确打开,则报错。
ຫໍສະໝຸດ Baidu
-4-
塔里木大学-信息工程学院
词法分析的目的是将输入的源程序进行划分,给出基本符号的序列,并掠过注解和空格 等分隔符号。基本符号是与输入的语言定义的词法所规定的终结符。
语法分析是编译过程的核心部分。 语法分析的基本任务是在词法分析识别出单词符号串的基础上,分析判断程序的语法结 构是否符合语法规则。
语言的语法结构用上下文无关文法来描述,因此,语法分析器的任务本质上是按上下 文无关文法的产生式,确定整个单词串是否构成语法上正确的程序。
定义一个单词缓冲区指针,这里解释一下数组指针和指针数组的区别:数组指针--指向数 组的指针,是一个指针,其指向的类型是数组;指针数组--元素为指针的数组,是一个数 组,其中的元素为指针。
-8-
塔里木大学-信息工程学院
编译原理实验
char ch; char *rwtab[]={"begin","if","then","while","do","end","int","return","char",_KEY_WOR D_END}; WORD *scaner(); /*词法扫描函数,获得一个单词*/ 词法扫描函数,根据建立的语法树和符号表筛选单词
3.支持的语句及运算:
1) 数据类型:int,char void 2) 语句:赋值(=),if, while,for,begin,then 3) 数学运算:+,-,*,/ 4) 关系运算:=,!=,>,<,>= 5) 分隔符: : , ;{ } [ ] ( ) 6) 支持函数的定义、调用 7) 支持复合语句
-5-
塔里木大学-信息工程学院
4.基本树形结构:
if 语句:
if 语句
编译原理实验
表达式
语句
语句
while 语句:
while 语句
复合语句:
表达式
语句
复合语句
声明
语句
语句
语句
-6-
塔里木大学-信息工程学院
整体框架 输入文字 词法分析
建立符号表
判断是否是字母
编译原理实验
开始 语法分析
类型检查
判断是否是数字
void main() {
int over=1; int count=0; WORD *oneword = new WORD; printf("**********请输入,以#号结束*************:\n"); scanf("%[^#]s",input); /*输入源程序字符串到缓冲区,以#结束*/ p_input=0; printf("词法分析结果是:\n\n"); while (over<1000 && over!= -1) {
2 题目分析...................................................................................................4 3.支持的语句及运算:............................................................................. 5 4.基本树形结构:..................................................................................... 6
-2-
塔里木大学-信息工程学院
编译原理实验
1.实验的目的与任务:
编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。设置该课程的目的 在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现 方法,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和 维护编译程序等方面的初步能力。编译原理是一门理论性和实践性都比较强的课程。进行上 机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。同时培养学生实 际动手能力。