词法分析器

C# 词法分析器(三)正则表达式

南楼画角 提交于 2020-01-09 02:01:14
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以非常高效的描述处理词法单元时要用到的模式类型。 一、正则表达式的定义 正则表达式可以由较小的正则表达式按照规则递归地构建。每个正则表达式 $r$ 表示一个语言 $L(r)$,而语言可以认为是一个字符串的集合。正则表达式有以下两个基本要素: $\epsilon$ 是一个正则表达式, $L( \epsilon ) = { \epsilon }$,即该语言只包含空串(长度为 0 的字符串)。 如果 $a$ 是一个字符,那么 $\bf{ a }$ 是一个正则表达式,并且 $L( \bf{a} ) = \{ a \}$,即该语言只包含一个长度为 $1$ 的字符串 $a$。 由小的正则表达式构造较大的正则表达式的步骤有以下四个部分。假定 $r$ 和 $s$ 都是正则表达式,分别表示语言 $L(r)$ 和 $L(s)$,那么: $(r)|(s)$ 是一个正则表达式,表示语言 $L(r) \cup L(s)$,即属于 $L(r)$ 的字符串和属于 $L(s)$ 的字符串的集合( $L(r) \cup L(s) =

词法分析器与正规式

情到浓时终转凉″ 提交于 2020-01-08 06:37:23
词法分析器 词法分析器是一个程序,它的任务是从源程序中提取单词。比如从源程序中提取出保留字,标识符,常数,运算符等单词符号。 词法分析器的结果是输出单词(token),通常是二元式(单词种别,单词自身的值)。 单词种别的划分,是如何设计编译器层面上的事情。可以将所有的保留字视为一种,也可以将每个保留字都视为一种。不过通常是将每种单词视为一个整数码,这样方便处理。 单词自身的值,如果一个单词种别只包含一个单词, 那么其种别编码就是其自身的值。 对于标识符和,其在符号表的入口指针作为它自身的值。 状态转换图 状态转换图对于单词的识别是可行的。只要构造出相应语言的单词的状态转换图,那么单词的识别是非常容易的。 正规式 可以将状态转换图的概念加以形式化,那么就是正规式。正规式用数学语言描述了状态转换图。可以用程序对正规式构造相应的状态转换图。 那么只要将状态图加以形式化,那么就可以自动生成词法分析器。 来源: https://www.cnblogs.com/beMaster/p/5066373.html

词法分析实验报告

不羁岁月 提交于 2020-01-05 01:50:57
实验一、词法分析实验 专业 姓名 学号 一、 实验目的 编制一个词法分析程序 二、 实验内容和要求 输入:源程序字符串 输出:二元组(种码,单词符号本身)。 三、 实验方法、步骤及结果测试 1. 源程序名:压缩包文件( rar 或 zip )中源程序名 cifafenxiqi.c 可执行程序名: cifafenxi.exe 2. 原理分析及流程图 主要总体设计问题。 (包括存储结构,主要算法,关键函数的实现等) 流程图 总体思想是将输入的源程序将其运用词法分析规则去分类(保留字/关键字/界符/运算符等等),其中保留字包含(字母 数字 下划线)关键字(if/switch/while/case等等),利用数组将其存起来与后面的在进循环的字符进行判断,若是则输出,清空数组,在判断直到源程序的最后一个字符是‘#’ ,结束 显示 (种码,x)。 3. 主要 程序段及其解释: #include <stdio.h> #include <string.h> char prog[80],token[8],ch; //创建字符数组 int syn,p,m,n,sum; //syn 是种码 char *rwtab[6]={"begin","if","then","while","do","end"}; //字符数组’关键字’ void scaner(void); main() { p=0; printf

词法分析器生成工具flex

不打扰是莪最后的温柔 提交于 2020-01-05 01:24:58
1.FLEX简介 单词的描述称为模式(Lexical Pattern),模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件,输出一个如下所示的C语言源程序。 +------------+ +------------+ +----------------+ | 输入文件*.l |------>|flex工具 |------>|输出文件lex.yy.c | +------------+ +------------+ +----------------+ FLEX的输入文件称为LEX源文件,它内含正规表达式和对相应模式处理的C语言代码。LEX源文件的扩展名习惯上用.l表示。FLEX通过对源文件的 扫描自动生成相应的词法分析函数 int yylex(),并将之输出到名规定为lex.yy.c的文件中。实用时,可将其改名为lexyy.c。该文件即为LEX的输出文件或输出的词法分析器。 也可将 int yylex()加入自已的工程文件中使用。 2. LEX源文件的格式 LEX对源文件的格式要求非常严格,比如若将要求顶行书写的语句变成非顶行书写就会产生致命错误。而LEX本身的查错能力很弱,所以书写时一定要注意。 LEX的源文件由三个部份组成,每个部分之间用顶行的“%%”分割,其格式如下: 定义部份 % % 规则部份  % % 用户附加C语言部份

Flex词法分析器使用

眉间皱痕 提交于 2020-01-05 01:23:24
感谢: http://blog.csdn.net/litchh/archive/2004/07/14/40983.aspx 在构造编译器方面,lex和yacc可谓是有很大的天赋,lex主要用于词法的分析,而yacc则用于语法语义等分析。 那么究竟如何使用lex和yacc呢?如果你是一个老鸟,当然这篇文章你可以跳过不看,如果你是一个新手,那么看了下面这个例子我想你会对flex做词法分析了解很多。 下面我通过一个例子来详细说明如何使用flex 根据所学的词法分析内容 ,利用 flex 构造 PL/0 语言的词法分析器。 既然是构造PL/0的词法分析器,那么我们有必要看一下pl0语言的简介和相应文法: 2 PL/0 语言 Ⅰ .PL/0 语言概述 . PL/0 语言是 PASCAL 语言的子集,它具备一般高级程序设计语言的典型特点。 PL/0 语言编译程序结构比较清晰,可读性强,充分体现了一个高级语言编译程序实现的基本组织、技术和步骤,是一个非常合适的小型编译程序的教学模型。 Ⅱ .PL/0 语言文法描述 . 由于只是做 PL/0 的词法分析,因此这里只列出词法有关的内容,其余略过。 下面用扩充的 EBNF 来进行表示: 元符号说明: ‘ < > ’:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,是 PL/0 的非终结符 ‘ ::= ’:该符号的左部由右部定义。 ‘ | ’

Atitit.词法分析的理论原理 part2

不想你离开。 提交于 2020-01-05 01:15:32
Atitit. 词法分析的理论原理 part2 1 . 转换图 1 1 .1. 转换图是由程序流程图改进而成的。同样,转换图也可以等价地转换为程序流程图 3 1 .2. 2.2.3 构造词法分析器(2)流程 程序2-1虽然只有26行,却是词法分析器的核心 4 1 .3. 单词存储形式就是三元组(单词 ID ,单词备注,单词行号)。 4 1 .4. 单词流是如何传递给语法分析器的。 5 1 .5. 词法定义 5 1 .6. 词法分析器主要包括:构造转换图与转换表、设计词法分析器算法。 6 1 .7. 超前搜索几个字符与词法定义有关,有些设计不精良的语言可能需要超前搜索三个甚至四个字符才能正确识别单词 7 1. 转换图 从图2-2中,不难发现,其中只有"搜索指针后移一个字符"一种处理动作(方框)。那么,读者不妨想象一下,词法分析器是否就只有这种处理动作呢?仔细分析手工识别单词的过程后,就可以发现事实确实如此。既然词法分析器的流程中条件判断(菱形框)比较复杂,而处理动作非常单一,因此,可以将普通流程图改造成一种专门用于描述条件判断的流程图。具体改造步骤如下: 1)把图2-2中所有上、下菱形(判断)之间的箭头用圆表示。 2)把图2-2中所有的菱形直接用箭头线表示,箭头上写上原菱形的判断成立与否的条件,即可得到图2-3。 图2-3 识别Pascal标识符的状态转换图 这里省略了出错处理

