编译原理课程设计报告——词法分析器的构造.doc

上传人:龙*** 文档编号:4220668 上传时间:2019-10-05 格式:DOC 页数:15 大小:152KB
下载 相关 举报
编译原理课程设计报告——词法分析器的构造.doc_第1页
第1页 / 共15页
编译原理课程设计报告——词法分析器的构造.doc_第2页
第2页 / 共15页
编译原理课程设计报告——词法分析器的构造.doc_第3页
第3页 / 共15页
编译原理课程设计报告——词法分析器的构造.doc_第4页
第4页 / 共15页
编译原理课程设计报告——词法分析器的构造.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、 课程设计任务书 设 计 题 目 词法分析器的构造 成绩 主 要 内 容 对 C 语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词 法分析器的基本方法。 利用该词法分析器完成对源程序字符串的词法分析。输出形式是源程序的单词符号二 元式的代码,并保存到文件中。 指 导 教 师 意 见 该生能按时完成课程设计任务书所规定的程序设计,综合运用 所学知识独立分析和解决问题的能力 。程序设计方案 。论文论述 ,文理 ,格式 。程序运行结果 。程序验收时回答问题 。 签名: 目 录 引言.4 第一章 概述.5 1.1 设计内容5 1.2 设计要求.5 第二章 设计的基本原理.6 2.

2、16 2.26 第三章 程序设计.7 3.1 总体方案设计.7 3.2 各模块设计.8 第四章 程序测试.9 4.1 一般测试 4.2 出错处理测试 第五章 结论.10 参考文献.10 附录 程序清单.11 引言 编译原理是国内外各高等院校计算机科学技术类专业,特别是计算机软件 专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构、工作流程及 编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强, 内容较为抽象复杂,涉及到大量的软件设计算法,因此,一直是一门比较难学的课 程。为了使学生更好地理解和掌握编译技术的基本概念、基本原理和实现方法,实 践环节非常重要,只有通

3、过上机进行程序设计,才能使学生对比较抽象的教学内容 产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软 件设计水平大有益处。 编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词 法 分 析 阶 段 是 编 译 过 程 的 第 一 个 阶 段 , 是 编 译 的 基 础 。 这 个 阶 段 的 任 务 是 从 左 到 右 一 个 字 符 一 个 字 符 地 读 入 源 程 序 , 即 对 构 成 源 程 序 的 字 符 流 进 行 扫 描 然 后 根 据 构 词 规 则 识 别 单 词 (也 称 单 词 符 号 或 符 号 )。 词 法 分 析 程 序 实 现

4、这 个 任 务 。 词 法 分 析 程 序 可 以 使 用 Lex 等 工 具 自 动 生 成 。 从 左 到 右 逐 个 字 符 对 构 成 源 程 序 的 字 符 串 进 行 扫 描 , 依 据 词 法 规 则 , 识 别 出 一 个 一 个 的 标 记 ( token) , 把 源 程 序 变 为 等 价 的 标 记 串 序 列 。 执 行 词 法 分 析 的 程 序 称 为 词 法 分 析 器 , 也 称 为 扫 描 器 。 词法分 析是所有分析优化的基础,涉及的知识较少,如状态转换图等,易于实现。本次课 程设计,我的选题是词法分析,C+代码实现。 第一章 概述 1.1 设计内容 对

5、C 语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图 设计词法分析器的基本方法。 1.2 设计要求 利用该词法分析器完成对源程序字符串的词法分析。输出形式是源程序的单词 符号二元式的代码,并保存到文件中。 (1) 假设该语言中的单词符号及种别编码如下表所示。 单词符号及种别编码 单词符号 种别编码 单词符号 种别编码 main 1 28 int 2 29 char 3 30 if 4 31 else 5 , 32 for 6 : 33 while 7 ; 34 标识符 ID 10 35 整型常数 NUM 20 36 = 21 37 + 22 38 - 23 39 * 24 !

6、40 / 25 ( ) ID 和 NUM 的正规定义式为: ID letter(letter | didit)* NUMdigit digit* lettera | | z | A | | Z digit 0 | | 9 如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一 个空格作间隔。空格由空白、制表符和换行符组成。 第二章 设计原理 2.1 符号分类 程序语言的单词符号一般分为以下五种: 关键字 标识符 常数 运算符 界符 2.2.词法分析器的二元输出 (单词种别,单词符号的属性值) 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号 各一种。 2.3

