




已阅读5页,还剩115页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 依据刻画语言的规则构造语言的识别系统 2 3 词法分析器的功能词法的表示词法分析器的设计与实现 第三章词法分析 4 第三章词法分析 词法分析的任务 从左至右逐个字符地扫描源程序 产生一个个的单词符号 把作为字符串的源程序改造成为单词符号串的中间程序 词法分析器 扫描器 执行词法分析的程序 5 词法分析和语法分析的相互作用 6 源程序 扫描器scanner 1 关键字 词法分析器的功能如下图所示 2 标识符 5 界符 4 运算符 3 常数 由程序语言定义的具有固定意义的标识符 也可称为保留字或基本字 例如 Pascal中的begin end if等 界符 如逗号 分号 括号 等 它是确定的 运算符 如 等 它是确定的 常数的类型一般有整型 实型 布尔型 文字型等 它是不限的 用来表示各种名字 如变量名 数组名 过程名等 它是不限的 7 3 1对词法分析器的要求 3 1 1词法分析器的功能和输出形式 词法分析器的功能 输入源程序 输出单词符号 单词符号 一个程序语言的基本语法符号 分为以下5种 1 关键字 由程序语言定义的具有固定意义的标识符 也可称为保留字或基本字 例如 Pascal中的begin end if等 它是确定的 2 标识符 用来表示各种名字 如变量名 数组名 过程名等 它是不限的 3 常数 常数的类型一般有整型 实型 布尔型 文字型等 它是不限的 4 运算符 如 等 它是确定的 5 界符 如逗号 分号 括号 等 它是确定的 确定 不限 8 单词符号的表示形式 词法分析器所输出的单词符号常常表示成二元式 单词种别 单词自身的值 单词种别可以用以下形式表示 1 一类单词统一用一个整数值代表其属性 例如 1代表关键字 2代表标识符等 2 每一个单词一个类别 例如 1代表BEGIN 2代表END等 单词自身的值可以表示成 常量的二进制表示 常量 变量等在符号表种的地址码 等等 注意 一个语言的单词符号如何分种 分几种 怎样编码 是一个技术问题 标识符一般同归为一种 常数则宜按类型 整 实 布尔 分 关键字可以将其全体视为一种 也可一字一种 运算符可采用一符一种 但也可把具有一定共性的视为一种 界符则一般采用一符一种 如何进行分种主要取决于处理上的方便 若是一符一种分种 单词自身值就不需要了 否则 要查符号表 9 10 例3 1 151 FORTRAN编译程序的词法分析器在扫描输入串IF 5 EQ M GOTO100后 它输出的单词符号串是 逻辑IF 34 左括号 2 整常数 20 5 的二进制表示 等号 6 标识符 26 M 右括号 16 GOTO 30 标号 19 100 的二进制表示 IF为关键字 种别编码34 采用一符一种的编码方式 常数类型 种别编码20 单词自身的值为 5 的二进制表示 为界符 种别编码2 采用一符一种的编码方式 等号为运算符 种别编码6 采用一符一种的编码方式 M为标识符 种别编码26 单词自身值为 M 为界符 种别编码16 采用一符一种的编码方式 GOTO为关键字 种别编码30 采用一符一种的编码方式 100为标号 种别编码19 单词内部的值用100的二进制表示 11 例3 2 下述C 代码段 while i j i 经词法分析器处理以后 它将被转换为如下的单词符号串 while id 指向i的符号表指针 id 指向j的符号表指针 id 指向i的符号表指针 12 3 1 2词法分析与语法分析的关系 1 把词法分析从语法分析中脱离出来的优点 使编译程序的结构更加简洁 清晰和条理化 词法分析和语法分析方法不同 词法分析可以使用正则文法自动构造scanner简单 有利于提高语法分析的效率 可以改善词法分析的细节 甚至于一个语法分析配几个scanner 把不同的输入变成一种内部表示 2 把词法分析作为独立的一遍scanner当作一遍 把scanner当作子程序 13 3 2词法分析器的设计 设计前提 把scanner作为一个独立的子程序 词法分析器的任务为输出单词符号 3 2 1预处理 必要性 编辑性字符如空白符 回车符等 除了出现在文字和常数中以外 在别处出现都没有意义 功能 剔除无用字符 实现 预处理子程序 去掉空白 跳格 回车 换行 注释等 单词符号的识别 超前搜索 14 若识别输入语句IF 5 EQ M GOTO100 若缓冲区情况如下所示 扫描缓冲区的结构 缓冲区大小 120个字符 采用两个指示器 起点指示器 搜索指示器 两个互补区 15 Forward forward 1 Ifforward在缓冲区1末尾then重装缓冲区2Elseifforward在缓冲区2末尾thenbengin重装缓冲区1 将forward移到缓冲区1开始 end 16 Forward forward 1 Ifforward eofthenIfforward在缓冲区1末尾then重装缓冲区2Elseifforward在缓冲区2末尾thenbengin重装缓冲区1 将forward移到缓冲区1开始 end Else终止词法分析程序 17 3 2 2单词符号的识别 超前搜索 单词符号识别的简单方法 超前搜索 关键字识别 例如 在标准FORTRAN中1 DO99K 1 102 IF 5 EQ M I 103 DO99K 1 104 IF 5 55 其中的DO IF为关键字 其中的DO IF为标识符的一部分 18 标识符的识别多数语言的标识符是字母开头的 字母 数字 串 而且在程序中标识符的出现后都跟着算符或界符 因此 不难识别 常数的识别对于某些语言的常数的识别也需要使用超前搜索 算符和界符的识别对于诸如C 语言中的 这种复合成的算符 需要超前搜索 19 如何设计和实现扫描器 20 3 2 3状态转换图 转换图 是一张有限方向图 在状态转换图中 结点代表状态 用圆圈表示 状态之间用箭弧连接 箭弧上的标记 字符 代表在射出结状态下可能出现的输入字符或字符类 状态转换图的功能 用于识别一定的字符串 初态 一张转换图的启动条件 至少有一个 用圆圈表示 终态 一张转换图的结束条件 至少有一个 用双圈表示 表示多读进了一个字符 21 2 0 1 字母 其他 字母或数字 b 识别标识符的转换图 例3 3 简单的状态转换图示例 初态 终态 从0状态到1状态可能出现字母 letter letter digit digit digit 22 23 例3 5 综合实例 做出识别下表所示的小语言的单词符号的状态转换图 24 右图即为对上页所示的简单语言进行词法分析的状态转换图 25 3 2 4状态转换图的实现 1 CHAR字符变量 存放最新读进的源程序字符 2 TOKEN字符数组 存放构成单词的字符串 3 GETCHAR过程 将下一输入字符读入CHAR 搜索指示器前移一个字符 4 GETBC过程 检查CHAR中的字符是否为空白 若是 则调用GETCHAR直至CHAR中进入一个非空白字符 5 CONCAT过程 把CHAR中的字符连接到TOKEN之后 6 LETTER布尔函数过程 它们分别判断CHAR中的字符是数字或是字母 DIGIT从而给出真假值TRUE FALSE 7 RESERVE整型函数过程 用TOKEN中的字符串查保留字表 若是一个保留字则给予编码 否则回送0值 假定0不是保留字的编码 8 RETRACT过程 把搜索指示器回调一个字节 把CHAR中的字符置为空白 26 以上函数和子程序过程都不难编制 使用它们能够方便的构造状态转换图的对应程序 一般 我们可以让每一个状态结对应一个程序段 例如 我们可以让不含回路的分叉结 对应一个CASE语句 或者是一组IF THEN ELSE语句 具体见后面实例 终态结一般对应一个RETURN C VAL 语句 其中C为单词种别编码 VAL是字符数组的TOKEN 或者是一个整数值 或者无定义 具体见后面实例 27 为了把状态转换图转化成程序 每个状态要建立一段程序 它要做的工作如下 第一步 从输入缓冲区中取一个字符 为此 我们使用函数GETCHAR 每次调用它 推进先行指针 送回一个字符 第二步 确定在本状态下 哪一条箭弧是用刚刚来的输入字符标识的 如果找到 控制就转到该弧所指向的状态 若找不到 那么寻找该单词的企图就失败了 失败 先行指针必须重新回到开始指针处 并用另一状态图来搜索另一单词 如果所有的状态转换图都试过之后 还没有匹配的 就表明这是一个词法错误 此时 调用错误校正程序 GETCHAR是过程 将下一输入字符读入CHAR 搜索指示器前移一个字符 2005 9 12 28 例3 6 以下CASE语句段对应的状态图 statei GETCHAR CASECHAROF A Z statej 0 9 statek statel END FAIL 字符变量 存放最新读进的源程序字符 过程 将下一输入字符读入CHAR 搜索指示器前移一个字符 29 对于如上的状态转换图 状态0的代码如下所示 state0 C GETCHAR ifLETTER C thengotostate1elseFAIL LETTER 是布尔函数过程 当且仅当C中的字符是字母 它返回真假值TRUE FAIL 是例子程序 它移回先行指针 lookaheadpointer 开始下一状态转换图 或调用出错程序 例3 7 示例 如何把状态结对应于一段程序 30 对于如上的状态转换图 状态1的代码如下所示 state1 C GETCHAR ifLETTER C orDIGIT C thengotostate1elseifDELIMITER C thengotostate2elseFAIL DIGIT 是布尔函数过程 当且仅当C中的字符是数字 它返回真假值TRUE DELIMITER C 是过程 只要碰到标识符后的分界符 它返回TRUE 分界符一般为 空格 算术 逻辑符号 括号 31 对于如上的状态转换图 终态 状态2的代码如下所示 state2 RETRACT RETURN id INSTALL RETRACT 是过程 由于分界符不属于标识符 所以我们要把先行指针回调一个字符 INSTALL 是过程 如我们识别出的标识符不在符号表中 我们把它装入符号表 我们还要给语法分析程序返回一个二元式 如果同时识别标识符和定义符 则需要修改为State2 修改之后 状态2的代码如下所示 state2 RETRACT c RESERVE ifc 0thenRETURN id INSTALL elseRETURN C RESERVE 整型函数过程 针对TOKEN中的字符串进行查找 看其是否是保留字 是保留字给出它的编码 否则回送0 假定0不是保留字编码 32 例3 8 以下程序段对应的状态图statei GETCHAR WHILELETTERORDIGITDOGETCHAR statej 布尔函数过程 它们分别判断CHAR中的字符是数字或是字母 从而给出真假值TRUE FALSE 33 例3 9 以下程序段对应的状态图 0 9 BEGINWHILEDIGITDOBEGINCONCAT GETCHAREND RETRACT RETURN INT DTB END RETURN语句 对应终态结 其中 INT为种别编码 DTB为一个把十进制转换到二进制的转换函数 它把TOKEN中的数字译成标准二进制码 并以此为函数值返回 34 例3 10 某简易语言的词法 35 为每种单词设置单词种别和属性设计用于单词识别的状态图 36 状态图 结点 状态 用 表示 终态 用 表示有向弧 箭头弧标记 输入字符标识符的状态图 1 2 3 L L或D 其他 初态 终态 37 1 画出每种单词的状态图 标注种别和属性2 合并初态 L D L IDN 入口 DIGIT DIGIT NUM 值 ASG ADD 38 利用应用状态转换图识别单词 1 从初态出发2 读入一字符3 按当前字符转入下一状态4 重复2 3直到无法继续转移5 若当前状态是终止状态 说明读入的字符组成一单词 否则 说明输入不符合词法规则 39 2 状态图的实现 词法分析程序 例3 10所示词法的扫描器的实现 编制子程序scan 完成以下功能 从输入流读取下一个单词 返回 单词种别 子程序的返回值 属性 全局变量attr 副作用 将标识符保存到符号表关键词单独作为一种单词 40 扫描器的设计 数据结构ch当前输入字符buf输入缓冲区 字符数组 symbol单词种别attr属性子例程isKeyword buf 判别buf是关键字 返回关键字种别或 1Lookup buf 将buf存入符号表 返回入口指针 41 例3 10状态图的实现算法 1 读入当前字符ch2 WHILEch是空格 跳过空格3 1DO下一字符 ch3 CASEchOF4 isdigit ch 4 1ch buf 下一字符 ch4 2WHILEisdigit ch DOch buf 下一字符 ch4 3回送ch4 4将缓冲区的数字字符串变成数字 attr4 5返回NUM 42 5 isalpha ch 5 1ch buf 下一字符 ch5 2WHILEisalpha ch ORisdigit ch DOch buf 下一字符 ch5 3回送ch 5 4key isKeyword buf 5 5IFkey 0THEN返回key5 6Lookup buf attr5 7返回IDN6 下一字符 ch 6 1IFch等于 THEN返回ASG6 2出错处理 43 7 返回ADD8 返回SUB9 返回MUL10 返回DIV11 返回EQ12 返回GT13 返回LT14 返回LP15 返回RP16 返回SEMI17其它 出错处理18ENDOFCASE 44 需要说明的问题 缓冲区预处理 超前搜索 关键字的处理 符号表的实现Lookup 查找效率 算法的优化实现词法错误处理由于高级语言的词组成的集合为3型语言 正规文法 所以这里讨论的词法分析技术可以用于处理所有的3型语言 如信息检索系统的查询语言 命令语言等 45 词法记号流 正规式 NFA DFA 最小化 最终得到最小化的DFA 词法分析思路 46 3 3正规表达式与有限自动机 例 标识符的文法描述 约定 用d表示数字 0 1 2 9用l表示字母 A B Z a b z文法G S l Sd Sl左线性文法或 S l lTT l d lT dT右线性文法 表示集合 l l d 进一步简化 l l d 47 1 正规式 正规语言的另一种描述方法 正规式表示正规集 相应的正规集记为L r 正规式与正规文法等价 对任何正规文法 存在定义同一语言的正规式 对任何正规式 存在生成同一语言的正规文法 48 正规式与正规集的递归定义 1 和 都是字母表 上的正规式 它们所表示的正规集分别为 和 2 任何a a是 上的一个正规式 它所表示的正规集为 a 3 正规式正规集正规式正规集UL U U V L U L V VL V U V L U L V U L U 闭包 仅由有限次使用上述三步骤而得到的表达式才是 上的正规式 仅由这些正规式所表示的子集才是 上的正规集 3 3正规表达式与有限自动机 3 3 1正规式与正规集 运算符的优先顺序 先 次 最后 的子集U V 积UV U V n次积V VVV VV0 V的闭包V V0UV1UV2U V的正则闭包V VV 49 例3 11 令 a b 下面是 上的正规式和相应的正规集 正规式正规集ba 上所有的以b为首 并且后跟任意多个a的字 b ba baa baaa a a b 上所有的以a为首的字 a b aa bb a b 上所有含有两个连续的a或者b的字 例310 令 A B 0 1 则 正规式正规集 A B A B 0 1 上 标识符 的全体 0 1 0 1 上 数 的全体 若两个正规式表示相同的正规集 则认为二者等价 记为U V 例如 b ab ba b a b a b 50 运算优先级和结合性 高于 连接 高于 具有交换律 结合律 连接 具有结合律 和对 的分配律 指定优先关系 51 令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 U U U 52 例 标识符定义的转换 引入S S l l d 引入A消除闭包 S lAA l d A 执行连接对 的分配律 S lAA lA dA 53 3 3 2确定有限自动机 DFA 一个确定有限自动机 DFA M是一个五元式 M S s0 F 其中1 S是一个有限集 它的每个元素称为一个状态2 是一个有穷字母表 它的每个元素称为一个输入字符3 是一个从S 至S的单值部分映射 s a s 意味着 当现行状态为 输入字符为a时 将转换到下一状态s 我们称s 为s的一个后继状态 4 s0 S是唯一的初态5 FS是一个终态集 可空 54 显然 一个DFA可用一个矩阵表示 该矩阵的行表示状态 列表示输入字符 矩阵元素表示 s a 的值 这个矩阵称为状态转换矩阵 例3 12 有DFAM 0 1 2 3 a b 0 3 其中 为 0 a 1 0 b 2 1 a 3 1 b 2 2 a 1 2 b 3 3 a 3 3 b 3 相应的状态转换矩阵如下表 55 一个DFA也可用一张 确定的 状态转换图来表示 假定DFAM含有m个状态和n个输入字符 那么 这个状态转换图含有m个状态结点 每个结点顶多有n条箭弧射出和别的结点相连接 整张图含有一个初态结点和若干个 可以为0 终态结点 3 0 1 图3 5状态转换图 2 a a a a b b b 如下表所示的状态转换矩阵对应的状态转换图如右图 56 3 0 1 2 a a a b b b 上图所示的状态转换图的S 及 如下 S 0 1 2 3 a b 为 或者 为a b的任意组合 从初态0到终态3有如图所示的通路 箭弧上到标记符连接起来的字aa属于 所以右图所示的DFA可以识别字aa 同理 从初态0到终态3还有如图所示的通路 箭弧上到标记符连接起来的字bba属于 所以右图所示的DFA可以识别字bba a 57 例3 14 串中只有一个b被如下所示的DFA接受 例3 15 包含最多一个b的串被如下所示的DFA接受 注意二者之间的区别 58 例 证明t baab被如下的DFA所接受 DFAM S U V Q a b f S Q 其中f定义为 f S a Uf V a Uf S b Vf v b Qf U a Qf Q a Qf U b Vf Q b Q 59 证明 f S baab f f S b aab f V aab f f V a ab f U ab f f U a b f Q b QQ属于终态 得证 60 对于 中的任何字 单词 若存在一条从初态结点到某一终态结点的通路 且这条通路上所有弧的标记符连接成的字等于 则称 可为DFAM所识别 读出或接受 若M的初态结点同时又是终态结点 则空字 可为M所识别 或接受 DFAM所能识别的字的全体记为L M DFA的确定性表现在映射 S S是一个单值函数 即 对于任何状态s S和输入符号a s a 唯一确定了一个状态 从转换图角度 我们也可以得到答案 如果允许是一个多值函数 我们就得到下一节要讲到的非确定自动机的概念 61 3 3 3非确定有限自动机 NFA 一个非确定有限自动机 NFA M是一个五元式 M S S0 F 其中1 S是一个有限集 它的每个元素称为一个状态2 是一个有穷字母表 它的每个元素称为一个输入字符3 是一个从S 至S的子集的映射 即 S 2s4 S0 S是唯一的初态5 FS是一个终态集 可空 62 一个含有m个状态和n个输入字符的NFA可用一张如下的状态转换图来表示 该图含有m个状态结点 每个结点可以射出若干条弧与别的结点相连接 每条弧用 中的一个字 可以是不同的字 也可以是空字 做标记 整张图至少含有一个初态结点和若干个 可以为0 终态结点 某些结点既可以是初态结点也可以是终态结点 1 aa a b 2 bb ab 0 a b 0 1 ab ba aa bb ab ba aa bb 63 练习 考虑以下NFA通过怎样的转换接受串acab 10 a 2 1 b 3 7 5 6 4 8 9 c 64 词法记号流 正规式 自动机 NFA DFA NFA DFA 最小化 最终得到最小化的DFA 词法分析思路 65 1 由正规式转换为NFA 四个规则1 如果有输入字符a 2 如果输入 读入 字符a b 3 如果输入ab 4 如果输入a ab 66 例 识别语言 a b ab 2 识别语言aa bb 67 2 NFA确定化 任何状态都没有 转换 即没有任何状态可以不进行输入符号的匹配就进入下一个状态 2 对任何状态S和任何输入符号a 最多只有一条标记为a的边离开s 即转换函数是唯一的 DFA从任何状态出发 对于任何输入符号 最多只有一个转换 68 DFA是NFA的特例 可以采用子集法将NFA确定化 假定I是NFAM的状态集的一个子集 我们定义 CLOSURE I 为 1 若s I 则s CLOSURE I 2 若s I 那么从s出发经过任意条 弧而能到达的任何状态s 都属于 CLOSURE I 状态集 CLOSURE I 称为I的 闭包 CLOSURE I 的定义 69 假定I是NFAM的状态集的子集 a 定义 Ia CLOSURE J 其中 J是那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体 Ia定义 70 a1 a2 ak 先构造一张表 该表每一行含有k 1列 置该表的首行首列为 CLOSURE X 重复上述过程 直至所有第二列和第三列的子集均已在第一列上出现了为止 如果某一行的第一列的状态子集已经确定 例如记为I 那么 求出这一行的第二个和第三个子集Ia和Ib看它们是否已在表的第一列出现 将未出现的填入到后面空行的第一列 1表的初始化构造 2处理表的一行 3重复处理 子集算法 71 例3 17 考虑下图所示NFA的确定化 y x 1 5 a a a a b b 4 3 2 6 b b I CLOSURE X 为 X 5 1 从状态I出发经过一条a弧而能到达的状态全体J为 5 3 而 CLOSURE J 5 3 1 从而Ia 5 3 1 初态 闭包 X 5 1 Ja为 5 3 CLOSURE J 为 5 3 1 根据 闭包的定义 根据此方法依次求出左边表中的状态转换矩阵即可 72 对右下图表中的所有子集重新命名 得到左图中的状态转换矩阵形成如下状态转换矩阵 从而得到相应的DFA 如图所示 3 0 1 2 a a a a b b b 5 4 6 a b b a b 重命名为状态0 重命名为状态1 根据重命名的状态填写表格 a b 73 3 3 4确定有限自动机的化简 一个确定有限自动机M的化简是指 寻找一个状态数比M少的DFAM 使得L M L M 对于任一个DFA 存在一个唯一的状态最少的等价的DFA 74 75 定义 1 有穷自动机的多余状态 从该自动机的开始状态出发 任何输入串也不能到达那个状态 例 s0为初始状态 画状态图可以看出s4 s6 s8为不可达状态应该消除 0 1 s0 s1 s2 s3 s4 s5 s6 s7 s8 s1 s5 s7 s2 s2 s5 s5 s7 s5 s6 s1 s3 s8 s0 s0 s1 s3 s6 76 2 等价状态状态s和t的等价条件是 1 一致性条件 状态s和t必须同时为可接受状态或不接受状态 2 蔓延性条件 对于所有输入符号 状态s和t必须转换到等价的状态里 77 有穷自动机的状态s和t不等价 称这两个状态是可区别的 78 79 DFA最小化的算法 1 把S DFA的整个状态集 的终态与非终态分开 分成两个子集 形成基本划分 显然这两个子集的状态是可区别的 2 把 中的每个子集G划分成若干子集 G的两个状态s与t在同一子集中 当且仅当对任意输入符号a s和t的a转换是到 的同一子集中 生成新的划分 new 在 new中 用G的划分代替G 3 如果 new 则令 final 执行步骤 4 否则 令 new 重复执行 2 4 在 final的每个状态子集中 选一个状态代表它 这些代表就是最简DFA的状态 若该子集包含原有初态 则此代表状态则为最小化后的初态 80 3 0 1 2 a a a a b b b 5 4 6 a b b a b a b 例3 19 考虑下图所示DFA的化简 首先 把M的状态分为2组 终态组 3 4 5 6 非终态组 0 1 2 其次 考察 3 4 5 6 由于 3 4 5 6 a和 3 4 5 6 b都包含于 3 4 5 6 所以它不能在划分 再考察 0 1 2 由于 0 1 2 a 1 3 它既不包含于 3 4 5 6 也不包含在 0 1 2 中 因此 它要划分 由于状态1经a弧到达状态3 而状态0 2经a弧到达状态1 因此 应该把1分出来 形成 1 0 2 再考察 0 2 由于 0 2 b 2 5 它没有包括在上述三组中 因此 它要划分 形成 0 2 划分的组为 3 4 5 6 0 1 2 划分的组为 3 4 5 6 1 0 2 划分的组为 3 4 5 6 1 0 2 至此 整个划分有4组 3 4 5 6 1 0 2 每个组都不可再划分 最后令状态3代表 3 4 5 6 把原来到达4 5 6状态得弧都导入3 并删除4 5 6 这样就得到了下图 化简以后的DFA 81 方法1 从正规表达式到NFA的自动变换2 从NFA到DFA的自动生成3 DFA的化简4 实现化简后的DFA的综合程序嵌入必要的单词属性设置手段 3 4词法分析程序的自动生成 82 83 lex 一个词法分析程序自动生成器 lex程序 yylex函数 词法规格说明 yylex lex yy c 源程序 单词符号 图1 1构造词法分析程序 lex词法规格说明的组成 定义部分 规则集合 正规表达式 处理动作 子程序部分 C语言 每个正规表达式描述一种单词的词法规则相应的程序段是这种单词的处理代码 intyylex 的功能 输入标准输入流处理将输入字符流分成一组匹配正规式的单词串 每当识别出一个单词时 就执行相应的程序段输出返回值 单词种别全局变量yylval 单词属性 86 应用例 需求 词法分析程序 用于识别 十进制整数 标识符 关键字 if then while do 设置单词种别INT IDEN IF THEN WHILE DO设置单词属性整数的值 标识符的符号表入口Lookup text 用于获得符号表入口 87 词法规格说明例 定义部分见下页 if returnIF then returnTHEN while returnWHILE do returnDO 0 1 9 0 9 yylval atoi yytext returnINT A Za z A Za z0 9 yylval Lookup yytext returnIDEN printf Error s yytext 88 定义部分 include defineINT1 defineIDEN2 defineIF3 defineTHEN4 defineWHILE5 defineDO6intLookup chartext 将复制到lex yy c 89 补充说明 代表单词种别的常数IF THEN WHILE DO专用变量charyytext 保存单词文本intyyleng 单词字符个数yylval的类型YYSTYPE缺省为整型经常定义为联合union类型 90 小结 用正规式编写词法 设置单词种别和属性从单词的描述出发 逐步实现词法分析程序 正规式 NFA DFA 识别过程的实现算法 程序实现和测试 91 1 由正规式转换为NFA 四个规则1 如果有输入字符a 2 如果输入 读入 字符a b 3 如果输入ab 4 如果输入a ab 92 2 NFA确定化 DFA是NFA的特例 可以采用子集法将NFA确定化 假定I是NFAM的状态集的一个子集 我们定义 CLOSURE I 为 1 若s I 则s CLOSURE I 2 若s I 那么从s出发经过任意条 弧而能到达的任何状态s 都属于 CLOSURE I 状态集 CLOSURE I 称为I的 闭包 CLOSURE I 的定义 93 假定I是NFAM的状态集的子集 a 定义 Ia CLOSURE J 其中 J是那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体 Ia定义 94 a1 a2 ak 先构造一张表 该表每一行含有k 1列 置该表的首行首列为 CLOSURE X 重复上述过程 直至所有第二列和第三列的子集均已在第一列上出现了为止 如果某一行的第一列的状态子集已经确定 例如记为I 那么 求出这一行的第二个和第三个子集Ia和Ib看它们是否已在表的第一列出现 将未出现的填入到后面空行的第一列 1表的初始化构造 2处理表的一行 3重复处理 子集算法 95 DFA最小化的算法 1 把S DFA的整个状态集 的终态与非终态分开 分成两个子集 形成基本划分 显然这两个子集的状态是可区别的 2 把 中的每个子集G划分成若干子集 G的两个状态s与t在同一子集中 当且仅当对任意输入符号a s和t的a转换是到 的同一子集中 生成新的划分 new 在 new中 用G的划分代替G 3 如果 new 则令 final 执行步骤 4 否则 令 new 重复执行 2 4 在 final的每个状态子集中 选一个状态代表它 这些代表就是最简DFA的状态 若该子集包含原有初态 则此代表状态则为最小化后的初
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度物业经营管理承包合同书
- 2025标准二手房买卖合同封面模板(含房屋维修责任界定)
- 2025年茶山茶叶品牌授权承包合同范本
- 2025年度炊事员健康管理与聘用合同
- 2025版社区蔬菜配送与团购服务合同
- 2025版餐具品牌授权与区域代理合同
- 2025年全新第九章进出口合同商订及环保责任履行协议
- 2025版通信工程技术咨询合同范本
- 2025年教育咨询服务销售担保服务协议
- 2025年极地科研设施半包装修合同范本
- 高中心理健康测试题及答案大全
- 小学二年级上册《健康成长》全册教学设计
- 蓝色简约风医学生职业生涯规划展示模板
- 土建安全员c类考试试题及答案
- T/SHPTA 031-2022电缆和光缆用复合防护尼龙12护套料
- 高中生国防教育
- 汕头侨乡文化课件下载
- 体育公园大众冰雪运动项目配置指南 DB23T 3943-2025
- 值长面试题及答案
- DB32T 4772-2024自然资源基础调查技术规程
- TCECS24-2020钢结构防火涂料应用技术规程
评论
0/150
提交评论