词法分析课程设计

合集下载

编译原理综合性实验:词法分析的设计

编译原理综合性实验:词法分析的设计
编译过程中编译程序需要不断汇集和反复查证出现在源程序中各种名字的属性和特征 等有关信息。这些信息通常记录在符号表中。符号表中的每一项一般包含两部分:名字,与 此名字有关的信息,如类型,种属,值等。符号表主要在词法或语法分析阶段生成,可能用 于语义检查、产生中间代码以及最终生成目标代码等不同阶段。
对数字常数的处理如下:先查符号表 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的基本词法规则,包括关键字、标识符、常量、运算符等。

通过本课程的学习,学生应能熟练使用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. 错误处理在词法分析过程中,可能会遇到不符合词法规则的字符序列,这时就需要进行错误处理。

错误处理通常包括以下几个方面:- 识别错误:当遇到无法识别的字符或字符序列时,词法分析器应该能够识别出这是一个错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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#调试通过,程序截图:总结在该实验的设计中,遇到了一些问题。

相关文档
最新文档