词法分析器课程设计
编译原理课程设计—词法分析器
编译原理课程设计(一)——词法分析器1、题目编写程序实现一个简易的词法分析器。
2、实验目的对一段程序代码进行词法分析,将程序段中的关键字、标识符、常数、运算符、界符按照一定的种别编码分析出来。
3、环境及工具操作系统:windows XP ;使用工具:Microsoft Visual C++ 6.0; 编程语言:C 语言;4、分析程序输入:从文件中读入程序段;程序输出:由单词种别和单词符号的属性值组成的二元式;单词种别通常使用整数编码,编码方式可以有多种,在设计词法分析器之前应确定一种程序处理起来较方便的编码方式。
当一个种别中含有多个单词符号时,在分析出其属于哪个种别的时候应同时给出其单词符号属性,本程序为方便起见,采用单词符号本身来作为其属性,以标识同种别种的不同单词符号。
标识符及关键字的识别:字母开头的字母和数字组成的串是多数编程语言的标识符,所以我们的简易词法分析器中,将标识符定义为这种字母数字串。
当第一个字母为字母且紧接着的字符为数字或字母时,应将其串接在一起为一个单词,直到紧跟着的不在是字母数字时。
由于关键字通常为一个单词,则这样得到的串可能是标识符也可能是关键字,又因为一种语言的关键字通常是有限个,则我们可以构造一个存放所有关键字的表,查询关键字表,可以判断得到的串是否为关键字。
界符和运算符的识别:它们多为当个字符,建立两个分别存放界符合运算符的表,读取字符后,进行查表便可以得出它们的类型。
为方便词法分析器的设计,可以使用状态转换图,根据一种特定的编程语言先设计出其状态转换图才能更好将其用代码实现。
典型状态转换图结构如下:(a)有不含回路含分支的状态节点:对应if …else if …else …语句;(b)有含回路的状态节点:对应while …if …语句。
(b )5、状态转换图6、程序框架描述程序中编写了以下函数,各个函数实现的作用如下:1. GetChar():将下一输入的字符读入到全局变量ch中,搜素指示器前移一个字符的位置。
编译原理课程设计_词法分析器设计
编译方法课程设计词法分析器设计学院:计算机与信息工程学院专业:软件工程学号:姓名:指导教师:职称:设计报告日期:二О一二年十二月目录1设计概述 (2)1.1设计题目 (2)1.2 设计目的 (3)1.3 设计任务内容: (3)1.4 设计时间 (3)2 设计环境与工具 (3)3设计要求 (3)4分析与概要设计 (4)5算法描述与框图 (4)6 源程序清单 (6)7 软件测试 (10)7.1 设计的测试题目 (10)7.2测试结果截图 (10)8 总结 (10)8 参考文献 (11)1设计概述1.1设计题目词法分析器的设计与实现。
1.2 设计目的词法分析是编译程序第一个阶段的工作,它的任务是对输入的字符串形式的源程序进行扫描,在扫描的同时,根据源语言的词法规则识别具有独立意义的单词。
本设计是C++高级程序语言,数据结构和变异原理中词法分析原理等知识的综合运用。
掌握生成词法分析器的方法,加深对词法分析原理的理解,掌握设计,编制并调试词法分析程序的思想和方法。
1.3 设计任务内容:1、格式输入:将C++语言的源代码从文本文档中读入。
处理:对输入框中的代码进行词法分析,分离出关键字、标示符、数值、运算符和界符。
输出:在文本文档中输出每个单词对应的编码和值。
2、编译对象声明和其他标记赋值语句分支结构语句循环语句1.4 设计时间2012年12月23日至2012年12月28日2 设计环境与工具Windows7环境下使用 C++语言。
3设计要求1、使用任何一种编程语言编制一个词法分析程序。
2、该程序能够识别的单词有5类:(1)关键字:"long", "float", "static", "char", "short", "switch", "int", "const", "if", "then", "else", "for", "while", "break"。
编译原理课程设计词法分析器文档
2011—2012学年第一学期《编译原理》课程设计报告专业:计算机科学与技术学生姓名:张金荣指导教师:孔繁茹完成时间:2017年8月15日目录第 1 节课程设计目的 (1)第 2 节课程设计要求 (1)第 3 节课程设计内容 (2)第 4 节状态转换图 (4)第 5 节实现工具 (4)第 6 节实现函数 (4)第7 节测试结果 (5)第8 节实验源代码 (6)第9 节参考文献 (9)致谢感设计目的①理解词法分析器的基本功能。
词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号(token),把作为字符串的源程序改造成单词符号串的中间程序。
因此,词法分析是编译的基础。
②理解词法规则的描述方法。
程序设计语言一般可以用标识符、关键字、运算符、分隔符、常量、字符串和注释符来描述④理解状态转换图及其实现。
一个状态转换图可用于识别(或接受)一定的字符。
大多数程序语言的单词符号都可以用转换图予以识别。
转换图非常易于用程序实现,最简单的办法是让每个状态结对应一小段程序。
④能够编写简单的词法分析器。
2.课程设计的要求手工构造一个简单的词法分析程序, 能够识别标识符、整数、关键字、算符、界符。
①画出识别单词的状态转换图。
(若状态转换图过于复杂,可以只画出主要部分;若依旧复杂,可只识别标识符和整数)②根据状态转换图手工构造词法分析程序。
从以下方法中选一:✧词法分析器作为独立的一遍。
词法分析结果输出到屏幕上或存入文件。
✧词法分析器作为一个子程序被语法分析器调用。
每次调用返回一个单词同时将单词及属性存入符号表③实现状态转换图。
从以下方法中选一:✧直接转向法✧表驱动法四、选做实验☻使用缓冲技术3.课程设计内容程序语言的单词符号一般可分为下列五种。
(1)关键字是由程序语言定义的具有固定意义的标志符。
本程序定义char,short,int,unsigned,long,float,double,struct,union,void,enum,cons t,typedef,auto,static,break,case,continue,default,do,else,for,if,retu rn,switch,while,sizeof,printf,FILE,fopen,NULL,fclose,exit,read,closef ,printf为关键字。
词法分析课程设计
词法分析课程设计一、课程目标知识目标:1. 学生能够理解并掌握词法分析的基本概念和原则;2. 学生能够识别并分类常见的词汇成分,如名词、动词、形容词、副词等;3. 学生能够运用词法知识分析句子结构,识别句子中的主干和修饰成分;4. 学生了解词汇在不同语境中的含义变化,提高词汇理解和运用能力。
技能目标:1. 学生能够运用词法分析技巧,准确理解文本中的词汇意义;2. 学生能够运用所学的词法知识进行句子分析和解读;3. 学生通过词法练习,提高语言表达和写作能力;4. 学生能够运用词法知识解决实际问题,提高解决问题的能力。
情感态度价值观目标:1. 学生培养对语言学习的兴趣和热情,增强学习动力;2. 学生树立正确的语言观念,尊重和欣赏各种语言表达方式;3. 学生通过词法学习,培养严谨、细致的学习态度,提高自我要求;4. 学生在小组合作学习中,培养团队协作精神和沟通能力。
本课程针对的学生特点为具有一定语言基础和认知能力的年级学生。
课程性质为理论联系实际,注重培养学生的实际运用能力。
在教学过程中,要求教师结合课本内容,设计丰富多样的教学活动,引导学生积极参与,确保课程目标的实现。
通过本课程的学习,学生将能够具备扎实的词法知识,提高语言表达和写作能力,同时培养良好的情感态度价值观。
后续教学设计和评估将围绕具体学习成果展开,以确保课程目标的达成。
二、教学内容本课程教学内容紧密结合课程目标,选取以下部分进行详细讲解:1. 词法基础知识:介绍词法分析的基本概念、原则和作用,引导学生了解词汇的构成和特点。
教学内容:(1)词汇的概念和分类;(2)词素的构成和功能;(3)词汇的语义关系。
2. 词汇成分分析:详细讲解名词、动词、形容词、副词等常见词汇成分的识别和分类。
教学内容:(1)名词的识别和分类;(2)动词的识别和分类;(3)形容词的识别和分类;(4)副词的识别和分类。
3. 句子结构分析:通过实例分析,使学生掌握句子中的主干和修饰成分。
课程设计编译方法词法分析器
《编译原理》课程设计指导书一、课程设计的目的本次课程设计的时间为2周,目的是通过实际的题目如:词法分析、语法分析、代码优化等,使学生了解和掌握编译程序的工作原理,同时培养学生用相关的程序设计语言进行程序设计,实现编译的功能,从而提高学生的综合能力。
二、设计名称:小型语言编译器的设计/编译技术的计算机实现。
三、设计要求本次课程设计有两种选择:合作完成与独立完成。
若选择合作完成,则需自行组合5位学生成为一个小组,小组成员合作完成一个小型编译器(见设计内容题目一)。
若选择独立完成,则从设计内容题目二的13个题目中任选一个独立实现。
这13个题目,都有一定的工作量,涵盖本课程内容和实际应用相关的主要技术。
四、设计内容题目一:小型语言编译器的设计。
1、通过设计、编制、调试一个对于小型语言词法的词法分析程序,加深对词法分析原理的理解,并实现输出单词序列的词法检查和分析。
(建议1名学生完成)2、设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解。
(建议1名学生完成)3、设计、编制、调试一个布尔表达式的语法及语义分析程序,加深对语法及语义分析原理的理解。
(建议1名学生完成)4、设计、编制、调试一个条件语句的语法及语义分析程序,加深对语法及语义分析原理的理解。
(建议1名学生完成)5、设计、编制、调试一个循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解。
(建议1名学生完成)6、将前5个要求得到的程序合并成一个小型语言的语法制导的三地址代码生成器。
(5名学生共同完成)题目二:下列13个题目任选。
选题说明:可以从下列题目中任选一题,每个题目按难度设定不同的参考分数,上机成绩采用100分制。
题目指定的参考分数仅适用于上机程序部分,实验报告成绩有自己的标准。
1.文法的计算机表示设计要求:1.可以使用任何语言来完成,例如:Java、C、C++。
2.文法中的空字符串统一使用@表示。
3.包括各种可能出现的文法描述方法。
编译原理词法分析器语法分析课程设计范本
《编译原理词法分析器语法分析课程设计-《编译原理》课程设计院系信息科学与技术学院专业软件工程年级级学号 2723姓名林苾湲西南交通大学信息科学与技术学院12月目录课程设计1 词法分析器 (2)设计题目 (2)设计内容 (2)设计目的 (2)设计环境 (2)需求分析 (2)概要设计 (2)详细设计 (4)编程调试 (5)测试 (11)结束语 (13)课程设计2 赋值语句的解释程序设计 (14)设计题目 (14)设计内容 (14)设计目的 (14)设计环境 (14)需求分析 (15)概要设计 (16)详细设计 (16)编程调试 (24)测试 (24)结束语 (25)课程设计一词法分析器设计一、设计题目手工设计c语言的词法分析器(能够是c语言的子集)。
二、设计内容处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。
三、设计目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。
四、设计环境该课程设计包括的硬件和软件条件如下:.硬件(1)Intel Core Duo CPU P8700(2)内存4G.软件(1)Window 7 32位操作系统(2)Microsoft Visual Studio c#开发平台.编程语言C#语言五、需求分析.源程序的预处理:源程序中,存在许多编辑用的符号,她们对程序逻辑功能无任何影响。
例如:回车,换行,多余空白符,注释行等。
在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。
.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。
单词符号能够划分成5中。
(1)标识符:用户自己定义的名字,常量名,变量名和过程名。
(2)常数:各种类型的常数。
(3) 保留字(关键字):如if、else、while、int、float 等。
(4) 运算符:如+、-、*、<、>、=等。
编译原理 设计c语言的词法分析器
编译原理课程设计报告题目:学院:教师::学号:班级:评分:签字:编译原理课程设计一:设计c语言的词法分析器一、实验目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。
二、实验要求了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。
三、实验设计3.1.单词分类及表示3.1.1 C语言的子集分类(1)标识符:以字母开头的字母数字串(2)整数或浮点型。
(3)保留字:for,while,do,else,if,static,int,sizeof,break,continue(4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||;(5)界符:"(",")",",",":",";","{","}"3.1.2单词二元组(单词分类号、单词自身值)3.2 词法分析器的设计3.2.1算法设计3.2.1.1概要设计从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。
3.2.1.2状态图设计开始打开txt文件读取c语言代码扫描是否读取到相应字符常数?标识符保留字运算符记录标号结束界符?YY Y3.2.2输入输出设计输入:通过文件指针从文件中一个一个读取字符输出:输出单词二元组至文件。
格式为(种别码,值)3.2.3主要函数void Getchar(FILE *fp ) //读入一个字符void GetBC(FILE *fp)//读入一个非空字符void contacat()//连接字符int letter()//判断是否为字母int digit()//判断是否为字母void retract(FILE *fp,char *c)//回退int reserve (char **k)//处理保留字int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)//写到文件void WordAnalyze(char **k,char *c, char **CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw)//词法分析函数四、结果测试文件输入int main(){int a=1,b=3;if(a>1)b=b-2;}输出结果:结论:程序输出结果与期望输出结果相符。
编译原理课程设计-词法分析器的设计及实现(C)
词法分析器的设计一.设计说明及设计要求一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。
本课程设计即为词法分析阶段。
词法分析阶段是编译过程的第一个阶段。
这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。
如保留字(关键字或基本字)、标志符、常数、算符和界符等等。
二.设计中相关关键字说明1.基本字:也称关键字,如C语言中的if , else , while , do ,for,case,break, return 等。
2.标志符:用来表示各种名字,如常量名、变量名和过程名等。
3.常数:各种类型的常数,如12,6.88,和“ABC”等。
4.运算符:如+ ,- , * , / ,%, < , > ,<= , >= 等。
5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。
三、程序分析词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析。
词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。
然而,更一般的情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。
词法分析程序每得到一次调用,便从源程序文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。
四、模块设计下面是程序的流程图五、程序介绍在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。
程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。
本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。
词法分析器课程设计要求
※<实验一词法分析>一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。
本实验中,采用的是一类符号一种别码的方式。
2、单词的BNF表示<标识符- <字母<字母数字串<字母数字串-<字母<字母数字串|<数字<字母数字串|<下划线<字母数字串|ε<无符号整数- <数字<数字串<数字串- <数字<数字串 |ε<加法运算符- +<减法运算符- -<大于关系运算符-<大于等于关系运算符-=3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。
如当前待分析字符串为“a+”,当前字符为’’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。
于是分析器读入下一个字符’+’,这时可知应将’’解释为大于运算符。
但此时,超前读了一个字符’+’,所以要回退一个字符,词法分析器才能正常运行。
在分析标识符,无符号整数等时也有类似情况。
4、模块结构三、实验过程和指导:(一)准备:1.阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。
2.初步编制好程序。
3.准备好多组测试数据。
(二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。
编译原理课程设计报告——词法分析器
精选课程设计任务书引言 (4)第一章概述 (5)1.1设计内容 (5)1.2设计要求 (5)第二章设计的基本原理 (6)2.1 (6)2.2 (6)第三章程序设计 (7)3.1 总体方案设计 (7)3.2 各模块设计 (8)第四章程序测试 (9)4.1一般测试4.2出错处理测试第五章结论 (10)参考文献 (10)附录程序清单 (11)引言《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。
该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。
由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计算法,因此,一直是一门比较难学的课程。
为了使学生更好地理解和掌握编译技术的基本概念、基本原理和实现方法,实践环节非常重要,只有通过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。
编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。
词法分析阶段是编译过程的第一个阶段,是编译的基础。
这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
词法分析程序实现这个任务。
词法分析程序可以使用 Lex 等工具自动生成。
从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token ),把源程序变为等价的标记串序列。
执行词法分析的程序称为词法分析器,也称为扫描器。
词法分析是所有分析优化的基础,涉及的知识较少,如状态转换图等,易于实现。
本次课程设计,我的选题是词法分析, C++ 代码实现。
第一章概述1.1 设计内容对 C 语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法。
1.2设计要求利用该词法分析器完成对源程序字符串的词法分析。
编译原理词法分析器__2010课程设计
目录第1章概述 (2)1.1 编译原理概述 (2)1.1.1 词法分析器概述 (2)第2章词法分析器课程设计 (2)2.1课程设计目的 (2)2.2 课程设计要求及内容 (2)第3章问题分析及相关原理介绍 (3)3.1 设计思想及算法 (3)3.2 算法实现及模拟 (4)第4章设计思路及关键问题的解决方法 (5)4.1 设计流程图 (5)第5章运行结果及测试分析 (6)5.1运行结果及功能说明 (6)心得体会 (7)附录源程序 (8)第1章概述1.1 编译原理概述编译原理是介绍编译器构造的一般原理和实现方法的课程,其中包括词法分析、语法分析、语义分析、中间代码生成、目标代码生成优化、独立于机器的优化和依赖于机器的优化等。
编译器技术的发展,特别是计算机体系结构的发展对编译技术的推动,使其成为计算机专业人士所必需具备的基础知识之一。
1.1.1 词法分析器概述词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。
并确定其属性(如保留字、标识符、运算符、界限符和常量等)。
再把它们转换称长度统一的标准形式——属性字(TOKEN)。
而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。
下面我所要介绍的词法分析器是第一种把它作为主程序。
第2章词法分析器课程设计2.1课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。
同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想2.2 课程设计要求及内容2.2.1词法分析器设计内容及要求(1)设计内容:运用所学习的编程工具编写词法分析器,本次设计我采用C++编写实现其输入输出功能。
词法分析器课程设计报告
2009-2010学年第二学期《编译原理》课程设计报告学院(系):________班级:_________________________学生姓名:__________________________学号: _______________________指导教师:______________________时间:2010年6月目录1. 课程设计的目的......................................................................... 1. ..2.课程设计的内容及要求............................................... 1..2.1. ......................................................................................................... 课程设计内容......................................................................... 1. ..2.2. ......................................................................................................... 课程设计要求......................................................................... 2. ..2.3. ......................................................................................................... 运行环境......................................................................... 3. ..2.4. ......................................................................................................... 程序的不足.........................................................................3. ..3.问题分析及相关原理介绍............................................. 3..3.1.编译程序介绍3...3.2.各部分的功能介绍及分析....................................... 3..3.3. 算法实现及模拟 ..............................................4..3.3.1总体流程图..............................................4..3.3.2 详细的流程图............................................ 5.. 4.设计思路及关键问题的解决方法....................................... 7..4.1. ......................................................................................................... 设计思路及关键问题...................................................... 7..4.1.1处理时机................................................................. 7...4.1.2 一个棘手问题............................................ 8..4.2. ......................................................................................................... 解决方法......................................................................... 8. ..5.结果及测试分析......................................................................... 8. ..5.1. ......................................................................................................... 待分析程序的部分内容.................................................... 8..5.2. ......................................................................................................... 运行结果......................................................................... 9. ..6.总结....................................................................... 1..0..6.1. ....................................................................................................... 设计过程....................................................................... 1..0.6.2. ....................................................................................................... 困难与收获....................................................................... 1..1.参考文献....................................................................... 1..1.附录....................................................................... 1..1..1.课程设计的目的通过课程设计实践,树立正确的设计思想,巩固所学编程语言基本知识,增进C 语言编辑基本功;综合运用所学的理论知识,进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解;掌握课程设计的一般方法与步骤,深入掌握课程设计的基本理论、方法和步骤,提高自己的编程能力,培养好的程序设计风格。
编译原理课程设计报告词法分析器
一.课程设计题目:词法分析器的实现二.课程设计成员三.课程设计内容和要求设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。
词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。
单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。
词法分析是编译过程中的一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
要求:通过词法分析器能够实现以下五种类型如单词等的识别。
(1)关键字"begin","end","if","then","else","while","write","read"等,"do", "call","const","char","until","procedure","repeat"等(2)运算符:"+","-","*","/","="等(3)界符:"{","}","[","]",";",",",".","(",")",":"等(4)标识符(5)常量四.操作要求首先建立一个或多个文档,此处新建了两个文档,例:07196133.txt文本文档和zhaoxiaodong.txt文本文档,以供选择,各文本文档中都输入有不同的内容,运行程序,出现提示,输入文本文档的名称,即可对文本文档中的内容进行分析,并把分析结果输出显示在屏幕上。
编译原理课程设计报告-词法分析器
一.课程设计题目:词法分析器的实现二.课程设计成员三.课程设计内容和要求设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。
词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。
单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。
词法分析是编译过程中的一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
要求:通过词法分析器能够实现以下五种类型如单词等的识别。
(1)关键字"begin","end","if","then","else","while","write","r ead"等,"do", "call","const","char","until","procedure","repeat"等(2)运算符:"+","-","*","/","="等(3)界符:"{","}","[","]",";",",",".","(",")",":"等(4)标识符(5)常量四.操作要求首先建立一个或多个文档,此处新建了两个文档,例:07196133.txt文本文档和zhaoxiaodong.txt文本文档,以供选择,各文本文档中都输入有不同的内容,运行程序,出现提示,输入文本文档的名称,即可对文本文档中的内容进行分析,并把分析结果输出显示在屏幕上。
《C-语言的词法分析器(基于Lex)》课程设计报告
《C-语⾔的词法分析器(基于Lex)》课程设计报告《编译原理与实践》课程报告课题名称: C-语⾔的词法分析器实现(基于Lex)课题负责⼈名(学号):李恒(0643111198)同组成员名单(⾓⾊):⽆指导教师:于中华评阅成绩:评阅意见:提交报告时间:2007 年12 ⽉31⽇1. ⽬的与意义词法分析是编译原理中⼀个重要的部分。
它可将源程序读作字符⽂件并将其分为若⼲个记号,每⼀个记号都是表⽰源程序中信息单元的字符序列。
词法分析器是翻译步骤的第⼀步,它对于编译器接下来要进⾏的⼯作起着开头的作⽤,因此要想实现对C-语⾔的编译器,词法分析器必不可少。
2. 基于Parser Generator的词法分析器构造⽅法利⽤Parser Generator构造词法分析器规则,⽣成对应的c语⾔及其头⽂件。
然后进⾏编译。
3. C-语⾔词法分析的设计重要数据类型:关键字枚举:typedef enum{ENDFILE, ERROR,/* reserved words */ELSE, IF, INT, RETURN, VOID, WHILE,/* multicharacter tokens */ID, NUM,/* special symbols */PLUS, MINUS, TIMES, OVER, LT, LE, GT, GE, EQU, NEQU,ASSIGN, SEMI, COMMA, LPAREN, RPAREN, LBRKT, RBRKT, LBRC, RBRC, LCOM, RCOM}TokenType;关键字声明:digit [0-9]number {digit}+letter [a-zA-Z]identifier {letter}+newline \nwhitespace [ \t]+c-语⾔的词法规则:"else" {return ELSE;} "if" {return IF;}"int" {return INT;} "return" {return RETURN;} "void" {return VOID;} "while" {return WHILE;} "+" {return PLUS;} "-" {return MINUS;} "*" {return TIMES;} "/" {return OVER;} "<" {return LT;}"<=" {return LE;} ">" {return GT;}">=" {return GE;}"==" {return EQU;}"!=" {return NEQU;} "=" {return ASSIGN;} ";" {return SEMI;} "," {return COMMA;} "(" {return LPAREN;} ")" {return RPAREN;} "[" {return LBRKT;} "]" {return RBRKT;} "{" {return LBRC;} "}" {return RBRC;} {number} {return NUM;} {identifier} {return ID;} {newline} {lineNo++} {whitespace} {/* skip */} "/*" { char c;do{ c = input();if (c == EOF ) break;if (c == '\n' ) lineNo++;} while ( c != '/*');}{return ERROR;}重要处理程序设计:⽂件util.c执⾏输出结果的打印:void printToken(TokenType token, const char* tokenString) { switch (token){case ELSE:case IF:case INT:case RETURN:case VOID:case WHILE:fprintf(listing, "reserved word: %s\n", tokenString);break;case PLUS:fprintf(listing, "+\n");break;case MINUS:fprintf(listing, "-\n");break;case TIMES:fprintf(listing, "*\n");break;case OVER:fprintf(listing, "/\n");break;case LT:fprintf(listing, "<\n");break;case LE:fprintf(listing, "<=\n");break;fprintf(listing, ">\n"); break;case GE:fprintf(listing, ">=\n"); break;case EQU:fprintf(listing, "==\n"); break;case NEQU:fprintf(listing, "!=\n"); break;case ASSIGN: fprintf(listing, "=\n"); break;case SEMI:fprintf(listing, ";\n"); break;case COMMA: fprintf(listing, ",\n"); break;case LPAREN: fprintf(listing, "(\n"); break;case RPAREN: fprintf(listing, ")\n"); break;case LBRKT: fprintf(listing, "[\n"); break;case RBRKT: fprintf(listing, "]\n"); break;case LBRC:fprintf(listing, "{\n");case RBRC:fprintf(listing, "}\n");break;case LCOM:fprintf(listing, "/*\n");break;case RCOM:fprintf(listing, "*/\n");break;case ENDFILE:fprintf(listing,"EOF\n");break;case NUM:fprintf(listing, "NUM,val=%s\n",tokenString); break;case ID:fprintf(listing, "ID, name=%s\n",tokenString); break;case ERROR:fprintf(listing, "ERROR: %s\n",tokenString); break;default:break;}}函数getToken获取下⼀个token:TokenType getToken(void){ static int firstTime = TRUE; TokenType currentToken;if (firstTime){ firstTime = FALSE;lineNo++;yyin = source;yyout = listing;}currentToken = yylex();strncpy(tokenString,yytext,MAXTOKENLEN);if (TraceScan) {fprintf(listing, "\t%d: ", lineNo);printToken(currentToken,tokenString);}return currentToken;}4. 运⾏结果及分析输⼊⽂件如果所⽰:输出结果如图:对于输⼊的每⼀⾏进⾏词法分析,表⽰出保留字,标识符,以及终结符。
西南交大编译原理课程设计(词法分析器和语法分析器)
编译原理课程设计报告院系专业年级学号姓名课程设计一:手工设计C语言的词法分析器一、设计内容手工设计c语言的词法分析器,结合状态转换图的原理完成对c语言源程序的基本单词的分析及提取,并设计相应的数据结构保存提取出来的单词。
以及对c语言中的保留字的处理策略,实现一个完整的C语言的词法分析器的编写。
二、设计目的通过本实验的设计更具体的理解词法分析器的工作机制。
同时更理解C语言的结构体系。
从而更深刻的透析编译原理过程。
三、设计平台1、硬件环境(1)Intel(R) Core(TM) i3-2310M CPU @2.10GHz 2.10GHz(2)内存4G2、软件环境(1)Window8 Professor(2)Visual C++6.0开发软件3、开发语言:C语言。
四、需求分析:词法分析程序又称词法分析器或词法扫描器。
可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词,这里,作为子程序词法分析器的结构:源程序输入缓冲区预处理子程序词法分析子程序调用数据状态转换图的程序实现为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符2) strToken 存放构成单词符号的字符串3) Buffer 字符缓冲区4)struct keyType 存放保留字的符号和种别五、概要设计保留字表的设计结构:基本功能状态转换:六、详细设计1.GETCHAR 读一个字符到 ch 中2.GETBC 读一个非空白字符到ch 中3.CONCAT 把CHAR 中字符连接到strToken 之后4.LETTER 判断CHAR 中字符是否为字母5.DIGIT 判断ch 中字符是否为数字6.RESERVE 用strToken中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字7.RETRACT 把CHAR 中字符回送到缓冲区源程序:#include "stdio.h"#include "stdlib.h"#include "conio.h"#include "string.h"#define N 47//保留字个数char ch='\0';//存放最新读进的源程序字符char strToken[20]="\0";//存放构成单词符号的字符串char buffer[257]="\0";//字符缓冲区/*------------保留字结构-------------*/struct keyType{char keyname[256];int value;}Key[N]={{"$ID",0},{"$INT",1},{"auto",2},{"break",3},{"case",4},{"char",5},{"const",6},{"continue",7},{"default",8},{"do",9},{"double",10},{"else",11},{"enum",12},{"extern",13},{"float",14},{"for",15},{"goto",16},{"if",17},{"int",18},{"long",19},{"register",20},{"return",21},{"short",22},{"signed",23},{"sizeof",24},{"static",25},{"struct",26},{"switch",27},{"typedef",28},{"union",29},{"unsigned",30},{"void",31},{"volatile",32},{"while",33},{"=",34},{"+",35},{"-",36},{"*",37},{"/",38},{"%",39},{",",40},{";",41},{"(",42},{")",43},{"?",44},{"clear",45},{"#",46}};/*-------------子过程-------------*/void GetChar()//读一个字符到ch中{int i;if(strlen(buffer)>0){ch=buffer[0];for(i=0;i<256;i++)buffer[i]=buffer[i+1];}elsech='\0';}void GetBC()//读一个非空白字符到ch中{int i;while(strlen(buffer)){i=0;ch=buffer[i];for(;i<256;i++) buffer[i]=buffer[i+1];if(ch!=' '&&ch!='\n'&&ch!='\0')break;}}void ConCat()//把ch连接到strToken之后{char temp[2];temp[0]=ch;temp[1]='\0';strcat(strToken,temp);}bool Letter()//判断ch是否为字母{if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')return true;elsereturn false;}bool Digit()//判断ch是否为数字{if(ch>='0'&&ch<='9')return true;elsereturn false;}int Reserve()//用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字{int i;for(i=0;i<N;i++)if(strcmp(strToken,Key[i].keyname)==0)return Key[i].value;return 0;}void Retract()//把ch中的字符回送到缓冲区{int i;if(ch!='\0'){buffer[256]='\0';for(i=255;i>0;i--)buffer[i]=buffer[i-1];buffer[0]=ch;}ch='\0';}/*----------词法分析器------------*/keyType ReturnWord(){strcpy(strToken,"\0");int c;keyType tempkey;GetBC();if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'){ConCat();GetChar();while(Letter()||Digit()){ConCat();GetChar();}Retract();c=Reserve();strcpy(tempkey.keyname,strToken);if(c==0)tempkey.value=0;elsetempkey.value=Key[c].value;}else if(ch>='0'&&ch<='9'){ConCat();GetChar();while(Digit()){ConCat();GetChar();}Retract();strcpy(tempkey.keyname,strToken);tempkey.value=1;}else{ConCat();strcpy(tempkey.keyname,strToken);tempkey.value=Reserve();}return tempkey;}/*-------------主函数-------------*/int main(){keyType temp;strcpy(buffer,"if(a>0) a=b+c;");printf("buffer:\n%s\n\t\t 单词\t种别号\n",buffer);while(strlen(buffer)){printf("按任意键提出一个词:");getch();temp=ReturnWord();printf("%s\t %d\n\n",temp.keyname,temp.value);}printf("the end!\n");return 0;}七、测试当输入字符“if(i>0) a=b+c”,当缓冲区接受这串字符后,通过调用词法分析子程序,可有如下的显示结果:八、结束语通过对C语言词法分析器的设计和编写,更加了解了编译程序在编译过程中的效用。
Tiny语言的词法分析器-C++版-课程设计报告
if(line[i + 1] ==NULL)
{
if(line[i] ==';')
output <<"\t"<< rowCounter <<": "<< line[i];
break;
}
}
//清空,以备下一行读取
line ="";
str ="";
temp = 0;
token ="";
output << endl;
rowCounter++;
}
stringTrim(string&str)//函数用于去除每行前后空格
{
ints =str.find_first_not_of(" \t");
inte =str.find_last_not_of(" \t");
str=str.substr(s, e - s + 1);
str+="\0";
6: NUM, val= 0
6: <
6: ID, name= x
6: Reversed Word: then
6: { don't compute if x <= 0 }
7: fact := 1;
7: ID, name= fact
7: :=
7: NUM, val= 1
7: ;
8: repeat
8: Reversed Word: repeat
12: { output factorial of x }
词法分析器设计
1、实验目的1、为初等函数运算语言构造语法分析器。
2、掌握生成词法分析器的方法,加深对词法分析原理的理解。
3、掌握设计、编制并调试词法分析程序的思想和方法。
2、实验内容2.1词法模式设计/正则式1、初等函数运算语言的常量为实数类型,其定义方式为实数的最一般书写方式,如:123.321。
具体要求:不支持整数部分大于0时首数字为0;不支持小数点后结尾为0;不支持科学记数法;不支持仅为整数时有小数点。
^[1-9][0-9]*(.[0-9]*[1-9]+)?$2、初等函数运算语言的变量采用与C语言的标识符定义一样的方式:首字符为字母或下划线;其他的为字母、数字及下划线的混合串;区分大小写;变量长度不超过32个字符。
^[a-zA-Z_][A-Za-z0-9]{0,31}$3、初等函数运算语言需要处理的函数仅为表一中所列举的内容。
4、初等函数运算语言支持四则运算,其计算的符号与C语言相同,为:+-*/。
^[+-*/]$5、初等函数运算语言的合法的分隔符包括:空格、制表符、、分行符圆括号(左、右)、分号。
其中空格、制表符、分行符可以出现在任何两个不同的单词中间;圆括号(左、右)用于表达式中,用于改变运算的优先级,以及标识函数的参数;分号用于标识一个语句的结束。
^[\f\t\n();]$6、初等函数运算语言支持的常量还包括:PI,E。
^PI|E$2.2DFA2.3状态转换表2.4记号表9、实验程序清单function.cppmains.cppname.hwordID.txt10、调试过程和运行结果11、"x = 0.5*PI;y = E;?1/3*(ln(y)+5*sin(x))+(7+z)^2;"12、程序的主要部分及其功能说明函数声明---------------------------------------- name.h ------------------------------------------------------ #include<iostream>#include<string>using namespace std;const int Max=1000;const string FunctionName[] = {"sin", "cos", "tg","ctg","log","lg","ln","PI", "E" };//关键字class Operate{string str; //输入的字符串string word[Max]; //输出的结果int num[Max]; //输出的类型public:int startPostion; //字符开始位置int nowPostion; //字符当前位置int length; //结果个数Operate(string s);void getWordAndNum();bool isNumber(char c);bool isChar(char c);// bool isChar(char c);int isOperaters(char c);bool isblank(char c);void addWords(string s,int n);};int isKey(string str);void work(string str);----------------------------------------- function.cpp ------------------------------------------------函数定义----------------------------------------- function.cpp ------------------------------------------------ #include<iostream>#include<iomanip>#include<string>#include"name.h"using namespace std;//Operate类定义Operate::Operate(string s){str=s;startPostion=0;nowPostion=0;length=0;}void Operate::getWordAndNum(){for(int i=0;i<=(length-1);i++)cout<<"<"<<setw(10)<<word[i]<<","<<setw(3)<<num[i]<<">\n";bool Operate::isNumber(char c){if (c >= '0' && c <= '9')return true;return false;}bool Operate::isChar(char c){if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')||c == '_') return true;return false;}int Operate::isOperaters(char c){switch (c){case'?':return 10;case';':return 11;case'(':return 12;case')':return 13;case'+':return 14;case'-':return 15;case'*':return 16;case'/':return 17;case'=':return 18;case'^':return 19;default: return 0;};}bool Operate::isblank(char c){switch (c){case' ':case'\t':case'\n':return true;}return false;}void Operate::addWords(string s,int n){word[length]=s;num[length]=n;length+=1;}//其他函数//是否是关键字,是返回序号,否返回0int isKey(string str){for(int i=0;i<9;i++)if(str==FunctionName[i])return i+1;return 0;}void work(string str){int longs=str.length();string aword;char c; //当前字符int state=0; //状态int number=0; //类型Operate op(str);while(true){//读取字符if(op.nowPostion>=longs)break;elsec=str[op.nowPostion];switch(state){case 0://初始状态if(c=='$')break;//如果是运算符//保存当前运算符,startPostion=nowPostion=+1number=op.isOperaters(c);if(number>0){op.addWords(str.substr(op.startPostion,1),number);op.nowPostion++;op.startPostion=op.nowPostion;break;}if(op.isblank(c)){op.nowPostion++;op.startPostion=op.nowPostion;break;}//如果是字符if(op.isChar(c)){state=1;op.nowPostion++;break;}if(c>='1'&&c<='9'){state=4;op.nowPostion++;break;}if(c='0'){state=2;op.nowPostion++;break;}break;case 1://识别字符串if(op.isChar(c)||op.isNumber(c)){op.nowPostion++;break;}//否则的话,完成当前标识符的识别number=20;aword=str.substr(op.startPostion,op.nowPostion-op.startPostion);if(isKey(aword)>0)number=isKey(aword);op.addWords(aword,number);op.startPostion=op.nowPostion;state=0;break;case2://识别0,若下一个字符不是小数点'.'则显示输入错误,跳过0,读取下一个字符if(c=='.'){state=3;op.nowPostion++;break;}if(op.isOperaters(c)>0){state=0;break;}op.addWords("0开头,输入错误!跳过",0);op.startPostion=op.nowPostion;state=0;break;case 3://识别0-9if(op.isNumber(c)){op.nowPostion++;break;}op.addWords(str.substr(op.startPostion,op.nowPostion-op.startPostion),21);op.startPostion=op.nowPostion;state=0;break;case 4://识别1-9if(op.isNumber(c)) //识别整数{op.nowPostion++;break;}if(c=='.') //识别小数{state=3;op.nowPostion++;break;}op.addWords(str.substr(op.startPostion,op.nowPostion-op.startPostion),21);op.startPostion=op.nowPostion;state=0;break;}}op.getWordAndNum();}------------------------------------------ mains.cpp ------------------------------------------主函数输入测试数据!------------------------------------------ mains.cpp ------------------------------------------#include<iostream>#include<string>#include"name.h"using namespace std;void main(void){//测试数据string str="x = 0.5*PI;y = E;?1/3*(ln(y)+5*sin(x))+(7+z)^2;";work(str);system("pause");}13、实验收获体会通过这次试验初步掌握生成词法分析器的方法,加深对词法分析原理的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件类课程设计报告设计题目:词法分析器学生学号:专业班级:计算机科学与技术学生姓名:学生成绩:指导教师(职称):课题工作时间:至信息工程学院软件类课程设计任务书指导教师:日期:年月日成绩评定表学生姓名:学号:专业/班级:目录目录 (I)第一章概述 (2)1.1词法分析器概述 (2)1.2课程设计内容 (2)第二章词法分析器课程设计 (3)2.1课程设计内容 (3)2.2课程设计思想 (3)2.3设计目的及说明 (3)2.3.1程序设计范畴 (3)2.3.2程序设计说明 (3)第三章程序详细设计 (4)3.1主要算法的设计 (4)3.2算法的实现 (4)3.2.1数据类型 (4)3.2.2函数模块功能 (4)3.3程序设计流程图 (4)3.3.1设计流程图 (5)3.3.2状态转换图 (5)第四章运行结果及分析 (6)4.1运行结果 (6)4.2结果分析 (6)4.3设计总结 (6)结束语 (8)参考文献 (8)附录源程序 (9)第一章概述1.1词法分析器概述词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。
并确定其属性(如保留字、标识符、运算符、界限符和常量等)。
再把它们转换称长度统一的标准形式——属性字(TOKEN)。
而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。
编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、)然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。
程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。
上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。
词法分析器的功能就是把输入的符号串整理成特定的词素。
1.2课程设计内容运用c++语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。
本程序是在Visual Studio环境下,使用c++语言作为开发工具。
基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。
逐步细化其功能,做到相应模块的具体化。
画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。
第二章词法分析器课程设计2.1课程设计内容用c++语言设计词法分析器,由指定文件读入预分析的源程序,从左至右描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。
2.2课程设计思想该词法分析器首先扫描文件,识别出一系列具有独立意义的基本语法单位——单词,包括关键字、保留字、标识符、各种常数、各种运算符及界符等。
由于我们规定的c++语言程序语句中涉及单词较少,所以在词法分析阶段忽略了单词输入错误的检查,并在扫描后输出单词符号。
规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值)。
c++语言中定义了属于这五种类型的大量的单词,但是由于预编译器只识别我们自定义的注释,因此预编译器处理的单词集只是c++语言中定义的单词集的一个真子集。
2.3设计目的及说明2.3.1程序设计范畴完成下述文法所描绘的单词符号的词法分析程序:<标识符>--><字母>|<标识符><字母>|<标识符><数字><无符号整数>--><数字>|<无符号整数><数字><分界符>-->+|-|*|/|;|(|)|{|}|<|<=|==|!=|>=|>|=|<空格><字母>-->a|…|z|A|…|Z<数字>-->0|…|92.3.2程序设计说明说明:1.假如该语言对字母的大小写不敏感,则由指定文件读入预分析的源程序,分析结果再写入指定文件;2.语言关键字:“if”,“else”,“then”,“for”,“while”,“do”;第三章程序详细设计3.1主要算法的设计<1>fopen()打开源文件,读入字符,对文件进行扫描,把读入的字符放入缓冲区中,然后对该字符进行判断。
<2>若是字母开头,则可能是关键字或者标识符,因此进入letterprocess()进行识别。
识别的过程为:将以字母开头的字母数字串放入char letter[30]中,然后进行识别。
识别的过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它是关键字,则输出其二元式;否则说明其为标识符,这时,将它与标识符表char *label[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。
并输出其二元式。
<3>若是数字开头,则可能是常量,因此进入numberprocess()进行识别。
识别的过程为:将其与常量表char num[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。
并输出其二元式。
<4>否则进入otherprocess()识别当前是其它字符。
在识别关系运算符的时候,有可能是两个字符为一个关系运算符,所以在识别的时候要判断连续的两个是否为一个关系运算符。
3.2算法的实现3.2.1数据类型(1)关键字:char*keyword[6]={"if","else","then","for","while","do"};(2)运算符和界符:char*operatornum[16]={"+","-","*","/","<","<=",">",">=","!","="," {","}",";","(",")"};//运算符和界符(3)常量表和标识符表:char*num[20]:用于存放文件中的常量;char*label[20]:用于存放文件中的标识符。
3.2.2函数模块功能(1)search():查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码(即单词种别)和记录次序码。
(2)letterprocess():识别当前是数组、保留字、标识符。
(3)numprocess():识别当前是常整数、小数、负小数。
(4)otherprocess():识别当前是其它(标点符号等)。
(5)fopen():在默认路径下打开分析程序并读入字符串。
3.3程序设计流程图3.3.1设计流程图图3-1程序设计流程图3.3.2状态转换图词法分析器使用状态转换图来识别单词符号。
状态转换图是一张有限方向图。
在状态转换图中,有一个初态,至少一个终态。
图3-2状态转换图其中0为初态,2为终态。
这个转换图识别(接受)标识符的过程是:从初态0开始,若在状态0之下输入字符是一个字母,则读进它,并转入状态1。
在状态1之下,若下一个输入字符为字母或数字,则读进它,并重新进入状态1。
一直重复这个过程直到状态1发现输入字符不再是字母或数字时(这个字符也已被读进)就进入状态2。
状态2是终态,它意味着到此已识别出一个标识符,识别过程宣告终止。
终态结上打个星号意味着多读进了一个不属于标识符部分的字符,应把它退还给输入口中。
如果在状态0时输入字符不为“字母”,则意味着识别不出标识符,或者说,这个转换图工作不成功。
第四章运行结果及分析4.1运行结果图4-1运行截图4.2结果分析通过程序运行截图可以知道程序运行结果完全是正确的。
程序设计过程大致如下:首先,根据课程设计的任务:使用c++语言编程,实现词法分析器的基本功能,来确定本次程序设计的总体目标及路线。
详细阅读课程设计的内容及要求,明确接下来的大致作业。
进一步,规划算法,描绘出初步的,总体的流程图。
然后,结合编译原理相关书籍,理解程序系统的基本原理。
结合c++语言相关书籍,具体细化程序设计的思路,粗略确定程序的模块划分,功能划分,并确定这些模块和功能应该有c++语言的哪些函数来实现。
接下来,着手程序编写。
依次完成源文件的读入,字符的判断,文件的读写,结果的输出,并在编程过程中反复完善,多多的测试,及时检测问题是否存在,若存在,立即改善。
直到程序足够强壮,功能完善,结果正确为止。
最后,选择考虑到所有可能的测试数据,总体测试词法分析器的性能。
更改输出数据的格式,使之布局合理。
在需要的地方增添注释信息,删除设计过程中的测试代码或其他冗余代码,美化程序布局,调整整体的程序代码间隔。
4.3设计总结虽然曾经学过一个学期的c++语言,但现在基本上生疏了。
所以,我又用了一周的时间来复习c++语言。
总体的算法及流程图不是困难的问题,这些问题可以在纸上很快的解决。
本以为这些解决了,课程设计的其他问题,如程序的具体编写,应该不是难事了。
当着手于实际编程时,问题接连出现。
即便如此,付出换回的收获也是可观的。
自己独立完成课程设计,熟悉程序设计中出现的所有问题以及解决方案,这无疑加深了我对设计项目的印象,增进了c++语言编程能力,熟悉了程序设计的具体流程。
为以后的工作打下了基础。
结束语本次课程设计初步培养设计者对编译器设计的思想的了解,加深对编译原理和应用程序的理解。
通过设计调试词法分析程序,实现了从程序中分出各种单词的方法,从而加深了对该知识的理解,提高了词法分析的实践能力。
程序的关键点在于对对给出一段程序中的各种单词的分离。
在每段程序中,单词种类可以分为:关键字,分界符,算术运算符,关系运算符,标识符和常数。
关键字的判断则是通过与已知数组中列出的元素进行对比,得出该单词是否为关键字;分解符,算术运算符,关系运算符的判断与接受到的字符进行比较,得出该字符是否为分解符,算术运算符或者为关系运算符。
同时在编写程序过程中也遇到了许多问题,如在vc++6.0中运行是出现了错误或是运行结果没有达到预期的效果,而出现了中断等其他的问题,在不断解决问题和发现问题的过程中,我学到了很多,我体会到实践和理论的巨大差别,并且也有所成长。