词法分析课程设计
编译原理综合性实验:词法分析的设计
对数字常数的处理如下:先查符号表 VAL 栏,若发现相同的常数则直接输出其二元式。 若表内无相同的常数,则将数字常数填入符号表内,在 TYPE 栏内填入整型或实型,然后输 出其二元式。二元式中包含该常数在符号表中的入口。
1.3 词法分析程序的详细设计
图 1-3 的数据流图属于输入-变换-输出形式的变换型数据流图,但加工 1.3—1.9 构成了典型的事务处理型数据流图。根据数据流图,可以得到词法分析 程序的总体框架,如图 1-4。
图 1-3 词法分析程序的详细数据流图 在上面的数据流图中,各个加工处理完成的功能如下: 加工 1.1(读一行并打印):收到读下一行命令后,从源程序读入一行,装入缓冲区,行计 数,并打印。在这里需要注意的是,回车换行在源程序(文本文件)中用两个字符 0D0AH 来表示,而用高级语言(C 语言)读入内存后,就用一个字符 0AH 来表示,这是在用高级
查找函数可以使用顺序查找,也可以使用折半查找。 例如:使用顺序查找方法查找给定单词 key 是否是关键字的函数原型和算法描述如下:
int iskeyword (char * str)/*设 keyword 为所有关键字列表*/ /*该函数返回 0 表示 str 不是关键字,不为 0 表示 str 是关键字*/
词不能跨行书写; (4) 关键字都是保留字。
1.2 词法分析程序的总体设计
图 1-2 词法分析程序的顶层数据流图 图 1-2 是词法分析程序的顶层数据流图,即是词法分析程序的输入输出界面图,由此可 以看出词法分析程序的功能就是从源程序中读入一个个字符,依据一定的构词规则,识别出 各类有用的单词。其中源程序清单和错误信息从屏幕、打印机或文件输出,其余文件均以顺 序文件的形式输出到外存储器上,以供下一阶段使用。由此可以得到更详细的数据流图,如 图 1-3。
词法分析程序课程设计
1.C-词法1. 下面是语言的关键字:else if int return void while所有的关键字都是保留字,并且必须是小写。
2. 下面是专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */3. 其他标记是I D和N U M,通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9小写和大写字母是有区别的。
4. 空格由空白、换行符和制表符组成。
空格通常被忽略,除了它必须分开ID、NUM关键字。
5. 注释用通常的C语言符号/ * . . . * /围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套。
2.设计一个C-Minus (简称C-)词法分析器具体要求如下:1.画出C-语言词法的状态转换图,提交状态转换图.doc(25分)2.词法分析程序的编程实现(75分)用java或C++手工编程实现C-词法分析器1)提交可执行C-词法分析程序的源程序或者是通过parser-generator(YACC and Lex for Windows)工具自动生成java或C++或C语言实现的词法分析程序1)提交lex源文件2)提交lex工具自动生成的可执行词法分析程序无论上述那种方法提交的词法分析程序,都要求该词法分析程序能够读取存储在input.txt中的c-源程序,并将其词法分析的结果即token序列输出到out.txt中,以便于检查你的词法分析程序的正确性。
提交你对自己生成的c-词法分析程序的测试方案.doc(25分) 3.参考资料1.tiny语言的词法分析器源码2.parser-generator(YACC and Lex for Windows)3.Lex - A Lexical Analyzer Generator-documentation.htm。
编译原理课程设计-词法分析器的设计与实现
课程设计(论文)任务书软件学院学院软件测试专业 2 班一、课程设计(论文)题目词法分析器的设计与实现二、课程设计(论文)工作自2014 年 6 月16 日起至2014 年6 月 21 日止。
三、课程设计(论文) 地点: 软件学院实训中心四、课程设计(论文)内容要求:1.本课程设计的目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时,强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识, 熟悉使用开发工具VC /JA V A/C#/.NET 。
2.课程设计的任务及要求1)课程设计任务:词法分析器的设计词法分析器的实现扫描器的设计与实现2)创新要求:在到达基本要求后,可进行创新要求。
3)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路--工作原理、功能规划(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。
(6)报告按规定排版打印,要求装订平整,否则要求返工;(7)课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正文---附录(代码及相关图片)(8)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:(1)学习态度:20分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:20分。
5)参考文献:(1)张素琴,吕映芝. 编译原理[M]., 清华大学出版社(2)蒋立源、康慕宁等,编译原理(第2版)[M],西安:西北工业大学出版社6)课程设计进度安排1.准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料2.程序模块设计分析阶段(4学时):程序总体设计、详细设计3.代码编写调试阶段(8学时):程序模块代码编写、调试、测试4.撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名:2014 年 6 月21 日课程设计(论文)评审意见(1)学习态度(20分):优()、良()、中()、一般()、差();(2)系统设计(20分):优()、良()、中()、一般()、差();(3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)论文撰写(20分):优()、良()、中()、一般()、差();评阅人:职称:副教授2014 年 6 月26 日中文摘要词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。
编译原理课程设计_词法分析器设计
编译方法课程设计词法分析器设计学院:计算机与信息工程学院专业:软件工程学号:姓名:指导教师:职称:设计报告日期:二О一二年十二月目录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"。
编译原理词法分析器语法分析课程设计范本
《编译原理词法分析器语法分析课程设计-《编译原理》课程设计院系信息科学与技术学院专业软件工程年级级学号 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) 运算符:如+、-、*、<、>、=等。
词法分析java编译原理课程设计
词法分析java编译原理课程设计一、教学目标本课程旨在让学生掌握词法分析在Java编译原理中的应用,理解并能够运用Java的基本词法规则,包括关键字、标识符、常量、运算符等。
通过本课程的学习,学生应能熟练使用Java编译器进行程序的编译和调试,理解编译过程中词法分析的原理和实现。
具体来说,知识目标包括:1.掌握Java语言的基本词法规则。
2.理解词法分析在编译过程中的作用和重要性。
3.熟悉Java编译器的使用方法和技巧。
技能目标包括:1.能够使用Java编译器进行程序的编译和调试。
2.能够分析并解决Java程序中的词法错误。
3.能够理解和编写简单的词法分析器。
情感态度价值观目标包括:1.培养学生对编译原理的兴趣和好奇心。
2.培养学生解决问题的能力和团队合作的精神。
3.培养学生对编程语言和计算机科学的热爱。
二、教学内容本课程的教学内容主要包括Java的基本词法规则、词法分析的原理和实现、以及Java编译器的使用方法。
具体的教学大纲如下:1.第一章:Java语言概述–Java语言的历史和发展–Java语言的特点和优势–Java语言的应用领域2.第二章:Java的基本词法规则–关键字和保留字–标识符的命名规则–常量的分类和声明–运算符的分类和用法3.第三章:词法分析原理–词法分析在编译过程中的作用–词法分析器的实现方法–词法分析器的测试和优化4.第四章:Java编译器使用–Java编译器的安装和配置–编译和运行Java程序的基本步骤–分析并解决编译过程中的词法错误5.第五章:实战演练–编写简单的Java程序–使用Java编译器进行编译和调试–分析并解决程序中的词法错误三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式。
包括:1.讲授法:通过讲解和演示,让学生掌握Java的基本词法规则和词法分析的原理。
2.讨论法:学生进行小组讨论,培养团队合作的精神,并促进学生对问题的深入思考。
编译原理课程设计报告词法分析器
一.课程设计题目:词法分析器的实现二.课程设计成员三.课程设计内容和要求设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。
词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。
单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。
词法分析是编译过程中的一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
要求:通过词法分析器能够实现以下五种类型如单词等的识别。
(1)关键字"begin","end","if","then","else","while","write","read"等,"do", "call","const","char","until","procedure","repeat"等(2)运算符:"+","-","*","/","="等(3)界符:"{","}","[","]",";",",",".","(",")",":"等(4)标识符(5)常量四.操作要求首先建立一个或多个文档,此处新建了两个文档,例:07196133.txt文本文档和zhaoxiaodong.txt文本文档,以供选择,各文本文档中都输入有不同的内容,运行程序,出现提示,输入文本文档的名称,即可对文本文档中的内容进行分析,并把分析结果输出显示在屏幕上。
词法分析程序设计
词法分析程序设计词法分析是编译器设计中的一个关键步骤,它负责将源代码文本转换成一系列的词法单元(tokens),这些词法单元是语法分析阶段的输入。
词法分析程序的设计通常包括以下几个主要部分:定义词法规则、构建词法分析器、生成词法单元以及错误处理。
1. 定义词法规则词法规则是词法分析器识别源代码中各种词法单元的基础。
这些规则通常包括关键字、标识符、常量(如数字和字符串)、运算符和分隔符等。
例如,对于C语言,词法规则可能包括识别`int`、`float`等关键字,以及识别变量名、数字和字符串字面量等。
2. 构建词法分析器构建词法分析器的过程通常涉及到选择一个合适的算法或工具。
常见的方法有手工编写词法分析器、使用词法分析生成器(如Lex或Flex)来自动生成词法分析器。
手工编写词法分析器手工编写词法分析器需要程序员根据词法规则,使用编程语言(如C、Java等)实现一个扫描器(scanner)。
扫描器的主要任务是逐字符地读取源代码,并根据词法规则识别出词法单元。
使用词法分析生成器使用词法分析生成器可以大大简化词法分析器的开发过程。
开发者只需定义词法规则,并使用生成器工具来生成扫描器代码。
例如,Flex是一个基于正则表达式的词法分析生成器,它可以从定义的规则中自动生成C或C++代码。
3. 生成词法单元词法单元是词法分析器输出的基本单位。
每个词法单元通常包含两个部分:类型和值。
类型指明词法单元的种类(如关键字、标识符等),而值则是词法单元的具体内容(如标识符的名称、数字的值等)。
在生成词法单元时,词法分析器需要根据识别出的词法规则,将源代码中的字符序列转换成相应的词法单元。
例如,当词法分析器读取到`123`时,它应该识别这是一个整数常量,并生成一个类型为`INTEGER`,值为`123`的词法单元。
4. 错误处理在词法分析过程中,可能会遇到不符合词法规则的字符序列,这时就需要进行错误处理。
错误处理通常包括以下几个方面:- 识别错误:当遇到无法识别的字符或字符序列时,词法分析器应该能够识别出这是一个错误。
分析报告- 词法分析.doc
一、设计概述(设计目的、环境、要求)1、设计目的本次课程设计的目的是通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数据结构,算法及方法,为今后在大型软件系统实践中设计性能优良的软件系统打下基础。
2、设计环境实验环境为Windows操作系统下,词法分析使用的主要工具是fleG。
3、设计要求使用FleG工具,实现Decaf语言词法分析工作,对Decaf语言编写的源程序从左至右逐个字符进行扫描,产生一个单词序列。
二、实验步骤(包括基本程序的分析步骤、测试的例子)1、编写程序的分析步骤(1)根据pp2所提供的scanner.l文件修改我们所需的词法分析程序scanner.l。
/GGscanner.lGG FleG输入文件,生成scannerG/%{#include<stdlib.h>#include<stdio.h>#include<process.h>#include<malloc.h>#include<string.h>#include"scanner.h"#include"hashtable.h"#include"utility.h"#include<io.h>/GGGlobalvariable:yylvalG-----------------------G全局变量,我们可以从yylval中获得每个toAen的属性。
G以后这个变量由bison/yacc自动生成,在这个实验里面,我们手动定义。
G/YYSTYPEyylval;/GGGlobalvariable:yyllocG-----------------------G全局变量,我们可以从yylloc中获得每个toAen的位置属性。
词法分析课程设计
词法分析课程设计一、课程目标知识目标:1. 学生能够理解并掌握词法分析的基本概念和原则;2. 学生能够识别并分类常见的词汇成分,如名词、动词、形容词、副词等;3. 学生能够运用词法知识分析句子结构,识别句子中的主干和修饰成分;4. 学生了解词汇在不同语境中的含义变化,提高词汇理解和运用能力。
技能目标:1. 学生能够运用词法分析技巧,准确理解文本中的词汇意义;2. 学生能够运用所学的词法知识进行句子分析和解读;3. 学生通过词法练习,提高语言表达和写作能力;4. 学生能够运用词法知识解决实际问题,提高解决问题的能力。
情感态度价值观目标:1. 学生培养对语言学习的兴趣和热情,增强学习动力;2. 学生树立正确的语言观念,尊重和欣赏各种语言表达方式;3. 学生通过词法学习,培养严谨、细致的学习态度,提高自我要求;4. 学生在小组合作学习中,培养团队协作精神和沟通能力。
本课程针对的学生特点为具有一定语言基础和认知能力的年级学生。
课程性质为理论联系实际,注重培养学生的实际运用能力。
在教学过程中,要求教师结合课本内容,设计丰富多样的教学活动,引导学生积极参与,确保课程目标的实现。
通过本课程的学习,学生将能够具备扎实的词法知识,提高语言表达和写作能力,同时培养良好的情感态度价值观。
后续教学设计和评估将围绕具体学习成果展开,以确保课程目标的达成。
二、教学内容本课程教学内容紧密结合课程目标,选取以下部分进行详细讲解:1. 词法基础知识:介绍词法分析的基本概念、原则和作用,引导学生了解词汇的构成和特点。
教学内容:(1)词汇的概念和分类;(2)词素的构成和功能;(3)词汇的语义关系。
2. 词汇成分分析:详细讲解名词、动词、形容词、副词等常见词汇成分的识别和分类。
教学内容:(1)名词的识别和分类;(2)动词的识别和分类;(3)形容词的识别和分类;(4)副词的识别和分类。
3. 句子结构分析:通过实例分析,使学生掌握句子中的主干和修饰成分。
编译原理课程设计词法分析
编译原理课程设计词法分析程序姓名:*******班级:********************学号:************日期:2011-12-30词法分析程序设计课程设计目的:运用所学习的知识和语言,设计编制和调试一个具体的词法分析程序,通过运行程序从而加深对词法分析的理解。
课程设计要求:通过对PL/0词法分析程序(GETSYS)的分析,编制一个具有以下功能的词法分析程序:a.输入待进行词法分析的源程序,输出为单词串,即由(单词,类别)所组成的二元组序列;b.有一定的错误检查能力,例如能发现2a这类不能作为单词的字符串。
课程设计思路:词法分析所能分辨的符号有,常数,字符,关键字,界符,运算符等类型,设计的程序要求可以分辨各种不同的类型,可以运用C语言文件操作的功能,导入一个已经存在的文本文件,对文本文件的内容进行此法分析,并且把分析结果导入到另外一个文件当中。
主要变量说明:运用C语言的宏定义功能,1~11这十二个数字分别用来表示不同的关键字,12代表标示符类型ID,13代表常数类型INT,14代表界符类型JF,15代表运算符类型YSF。
定义一个长度为30的数组,用来存放标示符和常量。
设置指向固定文件的指针write和read,用来进行对文件的操作。
算法描述:A.设置一个字符串匹配函数looksame,对于以字母开头的字符串,对其进行与关键字的匹配,如果对于匹配关键字的字符串,则将字符串识别为关键字。
B.设置一个字符类型和字符串输出函数out,把从文件中读出的字符串,以及它预定义的类型输出,同时将词法分析的一段结果输入到指定文件中,同时输出到命令窗口。
C.设置一个报错函数error,对于文件中未能够识别的字符进行报错处理,输入报错信息“书写格式错误,未被识别”。
D.设置功能函数function,进行具体的词法分析功能,不断对文件中的字符进行读出,按照字符串类型进判断分类,调用字符串匹配函数用来识别关键字,调用out函数,用来识别普通的常量以及标示符,同时对于界符和运算符进行识别,同时输出到指定的文件中。
编译原理词法分析器__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++编写实现其输入输出功能。
课程设计编译方法词法分析器
《编译原理》课程设计指导书一、课程设计的目的本次课程设计的时间为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.包括各种可能出现的文法描述方法。
编译原理词法分析课程设计
DONGFANG COLLEGE,FUJIAN AGRICULTURE AND FORESTRY UNIVERSITY课程名称:编译原理词法分析系别:计算机科学系年级专业: 2013级计算机科学与技术学号: 1350303059姓名:张清鉴任课教师:朱均燕成绩:2015 年12 月31 日目录前言 (1)一、课程设计的目的 (1)二、课程设计的要求 (1)1.待分析的简单语言的词法 (1)2.各种单词符号对应的种别码 (2)3. 此法分析程序功能 (3)三、课程设计报告内容 (3)3.1课程设计的环境 (3)3.2系统技术分析: (3)3.3 系统流程图及各模块 (4)3.4源程序代码清单 (4)3.5程序调试情况 (9)四、总结 (10)参考文献 (11)前言词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。
进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
词法分析器一般以函数的形式存在,供语法分析器调用。
词法分析阶段是编译过程的第一个阶段,是编译的基础。
这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。
词法分析程序实现这个任务。
词法分析程序可以使用Lex等工具自动生成。
词法分析是编译程序的第一个阶段且是必要阶段;词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程序的常用途径:自动生成,手工生成.词法分析一、课程设计的目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、课程设计的要求1.待分析的简单语言的词法(1)关键字:begin if then while do end所有的关键字都是小写。
(2)运算符和界符::= + - * / <<=<>>>==:()#(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:(4)空格由空白\制表符\和换行符组成。
词法分析课程设计
《词法分析》设计说明书学生姓名学 号 50111101225011110133 5011110128所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机15-1班信息工程学院《编译原理及实践》结课大作业摘要编译,简单的说,就是把源程序转换为可执行程序。
从hellow worl说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。
在这个过程中,编译器做了很多重要的工作。
对于编译的内部实现,也就是编译的原理。
这篇论文主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。
编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。
可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。
有了C做中间层,A和B才能正常交流。
C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。
编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、),然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。
程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。
上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。
这篇论文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。
关键词:单片机;词法分析目录1.词法分析 (1)1.1定义 (1)1.2待分析的简单语言的词法 (1)1.3各种单词符号对应的种别码 (1)2.词法分析器设计 (2)2.1输入、预处理 (2)2.2超前搜索 (2)2.3状态转换图 (2)2.4正规表达式与正规集 (3)3.分析器的简单实现 (4)3.1分析 (4)3.2词法分析程序的功能 (5)3.3参考代码 (5)3.4程序测试 (9)总结 (10)参考文献 (10)1.词法分析1.1定义词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。
词法分析器课程设计要求
※<实验一词法分析>一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。
本实验中,采用的是一类符号一种别码的方式。
2、单词的BNF表示<标识符- <字母<字母数字串<字母数字串-<字母<字母数字串|<数字<字母数字串|<下划线<字母数字串|ε<无符号整数- <数字<数字串<数字串- <数字<数字串 |ε<加法运算符- +<减法运算符- -<大于关系运算符-<大于等于关系运算符-=3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。
如当前待分析字符串为“a+”,当前字符为’’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。
于是分析器读入下一个字符’+’,这时可知应将’’解释为大于运算符。
但此时,超前读了一个字符’+’,所以要回退一个字符,词法分析器才能正常运行。
在分析标识符,无符号整数等时也有类似情况。
4、模块结构三、实验过程和指导:(一)准备:1.阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。
2.初步编制好程序。
3.准备好多组测试数据。
(二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《词法分析》设计说明书学生姓名学 号 50111101225011110133 5011110128所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机15-1班信息工程学院《编译原理及实践》结课大作业摘要编译,简单的说,就是把源程序转换为可执行程序。
从hellow worl说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。
在这个过程中,编译器做了很多重要的工作。
对于编译的内部实现,也就是编译的原理。
这篇论文主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。
编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。
可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。
有了C做中间层,A和B才能正常交流。
C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。
编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、),然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。
程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。
上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。
这篇论文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。
关键词:单片机;词法分析目录1.词法分析 (1)1.1定义 (1)1.2待分析的简单语言的词法 (1)1.3各种单词符号对应的种别码 (1)2.词法分析器设计 (2)2.1输入、预处理 (2)2.2超前搜索 (2)2.3状态转换图 (2)2.4正规表达式与正规集 (3)3.分析器的简单实现 (4)3.1分析 (4)3.2词法分析程序的功能 (5)3.3参考代码 (5)3.4程序测试 (9)总结 (10)参考文献 (10)1.词法分析1.1定义词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。
单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等。
1.2待分析的简单语言的词法(1)关键字:begin if then while do end所有关键字都是小写。
(2)运算符和界符::= + –* / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)*NUM=digit digit *(4)空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
1.3各种单词符号对应的种别码2.词法分析器设计2.1输入、预处理词法分析器工作的第一步是输入源程序文本。
在许多情况下,为了更好地对单词符号识别,把输入串预处理一下。
预处理主要滤掉空格,跳过注释、换行符等。
2.2超前搜索词法分析过程中,有时为了确定词性,需超前扫描若干个字符。
对于FORTRAN 语言,关键字不作为保留字,可作为标识符使用,空格符号没有任何意义。
为了确定词性,需超前扫描若干个字符。
在FORTRAN中1 DO99K=1,102 IF(5.EQ.M) I=103 DO99K=1.104 IF(5)=55这四个语句都是正确的语句。
语句1和2 分别是DO和IF语句,语句3和4是赋值语句。
为了正确区别1和3,2和4语句,需超前扫描若干个字符。
1 DO99K=1,102 IF(5.EQ.M) I=103 DO99K=1.104 IF(5)=55语句1和3的区别在于符号之后的第一个界符:一个为逗号,另一个为句末符。
语句2和4的主要区别在于右括号后的第一个字符:一个为字母,另一个为等号。
为了识别1、2中的关键字,必须超前扫描多个字符。
超前到能够肯定词性的地方为止。
为了区别1和3,必须超前扫描到等号后的第一个界符处。
对于语句2、4来说,必须超前扫描到与IF后的左括号相对应的那个右括号之后的第一个字符为止。
2.3状态转换图词法分析器使用状态转换图来识别单词符号。
状态转换图是一张有限方向图。
在状态转换图中,有一个初态,至少一个终态。
其中0为初态,2为终态。
这个转换图识别(接受)标识符的过程是:从初态0开始,若在状态0之下输入字符是一个字母,则读进它,并转入状态1。
在状态1之下,若下一个输入字符为字母或数字,则读进它,并重新进入状态1。
一直重复这个过程直到状态1发现输入字符不再是字母或数字时(这个字符也已被读进)就进入状态2。
状态2是终态,它意味着到此已识别出一个标识符,识别过程宣告终止。
终态结上打个星号意味着多读进了一个不属于标识符部分的字符,应把它退还给输入口中。
如果在状态0时输入字符不为“字母”,则意味着识别不出标识符,或者说,这个转换图工作不成功。
2.4正规表达式与正规集正规表达式是说明单词的一种重要的表示法(记号),是定义正规集的工具。
在词法分析中,正规表达式用来描述标示符可能具有的形式。
定义(正规式和它所表示的正规集):设字母表为S,1. e和Ø都是S上的正规式,它们所表示的正规集分别为{e}和{ };2. 任何aÎ S,a是S上的一个正规式,它所表示的正规集为{a};3. 假定U和V都是S上的正规式,它们所表示的正规集分别为L(U)和L(V),那么,(U), U|V, U·V, U*也都是正规式,它们所表示的正规集分别为L(U), L(U)ÈL(V), L(U)L(V)和(L(U))*;4. 仅由有限次使用上述三步骤而定义的表达式才是S上的正规式,仅由这些正规式所表示的字集才是S上的正规集。
正规式的运算符的“½”读为“或” ,“· ”读为“连接”;“*”读为“闭包”(即,任意有限次的自重复连接)。
在不致混淆时,括号可省去,但规定算符的优先顺序为“(”、“)”、“*”、“· ”、“½” 。
连接符“· ”一般可省略不写。
“*”、“· ”和“½” 都是左结合的。
例令S={a,b},S上的正规式和相应的正规集的例子有:正规式正规集a {a}a½b {a,b}ab {ab}(a½b)(a {aa,ab,ba,bb}a * {e ,a,a, ……任意个a的串}ba* {b, ba, baa, baaa, …}(a½b)* {e ,a,b,aa,ab ……所有由a和b组成的串}(a½b)*(aa½bb)(a½b)* {S*上所有含有两个相继的a或两个相继的b组成的串}定理:若两个正规式U和V所表示的正规集相同,则说U和V等价,写作U=V。
证明b(ab)*=( ba)*b证明:因为L(b(ab)*)={b}{e, ab, abab, ababab, …}={b, bab, babab, bababab, …}L((ba)*b) ={e, ba, baba, bababa, …}{b}={b, bab, babab, bababab, …}= L(b(ab)*)所以, b(ab)*=( ba)*b设U,V,W为正规式,正规式服从的代数规律有:(1) U½V=V½U (交换律)(2) U½(V½W)=(U½V)½W (结合律)(3) U(VW)=(UV)W (结合律)(4) U(V½W)=UV½UW (V½W)U=VU½WU (分配律)(5) eU=U e=U3.分析器的简单实现虽然说是语法分析器,但实现的功能很简单,只是对输入的程序把注释去掉,其中用到了上面关于状态转换图部分的知识。
3.1分析一般的程序设计语言,注释部分的形式为;/* 注释部分、、、、*/我们的程序总是顺序的一个一个字符读取输入文件的。
我们的目的是把注释部分去掉,那么对于输入的字符流,我们只要识别出“/*”就知道后面的部分是注释部分,直到识别输入流中出现"*/"为止。
对字符流的处理是一个一个进行的,每读入一个字符,就判断,如果字符是“/”,就说明后面的部分可能是注释,再看下一个输入字符,如果是“*”, 就是上面所说的情况:“ /*”那么后面的部分就是注释部分,然后再用相同的方法找出"*/"就可以了。
这个识别的过程就可以用状态转换图来清晰的表示:对于读入的每个符号都要进行判断,如果是“/”说明后面的部分有可能是注释,进入状态1。
如果后面的输入是“*”那么就可以确定以后的内容为注释内容,如果后面的输入不是"*",说明后面的内容不是注释,前面出现的"/"可能是做除号使用,如“5/3”其实上面的流程图也就对应了程序实现的逻辑,可以用switch-case 来实现,对于每个输入,判断后跳转到相应的状态,然后继续判断。
下面是程序伪代码:while((ch=getchar())!=EOF)switch(state)case 1 :if ch=="/",state=2,break;case 2: if ch=="*",state=3else state=1;break;case 3:..........case 4:..........3.2词法分析程序的功能输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。
3.3参考代码#include<stdio.h>#include<string.h>#include <stdlib.h>#include <math.h>char prog[80],token[8];char ch;int syn,p,m=0,n,row,sum=0;char *rwtab[6]={"begin","if","then","while","do","end"};void scaner(){/*共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else */for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++];while(ch==' '){ch=prog[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名 {m=0;while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n<6;n++) //将识别出来的字符和已定义的标示符作比较,if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')) //数字{{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch) //其他字符{case'<':m=0;token[m++]=ch; ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch; ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch; ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break; case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\n':syn=-2;break;default: syn=-1;break;}}int main(){p=0;row=1;printf("Please input string:\n");do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case 11: printf("(%d,%d)\n",syn,sum); break; case -1: printf("Error in row %d !",row); break; case -2: row=row++;break;default: printf("(%d,%s)\n",syn,token);break;}}while (syn!=0);}3.4程序测试输入begin x:=9; if x>0 then x:=2*x+1/3; end#调试通过,程序截图:总结在该实验的设计中,遇到了一些问题。