第4章--词法分析.ppt_第1页
第4章--词法分析.ppt_第2页
第4章--词法分析.ppt_第3页
第4章--词法分析.ppt_第4页
第4章--词法分析.ppt_第5页
免费预览已结束,剩余143页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章教学内容 词法分析的任务 单词 单词的分类 单词的输出形式单词的描述工具 正规文法 正规式 有穷自动机 词法分析程序的自动构造原理 正规式到有穷自动机的转换算法 如何设计和实现词法分析程序 一 词法分析的任务 人们要理解一篇文章或一句话 首先必须了解这篇文章或这句话的结构 文章包含哪些段落 每个段落包含哪些句子 每个句子又包含哪些词 这些过程对于人来说没有什么难度 但对于计算机来说就不同了 输入一段话或一个程序 计算机得到的只是一串符号 要对这段话或这段程序进行分析 计算机首先必须知道这段话由哪些词组成 或这个程序由哪些单词符号构成 这个过程就是词法分析 识别单词 词法分析的任务是 从左到右逐个字符地对源程序进行扫描和分解 根据语言的词法规则识别出一个个的单词符号 词法分析是编译的基础 执行词法分析的程序就是词法分析器 扫描器 其功能是输入源程序 输出单词符号 词法分析程序的主要任务 扫描源程序 识别出单词其他任务 滤掉空格 跳过注释 换行符追踪换行标志 复制出错源程序 宏展开 二 与语法分析程序的接口方式 方式1 词法分析程序作为单独的程序 输入源程序 输出单词文件 提供给语法分析程序使用 方式2 词法分析程序作为语法分析程序的子程序 提供给语法分析程序调用 不产生中间文件 字符串表示的源程序 词法分析程序 字符 语法分析程序 取单词 回送单词 词法分析程序作为子程序 三 单词的分类 单词 单词是语言中具有独立意义的最小语法单位 包括保留字 标识符 运算符 标点符号和常量等 例如 a b是表达式 不是单词 a b是标识符 是运算符 都是单词 程序设计语言的单词符号一般可分成下列5种 关键字 基本字 保留字 具有固定意义的标识符 如PASCAL语言中的begin end if和while等 标识符 用来表示各种名字 如常量名 变量名和过程名等 常数 各种类型的常数 如25 3 1415 TRUE和 ABC 等 运算符 如 等 界符 如逗点 分号 括号等 五类单词 单词的输出形式 二元组表示 单词种别 单词自身的值 示例 单词的种别可以用整数编码表示 假如保留字编码为1 标识符为2 常数为3 运算符为4 界符为5 程序段ify 5x y 100 在经词法分析器扫描后输出的单词符号和它们的输出表示如下 保留字if 1 if 标识符y 2 y 等号 4 常数5 3 5 标识符x 2 x 赋值号 4 标识符y 2 y 加号 4 常数100 3 100 分号 5 单词种别的编码方案 单词的种别表示单词的种类 它是语法分析需要的信息 通常的方法是让每种单词对应一个整数码 其目的是最大限度地把各个单词区别开来 关键字 一字一种 标识符 统一归为一种 常数 按类型 整型 实型 布尔型等 分种 一类一种 运算符和界符 一符一种 单词自身的值 单词自身的值是编译中其它阶段所需要的信息 可采用如下的方法来确定它的值 1 如果一个种别只含一个单词符号 种别编码就完全代表它自身的值 2 如果一个种别只含多个单词符号 那么除了给出种别编码外 还需给出单词符号的自身值 如 标识符 的表示形式 标识符 指向该标识符所在符号表中位置的指针 示例 例如 C程序段 while i j i 经词法分析器处理后转换的单词序列为 的种别码 四 单词的三种描述工具 单词有三种描述工具 正规文法正规式有穷自动机 1 正规文法 正规文法的形式 右线性文法 A aB或A a其中 A B为单个的非终结符 a为单个的终结符 标识符的文法 PASCAL语言中的标识符是字母开头 后跟字母数字串 设l表示a z中的任何一英文字母 d表示0 9中的任一数字 描述标识符的文法为 G11 I I lB lB lB dB l d注意 一般关键字 保留字 都是由字母构成 它是标识符集合的子集 无符号整数的文法 描述无符号整数的文法为 G D D dD d给出123的推导过程 D 1D 12D 123给出00123的推导过程 D 0D 00D 001D 0012D 00123描述整数的文法为 G N N D DD dD d 最复杂的一类单词要属无符号实数了 比如25 55e 5和2 1 它们可以由如下规则描述 无符号数 d 余留无符号数 十进小数 e 指数部分 余留无符号数 d 余留无符号数 十进小数 e 指数部分 十进小数 d 余留十进小数 余留十进小数 e 指数部分 d 余留十进小数 指数部分 d 余留整指数 s 整指数 整指数 d 余留整指数 余留整指数 d 余留整指数 其中s表示正或负号 d表示0 9中的任一数字 无符号实数的文法 程序设计语言中的其它单词的文法非常简单 运算符 界符 其它的文法 2 正规式 正规表达式 regularexpression 是说明单词的模式 pattern 的一种重要的表示法 记号 是定义正规集的工具 正规式也称正则表达式 也是表示正规集的数学工具 正规式的递归定义 是一个正规式 它所表示的正规集为 是一个正规式 它所表示的正规集为 a VT是一个正规式 它所表示的正规集为 a 设e1和e2分别是表示的正规集L e1 和L e2 的正规式 则 e1 e2是正规式 表示的正规集为L e1 L e2 e1 e2是正规式 表示的正规集为L e1 L e2 e1 是正规式 表示的正规集为 L e1 三种运算符 规定运算符的优先顺序为 正规式定义中的 读为 或 也有使用 代替 的 读为 连接 读为 闭包 即 任意有限次的自重复连接 连接符 一般可省略不写 和 都是左结合的 示例 a b 上的正规式和相应的正规集如下 正规式正规集a a a b a b a b ab a b ab a b a b a b a b aa ab ba bb a a a aa 任意个a的串 an n 0 ba b a ban n 0 a ba a b ba baa baaa 示例 正规式正规集 a b a b a b aa ab 所有由a和b组成的串 a b abb所有结尾是abb的任意a和b的串 a b aa bb a b 上所有含有两个相继的a或两个相继的b组成的串 描述单词的正规式 程序设计语言的单词都能用正规式来定义 Pascal语言的标识符的正规式为 字母 字母 数字 或写作l l d 无符号整数的正规式为 d d d dd 无符号实数的正规式为 d dd e dd 运算符的正规式为 正规式等价 若两个正规式e1和e2所表示的正规集相同 即L e1 L e2 则e1和e2等价 记为e1 e2 e1 a b e2 b a 显然等价 e1 b ab e2 ba b均为bababab ababab 等价 e1 a b e2 a b 均表示由a和b组成的任意的符号串 所以等价 正规式的性质 设r s t为正规式 正规式服从的代数规律有1 r s s r 或 服从交换律2 r s t r s t 或 的可结合律3 rs t r st 连接 的可结合律4 r s t rs rt s t r sr tr分配律5 r r r r 是 连接 的恒等元素零一律6 r r 的幂等律 3 有穷自动机FA 有穷自动机 也称有限自动机 作为一种识别装置 它能准确地识别正规集 即识别正规文法所定义的语言和正规式所表示的集合 引入有穷自动机这个理论 正是为词法分析程序的自动构造寻找特殊的方法和工具 有穷自动机分为两类 确定的有穷自动机 DeterministicFiniteAutomata 和不确定的有穷自动机 NondeterministicFiniteAutomata 下面我们分别给出确定有穷自动机和不确定的有穷自动机的定义 有关概念及不确定的有穷自动机的确定化 确定的有穷自动机的化简等算法 有穷自动机的模型 有穷自动机FA是具有离散输入输出系统的数学模型 系统的状态概括了对过去输入处理情况的信息 系统只需要根据当前所处的状态和面临的输入就可以决定系统的后继行为 每当系统出来了当前的输入后 系统的内部状态也将发生变化 例如 电梯控制装置就是有穷系统的典型 1948年 由神经物理学家MeCuloch和Pitts首先提出FA模型 有穷控制器 输入带 有穷控制器控制读头从左向右逐个扫描并读入输入符号 并且根据控制器的当前状态和当前输入符号控制转入下一个状态 读头 接收方式 FA在初始状态下开始读入第一个输入符 FA接收输入串 终态方式 若读头在输入带上最后一个符号时 恰好进入某个终止状态 则宣布接收该输入串 否则 不接收 确定的有穷自动机DFA DFA定义 一个确定的有穷自动机 DFA M是一个五元组 M S f s0 Z 其中 S是一个有穷状态集 它的每个元素称为一个状态 是一个有穷字母表 它的每个元素称为一个输入符号 所以也称 为输入符号字母表 f是状态转换函数 是定义在S S上的单值映射 即若f q1 a q2 表示在当前状态为q1 输入符为a时 将转换为下一个状态q2 q2称作q1的后继状态 s0 S是唯一的初态 Z S是一个终态集 终态也称可接受状态或结束状态 示例 例1 DFAM 0 1 2 3 a b f 0 3 其中 f 0 a 1f 0 b 2f 1 a 3f 1 b 2f 2 a 1f 2 b 3f 3 a 3f 3 b 3 状态转换矩阵 DFA可以用一个矩阵表示 行 表示状态q 列 表示输入字符a 矩阵元素 表示f q a 的值 即在q状态下读入输入符a时应转换到的下一个状态 状态转换图 DFA也可以表示成一张 确定的 状态转换图 结点 表示状态 用圆圈圈起来 箭弧 表示状态转移的方向 f q1 a q2 a DFA 串 为DFAM所识别 对于 中的任何一个字符串 若存在一条从初态结点到某一终态结点的通路 且这条通路上所有箭弧的标记符连接成的字符串等于 则称串 为DFAM所识别 读出或接受 若M的初态结点同时又是终态结点 则为空字 可为M所识别 示例 例1中串abaa的识别路径为 扩充转换函数f 若有 f q1 a1 q2f q2 a2 q3f q3 a3 q4 f qn an qn 1则可记为 f q1 a1a2 an qn 1 DFAM所能识别的语言集 DFAM所能识别的字符串的全体记为L M 若DFAM S f s0 Z 则有 L M f s0 q q Z 示例 例1中的DFAM所识别的语言集L M 为在 a b 上所有含相继两个a或相继两个b的字符串 L M a b aa bb a b 标识符的DFA 标识符e2f3的识别路径为 中间状态 无符号整数的DFA 无符号整数0123的识别路径为 无符号实数的DFA 无符号实数3 8e 9的识别路径为 不确定的有穷自动机NFA NFA定义 不确定的有穷自动机NFAM是一个五元组 M S f S0 Z 其中 S是有穷状态集 是有穷输入字母表 f是状态转换函数 是定义在S 2S上的多值映射 即若f q1 a q2 q3 表示在当前状态为q1 输入符为a时 将转换为下一个状态q2和q3状态 S0 S是初态集 Z S是一个终态集 示例 例2 NFAM 1 2 3 a b f 1 3 2 其中 f 1 a 3 f 1 b 1 2 f 2 a f 2 b 3 f 3 a f 3 b 2 状态转换矩阵为 NFA的状态转换图 串 为NFAM所识别 对于 中的任何一个字符串 若存在一条从初态结点到某一终态结点的通路 且这条通路上所有箭弧的标记符连接成的字符串等于 则称串 为NFAM所识别 读出或接受 示例 例2中串bab的识别路径为 NFAM所能识别的语言集 NFAM所能识别的字符串的全体记为L M 若NFAM S f S0 Z 则有 L M f q1 q2 q1 S0 q2 Z 示例 例2中的NFAM所识别的语言集为 L M b b ab bb 讨论 注意DFA与NFA的异同点 DFA是NFA的特例 对于每个NFAM都一定存在一个DFAM 使L M L M 即 对每个NFAM存在着与之等价的DFAM 与某一NFA等价的DFA不唯一 标识符的NFA 标识符的NFA 标识符e2f3的识别路径为 五 词法分析器的自动生成原理 正规式 NFA 转换 DFA 确定化 化简 最小DFA 1 正规式NFA 对于 上的一个正规式r 可以构造一个 上的NFAM 使得L M L r 构造方法 引进初始结点X和终态结点Y 把正规式r表示成拓广转换图 如下所示 分析正规式r的语法结构 使用如下规则为r中的每个基本符号构造NFA 转换规则 a 对于正规式 所构造的NFA为 b 对于正规式 所构造的NFA为 c 对于正规式a a 所构造的NFA为 a 若r是由 上的正规式r1 r2为复合而成的正规式 则按如下转换规则进行转换 对正规式r1r2 所构造的NFA如下 b 对正规式r1 r2 所构造的NFA如下 c 对正规式r1 所构造的NFA如下 整个转换过程中 可用X表示初态 Y表示终态 所有新结点均采用不同的名字标记 可依次用1 2 3 等 示例 例3 构造正规式r1 01 的NFA 2 NFADFA 从NFA的矩阵表示中可以看出 表项通常是多个状态的集合 而在DFA的矩阵表示中 表项是一个状态 NFA到相应的DFA的构造的基本思路是 DFA的每一个状态对应NFA的一组状态 DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态 确定化方法 状态子集法 确定化 状态子集 状态子集I的 闭包 CLOSURE I a 若q I 则q CLOSURE I b 若q I 那么从q出发经任意条 弧而能到达的任何状态q 都属于 CLOSURE I 状态子集Ia CLOSURE J a I是状态子集 J是那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体 示例 I 1 closure I 1 2 Ia 1 a 5 6 2 3 8 4 7 I 5 closure I 5 6 2 Ia 5 a 3 8 1 2 a closure 5 3 4 2 3 4 5 6 7 8 示例 例4 画出正规式 a b aa bb a b 对应的NFA NFA确定化为DFA 状态子集法 从NFAM S f S0 Z 构造等价的DFAM K f k0 F 的基本方法是 1 求DFA的初态k0 closure NFA的初态 closure X X 5 1 2 求DFAM 的状态集K中的其它状态以及状态转换函数f 用求Ia Ib的方法 设I k0 f k0 a Ia k0 af k0 b Ib k0 b因为 a b 所以只需求Ia Ib即可 子集Ia Ib求出后得到一个新状态就添加到DFA的状态集K中 如此继续 直至不再产生新的状态为止 即可得到DFA的全部状态K和状态转换函数f 示例 对初态k0求其Ia Ib子集 f k0 a Ia X 5 1 a 5 3 1 f k0 b Ib X 5 1 b 5 4 1 所得 5 3 1 与 5 4 1 均是异于k0的新状态 因此将它们加入DFA的状态集K中 再继续对新状态 5 3 1 与 5 4 1 利用求Ia Ib的方法求其它的状态 示例 对状态 5 3 1 求其Ia Ib子集 f 5 3 1 a 5 3 1 a 5 3 1 2 6 Y f 5 3 1 b 5 3 1 b 5 4 1 所得 5 3 1 2 6 Y 加入DFA的状态集K中 示例 对状态 5 4 1 求其Ia Ib子集 f 5 4 1 a 5 4 1 a 5 3 1 f 5 4 1 b 5 4 1 b 5 4 1 2 6 Y 所得 5 4 1 2 6 Y 加入DFA的状态集K中 如此继续 将此过程用状态转换矩阵记录下来 示例 IIaIb X 5 1 5 3 1 5 4 1 5 3 1 5 3 1 2 6 Y 5 4 1 5 4 1 5 3 1 5 4 1 2 6 Y 5 3 1 2 6 Y 5 3 1 2 6 Y 5 4 1 6 Y 5 4 1 2 6 Y 5 3 1 6 Y 5 4 1 2 6 Y 5 4 1 6 Y 5 3 1 6 Y 5 4 1 2 6 Y 5 3 1 6 Y 5 3 1 2 6 Y 5 4 1 6 Y 示例 对上面的表中的状态子集重新命名后的状态转换矩阵ab012132215334465565634 如何确定DFA的终态集 包含原NFA的终态的子集都是DFA的终态 例如 3 4 5 6均是终态 所得DFA如下 3 DFA的化简 确定有穷自动机M的化简是指 寻找一个状态数比DFAM少的DFAM 使得L M L M 一个有穷自动机是化简了的 即是它没有多余状态 并且它的状态中没有两个是互相等价的 一个有穷自动机可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有穷自动机 多余状态 所谓有穷自动机的多余状态 是指这样的状态 从有穷自动机的初态出发 任何输入串也不能到达的那个状态 或者从这个状态没有通路到达终态 等价和可区别的 等价 如果有穷自动机DFAM的两个状态s和t能够识别同样的符号串 则称状态s和t等价 可区别的 如果有穷自动机DFAM的两个状态s和t不等价 则称这两个状态是可区别的 例如 终态与非终态是可区别的 DFA的最小化就是寻求最小状态DFA 最小状态DFA的含义 没有多余状态 死状态 没有两个状态是互相等价 不可区别 两个状态s和t可区别 不满足兼容性 同是终态或同是非终态传播性 从s出发读入某个a a 和从t出发读入某个a到达的状态等价 DFA的最小化过程 分割法 确定有限自动机M的化简的过程也就是其状态最少化过程 一个DFAM的状态最少化过程是指将M的状态集分割成一些不相交的子集 使得任何不同的两子集中的状态都是可区别的 而同一子集中的任何两个状态都是等价的 最后 在每个子集中选出一个代表 同时消去其它等价状态 例如 将前面所得的DFA化简 示例 DFA的状态集k 0 1 2 3 4 5 6 1 首先把M的状态K分为两组 终态集K1 3 4 5 6 非终态集K2 0 1 2 显然K1与K2不等价 2 然后 试图K1 K2在中寻找一个子集和一个输入符号使得这个子集中的状态可区别的 若可区别 则再分割 继续 一直到不能再分割为止 讨论终态集K1 3 4 5 6 是否可分割 3 4 5 6 a K1 3 4 5 6 b K1所以状态3 4 5 6均等价 因此K1不能再分割 讨论非终态集K2 0 1 2 是否可分割 0 1 2 a 1 3 它既不属于K2 0 1 2 也不属于K1 3 4 5 6 因此应将其一分为二 0 2 a 1 1 a 3 由于1态经a弧到达3态 而且状态0 2经a弧到达1态 所以将1状态分出来 形成K21 1 K22 0 2 再讨论K22 0 2 是否可分割 0 2 b 2 5 而它未包括在K1 K21与K22中 故 0 2 应一分为二 K221 0 K222 2 所以K分为四组 3 4 5 6 0 1 2 每个组都不可再分 3 最后 令状态3代表 3 4 5 6 把原来到达4 5 6的弧都导入3 并删除4 5 6状态 即可得到化简后的DFA 示例 例5 正规式r a b abb1 由正规式r构造NFA为 2 NFA确定化为DFA 初态 closure X X 1 2 重命名为 DFA的状态转换图为 3 DFA的化简 DFA的状态集K 0 1 2 3 4 1 首先把状态K分为可区别的两组状态集 终态集K1 4 非终态集K2 0 1 2 3 2 讨论K2 0 1 2 3 能否分割 0 1 2 3 a 1 0 1 2 3 b 2 3 4 而 3 b 4 K1 0 1 2 b 2 3 K2所以可分割为K21 0 1 2 K22 3 3 讨论K21 0 1 2 能否分割 0 1 2 a 1 而 0 2 b 2 K21 1 b 3 K22所以可分割为K211 0 2 K212 1 4 讨论K211 0 2 能否分割 0 2 a 1 0 2 b 2 所以不可分割 0状态与2状态等价 不再分割 所以最终将状态集K分割为 0 2 1 3 4 一共四组 最后 令状态0代表 0 2 把原来到达2的弧都导入0 并删除2状态 即可得到化简后的DFA 示例 例6 标识符的正规式r为l l d 1 由正规式r构造NFA为 2 NFA确定化为DFA 初态 closure X X 重命名为 DFA的状态转换图为 3 DFA的化简 DFA的状态集K 0 1 2 1 首先把状态K分为可区别的两组状态集 终态集K1 1 2 非终态集K2 0 2 讨论K1 1 2 能否分割 1 2 a 2 1 2 b 2 所以不可分割 1状态与2状态等价 不再分割 所以最终将状态集K分割为 0 1 2 一共两组 最后 令状态1代表 1 2 把原来到达2的弧都导入1 并删除2状态 即可得到化简后的DFA 六 正规文法有穷自动机 对于正规文法G和有穷自动机FAM 如果L G L M 则称G和M等价 右线性文法的转换方法 引入一个终态F 设右线性文法G VN VT P S 则相应的自动机为M VN F VT f S F 状态转换函数f由以下规则定义 1 P中形如A aB的产生式 则有f A a B 2 P中形如A a的产生式 则有f A a F 3 对VT中的每个a 都有f F a 示例 例7 描述标识符的右线性文法为 G11 I I lB lB lB dB l d 转换为NFA 引入一个终态F 则相应的NFA为 M I B F l d f I F 其中f可确定为 由I lB可得f I l B由I l可得f I l F由B lB可得f B l B由B dB可得f B d B由B l可得f B l F由B d可得f B d F 用状态转换图表示为 初态 closure I I 将此NFA确定化为DFA 重命名为 DFA即为 上述DFA已经是最小的DFA 不需要再化简 因为如果要进行化简 则首先要把DFA的状态集分为可区别的两组状态集 终态集K1 1 非终态集K2 0 而它们无法再分割 所以不需要化简 此DFA即是最简DFA 七 设计词法分析程序 设计词法分析程序的途径有两种 一种是手工编写 直接依据词法规则编写程序 一种是自动生成 利用词法自动生成工具产生词法分析程序 依据的原理就是将正规表达式转换成等价的有限自动机 要分三步 1 利用DFA设计词法分析器 为了构造词法分析器 要研究构词法 每种单词类的结构模式以及识别它的数学模型 有限自动机FA 它的模拟程序可以作为词法分析器的控制程序 正规式用于说明 描述 单词的结构十分简洁方便 而把一个正规式编译 或称转换 为一个NFA进而转换为相应的DFA 这个DFA正是识别该正规式所表示的语言的句子的识别器 基于这种方法来构造词法分析程序 识别某语言单词的状态转换图 实现状态转换图的方法 根据画出的状态转换图 识别单词的 构造词法分析程序 每个状态对应一小段程序 完成到达此状态的工作 词法分析程序的控制程序模拟状态转换图的状态转换 一般规则 1 对于不含回路的分叉结点 对应多分支语句 分叉结点I对应四分支程序段 GetChar if Isletter 状态J对应的程序段 elseif Isdigit 状态K对应的程序段 elseif ch 状态M的对应程序段 else 错误处理 遇到 错误处理 现行状态I和当前所面临的输入串不匹配 一般规则 2 对于含回路的状态结点 对应循环语句 含回路的结点I对应while循环语句 GetChar while Isletter orIsdigit 相应处理GetChar 状态J对应的程序段 一般规则 3 终态结点对应一个形如return code value 的语句 即单词的二元组输出形式 遇到 非 符号 表示多读入一个字符 输入指针应回退一格 如下图所示 识别某语言单词的状态转换图 构造上述语言的词法分析器 显然对应多分支语句 scaner token NULL GetChar if Isletter ch 识别标识符的程序段 elseif Isdigit ch 状态整数的程序段 elseswitch ch case return 的种别码 break case return 的种别码 break case return 的种别码 break default error break 调用出错处理程序 标识符与保留字的识别 当首符是字母时 开始识别标识符或保留字 边读入下一个输入符边拼写标识符 直至读入非字母数字止 但是多读入一个字符 输入指针 列计数 应回退一格 判断是否为保留字 查保留字表 若查到则为保留字 输出保留字的二元组形式 若查不到则为用户定义的标识符 输出标识符的二元组形式 除此之外 还要考虑是否有符号表 使用下面的全局变量和过程 1 Character2 Token3 Getchar4 getbc5 Concatenation6 isletter isdigit7 Reserve8 Retract9 buildlist10 return 相应算法 If Isletter ch while Isletter ch Isdigit ch concat 拼标识符 GetChar retract 输入指针回退一格 c reserve 查保留字表 If c 10 return 保留字的种别 token elsereturn 标识符的种别 token 整数的识别 当首符是数字时 开始识别整数 边读入下一个输入符边拼数 直至读入非数字止 但是多读入一个字符 输入指针 列计数 应回退一格 拼数 要考虑是否将字符串形式的数转换为十进制数或二进制数 输出整数的二元组形式 相应算法 If Isdigit ch while Isdigit ch concat 拼数 GetChar retract 输入指针回退一格 return 整数的种别 转换为二进制数 注意 在识别标识符的过程中 要拼写出来 并和保留字区别开来 在识别常数的过程中 要把它转换成机器码表示以作为属性值 其它单词的识别 运算符与界符的识别非常简单 对于单个单词 读入何种单个单词 就直接识别 并且输出其二元组形式 例如 对于复合单词 需要拼复合单词 例如对两个字符组成的算符 等单词 需要多读入一个字符 来判断它是否为复合单词 若是单个单词 此时输入指针 列计数 应回退一格 若是复合单词 就输出其二元组形式 示例 例如 case GetChar if ch return 的种别 retract return 的种别 break case return 的种别 retract return 的种别 break 相应算法 2 具体实现 输入 方式一 直接读入字符串形式的源程序 一次性将源程序中的所有符号都读入缓冲区后再

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论