C# 词法分析器(五)转换 DFA

孤人 提交于 2020-01-05 00:48:23
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 在上一篇文章中,已经得到了与正则表达式等价的 NFA,本篇文章会说明如何从 NFA 转换为 DFA,以及对 DFA 和字符类进行化简。 一、DFA 的表示 DFA 的表示与 NFA 比较类似,不过要简单的多,只需要一个添加新状态的方法即可。 Dfa 类 的代码如下所示: namespace Cyjb.Compilers.Lexers { class Dfa : IList<DfaState> { // 在当前 DFA 中创建一个新状态。 DfaState NewState() {} } } DFA 的状态也比较简单,必要的属性只有两个:符号索引和状态转移。 符号索引表示当前的接受状态对应的是哪个正则表达式。不过 DFA 的一个状态可能对应于 NFA 的多个状态(详见下面的子集构造法),所以 DFA 状态的符号索引是一个数组。对于普通状态,符号索引是空数组。 状态转移表示如何从当前状态转移到下一状态,由于在构造 NFA 时已经划分好了字符类,所以在 DFA 中直接使用数组记录下不同字符类对应的转移(DFA 中是不存在 $\epsilon$ 转移的,而且对每个字符类有且只有一条转移)。 在 NFA 的状态定义中,还有一个状态类型属性,但是在

atitit.词法分析原理 词法分析器 (Lexer)

家住魔仙堡 提交于 2020-01-05 00:46:58
atitit. 词法分析 原理 词法分析器 (Lexer) 1 . 词法分析 (英语: lexical analysis ) 1 2 . ;实现词法分析程序的常用途径 : 自动生成 , 手工生成 . [1] 2 2 .1. 词法分析程序的功能 2 2 .2. 如何描述词素 3 2 .3. 单词 token 3 2 .4. Token 的类型 ,根据程序设计语言的特点,单词可以分为五类:关键字、标识符、常量、运算符、界符。以 4 2 .5. 词法分析 的第一阶段即扫描器 4 2 .6. 词法分析 的第 二 阶段 评估器( Evaluator ) 5 2 .7. 例如 C语言程序段的词法分析结果 5 2 .8. 最长原则 6 2 .9. 词法单元的识别 6 2 .10. 不确定 ” ( Nondeterministic Finite Automata ,NFA 8 2 .11. 转换图(transition graph)的表示 9 2 .12. 词法分析 (3)---DFA 10 2 .13. 为什么要 NFA 转 DFA 12 2 .14. 则表达式转 NFA 13 2 .15. 正则表达式如何转换为NFA呢?有几个公式 (MLS2007[1]): 13 2 .16. 构造词法分析器了。大致的流程如下: 19 2 .17. 常用的 token scanner 19 2 .18.

词法分析Simple Lexer

落花浮王杯 提交于 2020-01-05 00:46:23
以前尝试阅读《编译原理》,但都没有读下来,现在看《编程语言实现模式》,感觉轻松多了。其实,目前我只对解析感兴趣,只要看这本书的第一部分解析起步就可以了,确实没有必要去啃《编译原理》。下面就是学习的内容了。 解析,分为两步,先是进行词发分析,将输入转换成一个一个的Token,然后是进行语法分析。一个一个的Token组成语句,对应一定的语法。根据这些Toke,匹配一定的语法。词法分析器,lexer,是语法分析器,parser,的基础。 先来看看词发分析器。例如语句,1024+ 78*pi,一个简单的表达式, 词发分析就是要得出上面的语句由这些Token组成,1024, + , 78, * ,pi。Token可以是运算符,可以是数字,也可以是字符串。在处理原来的字符串时,遇到第一个字符'1',把它放入一个buf里面,然后遇到0,仍然是合法的数字,放入buf里面,直到遇到'+',这时就可以把buf返回,得到1024这一个token。然后从刚才的位置继续,'+‘,直接返回这个Token,可以把其作为运算符一类,也可以是运算符细分之后的‘+’一类。后面遇到空格,跳过。后面的类似处理。 在做这些操作的时候,由lexer的数据结构支持,所以lexer需要保存原始的字符串,需要知道当前的位置,而Token应该有两个元素,一个保存它的内容,另一个保存它的类型。在解析的时候

C# 词法分析器(三)正则表达式

你离开我真会死。 提交于 2020-01-05 00:46:10
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以非常高效的描述处理词法单元时要用到的模式类型。 一、正则表达式的定义 正则表达式可以由较小的正则表达式按照规则递归地构建。每个正则表达式 $r$ 表示一个语言 $L(r)$,而语言可以认为是一个字符串的集合。正则表达式有以下两个基本要素: $\epsilon$ 是一个正则表达式, $L( \epsilon ) = { \epsilon }$,即该语言只包含空串(长度为 0 的字符串)。 如果 $a$ 是一个字符,那么 $\bf{ a }$ 是一个正则表达式,并且 $L( \bf{a} ) = \{ a \}$,即该语言只包含一个长度为 $1$ 的字符串 $a$。 由小的正则表达式构造较大的正则表达式的步骤有以下四个部分。假定 $r$ 和 $s$ 都是正则表达式,分别表示语言 $L(r)$ 和 $L(s)$,那么: $(r)|(s)$ 是一个正则表达式,表示语言 $L(r) \cup L(s)$,即属于 $L(r)$ 的字符串和属于 $L(s)$ 的字符串的集合( $L(r) \cup L(s) =