7、 正规式和状态转换图 第三章 程序设计 3.1 总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置 i 开始查找。 /并且有一个引用参数 j,用来返回这个单词最后一个字符在 str 的位置。*/ string GetWord(string str,int i,int /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断 i 当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoun

8、dary(string str,int i); /*判断 i 当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i); /*此函数将一个 pair 数组输出到一个文件中 */ void OutFile(vector v); /*此函数接受一个字符串数组,对它进行词法分析,返回一个 pair 型数组*/ vector analyst(vector vec); /*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假 */ bool IsKey(string str); 3.2 各模块设计 1.首先根据上面单词符号表及

9、 ID 和 NUM 的正规定义式,构造出状态转换图; 2.定义相关的变量和数据结构。关键字作为特殊标识符处理,把它们预先安排在一 张表格中(称为关键字表) ,当扫描程序识别出标识符时,查关键字表。如能查到匹 配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组, 其描述如下: char KEY_WORDS7=main,int,char ,if,else,for,while; 用以存放单词符号二元式的数据结构可如下定义: class Word_Analyzer public: char ContentMAXLENGTH ; int val ; void print(); ; 3

10、.按照编译程序一遍扫描的要求,把词法分析器 Scaner 作为一个独立的子程序来设 计,通过对 Scaner 的反复调用识别出所有的单词符号; 4.当 Scaner 识别出一个单词符号时,则将该单词符号的二元式写入到输出文件中。 若 Scaner 无法识别出一个单词符号时,则调用错误处理程序 PrintError,显示当前扫 描到的字符及其所在行、列位置,并跳过该字符重新开始识别单词符号。 第四章 程序测试 4.1 正常测试 测试该设计词法分析器,可对下面的源程序进行词法分析: main() int i = 10; while(i) i = i - 1; 输出如下二元式代码序列: (1,mai

11、n) (26,() (27,) (30,) (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,() (10,i) (27,) (10,i) (21, =) (10,i) (23,-) (20,1) (34,;) (31,) 第五章 结论 该词法分析器功能良好,可以完成预定的要求。 参考文献: 程序设计语言编译原理 陈火旺 C+程序设计 谭浩强 程序清单: #include #include #include #include using namespace std; /*用来存储目标文件名*/ string file_name; /*提取文本

12、文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置 i 开始查找。 /并且有一个引用参数 j,用来返回这个单词最后一个字符在 str 的位置。*/ string GetWord(string str,int i,int /*这个函数用来除去字符串中连续的空格和换行 /第一个参数为目标字符串,第二个参数为开始位置 /返回值为连续的空格和换行后的第一个有效字符在字符串的位置*/ int DeleteNull(string str,int i); /*判断 i 当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string s

13、tr,int i); /*判断 i 当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i); /*此函数将一个 pair 数组输出到一个文件中*/ void OutFile(vector v); /*此函数接受一个字符串数组,对它进行词法分析,返回一个 pair 型数组*/ vector analyst(vector vec); /*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/ bool IsKey(string str); int main() string com1=“ “; string com2

14、=“n“; string fileline=GetText(); int begin=0,end=0; vector array; do begin=DeleteNull(fileline,begin); string nowString; nowString=GetWord(fileline,begin,end); if(end=-1) break; if(nowS pare(com1) begin=end+1; while(true); vector mid_result; mid_result=analyst(array); OutFile(mid_result); coutfile_n

15、ame1; ifstream infile(file_name1.c_str(),ios:in); if (!infile) cerr v) cout analyst(vector vec) vector temp; int i; for(i=0;i“|veci=“|veci=“!“) jk.append(vec+i,0,1); pair pp(4,jk); temp.push_back(pp); continue; if(veci=“+“ jk.append(vec+i,0,1); pair pp(4,jk); temp.push_back(pp); continue; if(IsBound

16、ary(veci,0) pair pp(5,veci); temp.push_back(pp); else if(IsOperation(veci,0) pair pp(4,veci); temp.push_back(pp); else if(veci0=0) pair pp(3,veci); temp.push_back(pp); else pair pp(2,veci); temp.push_back(pp); else if(veci0=0) pair pp(3,veci); temp.push_back(pp); else if(IsKey(veci) pair pp(1,veci);

17、 temp.push_back(pp); else pair pp(2,veci); temp.push_back(pp); return temp; /*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/ bool IsKey(string str) string p16=“char“,“double“,“int“,“long“,“double“,“float“,“for“,“while“,“do“,“break“,“continue“,“ switch“,“short“,“case“,“return“,“if“; vector ppp(p,p+16); int u; for(u=0;uppp.size();u+) if(! pare(pppu) return true; return false; /*finished*/

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。