编译原理第三章词法分析.ppt

上传人:za****8 文档编号:7284184 上传时间:2020-03-18 格式:PPT 页数:46 大小:589.50KB
返回 下载 相关 举报
编译原理第三章词法分析.ppt_第1页
第1页 / 共46页
编译原理第三章词法分析.ppt_第2页
第2页 / 共46页
编译原理第三章词法分析.ppt_第3页
第3页 / 共46页
点击查看更多>>
资源描述
第三章词法分析 LexicalAnalysis Lexical oforrelatingtowordsorthevocabularyofalanguageasdistinguishedfromitsgrammarandconstruction 词法分析在编译程序中的逻辑位置 表处理 错误处理 目标代码生成 中间代码优化 中间代码生成 语义分析 语法分析 词法分析 目标程序 源程序 主要内容 词法分析程序的功能 单词分类及内部表示 词法分析程序的设计与实现步骤 3 1词法分析介绍 例某程序片段如下 VARsum first count real BEGINsum first count 10END 源程序一般表现为字符序列的形式 例某程序片段如下 VARsum first count real BEGINsum first count 10END 期望的源程序表示形式 END 3 1 1词法分析程序的功能单词是字符的序列 是指语言中那些具有独立含义的最小语义单位 单词不是程序设计语言中的语法概念 是编译程序中引进的一个概念 编译程序的翻译工作为提高效率 编译应该在单词一级上进行 词法分析的主要任务 词法分析是编译的第一阶段 它的的主要任务是按语言的词法规则 从左至右逐个字符地对原程序进行扫描 从源程序中识别出每个单词 并把每个单词转换成它们的内部表示 即所谓的TOKEN 同时进行词法检查 词法分析程序 执行词法分析的程序称为词法分析程序 有时也称为词法分析器 LexicalAnalyzer 或者扫描器 Scanner 3 1 2词法分析程序的接口 词法分析程序与语法分析程序的接口有两种形式 词法分析程序作为编译器的独立一遍遍 Pass 所谓 遍 就是对源程序或源程序的中间表示形式从头到尾扫描一次 并作加工处理 生成新的中间结果或目标程序 词法分析程序作为独立的一遍 读入源程序字符序列 识别出每一个单词并将其转换成相应的内部表示 形成一个TOKEN序列 这个TOKEN序列将作为语法分析程序的输入 词法分析程序作为语法分析程序的一个子程序语法分析程序每调用一次词法分析程序 词法分析程序就从源程序的字符序列中拼出一个单词 并将其TOKEN值返回给语法分析程序 这种方式的好处是 它不需要存储源程序的内部表示 词法分析器的接口 3 2词法分析程序的设计3 2 1单词分类 一般常用程序设计语言的单词可以分为以下几类 保留字 保留字一般是由语言系统自身定义的 通常是由字母组成的字符串 如C语言中的int if for do等等 这些字在语言中具有固定的意义 是编译程序识别各类语法成分的依据 标识符 用来标识程序中各个对象的名称 它们由用户定义 用来表示变量名 常量名 数组名和函数名等 常量 主要包括整数常数 实数常数 字符常量 字符串常量等 特殊符号 包括运算符和界限符 运算符表示程序中算术运算 逻辑运算 字符运算 赋值运算的确定的字符或字符串 如各类语言通用的 等 界限符在语言中是作为语法上的分界符号使用的 如逗号 分号 单引号等 3 2 1单词分类 续 3 2 2单词的内部表示 TOKEN结构图单词的内部表示TOKEN的结构一般由两部分组成 单词类别和语义信息 单词类别 又称词法信息 用来区分单词的不同种类 通常可以用整数编码来表示 单词的语义信息 应该是唯一确定其本身内容的编码 一 标识符和常量的TOKEN结构 给出标识符和常量类别编码 给出标识符和常量的语义信息 关于语义信息可以有两种处理方法 一种是在其TOKEN的语义信息部分直接存储这些值 另外一种是设置标识符表和常量表来存储其值 这时TOKEN的语义信息部分就是一个指向相应表项的一个指针 第一种方法处理起来比较简单 但是TOKEN的空间大小不好确定 可能造成空间浪费 因此 我们采取第二种策略 二 保留字 界限符和运算符的处理 可以有两种处理方法 一种是保留字 界限符和运算符分别算作一类 除了要给出其类别外 还需在其TOKEN的语义信息部分直接存储这些值的串或整数编码 如 另外一种是保留字 界限符和运算符采用一符一类的方法 不输出单词的值 其TOKEN的语义信息部分为空 只输出其类别码即可 如 例1某程序片段如下 VARsum first count real BEGINsum first count 10END 不设置标识符表和常量表 词法分析程序扫描该程序段的字符序列 生成下列TOKEN序列 1 15 2 1 sum 3 30 4 1 first 5 30 6 1 count 7 35 8 20 9 31 10 37 11 23 12 37 13 1 sum 14 32 15 1 first 16 33 17 1 count 18 36 19 2 10 20 37 21 24 22 34 例1某程序片段如下 VARsum first count real BEGINsum first count 10END 不设置标识符表和常量表 词法分析程序扫描该程序段的字符序列 生成下列TOKEN序列 1 var 2 id sum 3 comma 4 id first 5 comma 6 id count 7 colon 8 real 9 semi 10 return 11 begin 12 return 13 id sum 14 assi 15 id first 16 plus 17 id count 18 mult 19 int 10 20 return 21 end 22 stop 设置标识符表和常量表 词法分析程序扫描该程序段的字符序列 生成下列TOKEN序列 1 var 3 comma 5 comma 7 colon 8 real 9 semi 10 return 11 begin 12 return 13 id p1 14 assi 15 id p2 16 plus 17 id p3 18 mult 20 return 21 end 22 stop p2 p1 p3 p4 标识符表 常量表 例1某程序片段如下 VARsum first count real BEGINsum first count 10END sum 2 id p1 first count 10 4 id p2 6 id p3 19 int p4 例某程序片段如下 VARsum first count real BEGINsum first count 10END 曾期望的形式 源程序 词法分析的结果 3 2 3单词的形式描述 描述程序设计语言中单词的工具主要有 正则表达式 自动机和正则文法 设计一个语言的词法分析器 通常是首先用正则表达式描述各类单词的组成 然后将其转换为确定有限自动机 最后根据这个自动机来构造词法分析器 基于正则表达式的单词的形式化描述一般的程序设计语言 各类单词的正则表达式可描述如下 1 标识符 L L D 其中 L a z A Z D 0 9 2 正整数 D1D 其中 D1 1 9 D 0 9 3 特殊符号 4 保留字 begin end while 基于有限自动机的单词的形式化描述构造识别单词的有限自动机的方法与步骤如下 1 根据构成规则对程序语言的单词按类构造出相应的状态转换图 或将各类单词的正则表达式转换成相应的有限自动机 2 合并各类单词的状态转换图 构成一个能识别语言所有单词的DFA 合并方法为 1 将各类单词的状态转换图的初始状态合并为一个唯一的初始状态 2 化简调整状态冲突和对冲突状态重新编号 3 如果有必要 增加出错状态 例 标识符 D 1 D 无符号整数 界限符 运算符 图 3 4 各类单词的自动机 合并后的DFA 3 2 4自动机的实现 自动机实现的状态转换矩阵法 又称数据中心法 把自动机看作一种数据结构 状态转换矩阵 由控制程序控制字符在其上运行 从而完成词法分析 转换矩阵法的优点是程序短 但占存储空间多 State InitState Read CurrentChar whileT State CurrentChar error 自动机实现的直接转向法 又称状态转换图方法 程序中心法 每个状态对应一个带标号的switch语句转向边对应goto语句特点 程序长 但占用存储空间少 b 非终止状态对应的switch语句 Li switch CurrentChar case a gotoLj case b gotoLk default Error 终止状态对应的switch语句 Li seitch CurrentChar case a gotoLj case b gotoLk case Eof Accept default Error 3 3词法分析程序的实现3 3 1实现词法分析程序应注意的问题 一般语言中常见的一些问题 1 保留字识别保留字的实现方法可分为两大类 一类是设置保留字表 另一类是用自动机单独来识别 设置保留字表方法的主要思想是事先构造好所谓的保留字表 在进行词法分析时 把保留字也当作一般标识符来识别 然后查保留字表 若有 则把它作为保留字来处理 若没有 则按一般标识符来处理 用自动机单独来识别保留字的主要思想是在自动机中加入识别各个保留字的状态 即把保留字和一般标识符分开来识别而不统一识别 两种方式的比较 不用保留字表的优点是能提高速度 但它使得自动机的状态数随着保留字个数的增多而急剧变大 2 复合单词的识别在程序设计语言中 有一类单词是由两个或者两个以上的符号组成的 这类单词的前缀部分也可以是一个独立的单词 如 在处理到 时 还不能断定这个单词是 还是 的前缀 这取决于 的下一个字符 如果下一个字符是 则该单词为 否则为 在处理这类单词时要特别加以注意 3 数的转换词法分析程序应该把数字字符串转换成数 如 123 应该转换成123 4 向前看若干个字符的处理在有些语言里 为了识别出一个单词需要向前看好几个字符 5 控制字符的处理控制字符 如空格 Tab和回车换行等 这些字符将占用很大的空间 而且一般来说 它们只有词法意义而没有语法和语义上的意义 字符串内的控制字符例外 若Tab和空格符用来分隔源程序中不同的单词 则直接将它们删除 回车换行本身并没有实际意义 但是对于错误处理起着重要的作用 因此回车换行不能直接删除 需要注意的是不能删除掉字符串内的Tab和空格符 因为它们任何时候都是有意义的符号 在处理Tab和空格符时 可以设置一个标志变量 每当进入字符串内部时令其为真 这样就可以根据此变量的值来判断是否在字符串内部 如果不是在字符串内部 可以直接将它们删除 6 注释的处理源程序中的注释没有任何语法和语义上的意义 因此在进行词法分析时可以直接将注释删除 而不必生成其TOKEN 3 3 4实现算法 首先给出词法分析程序中用到的一些基本操作 Append string char 拼单词 KeyWord string 查保留字表 看string是否为保留字 若此函数返回0 则表示string是一个标识符 否则为保留字编码 AddTable table string 入表操作 检查string在table中有没有出现 若有则返回其位置指针 若没有则将其插入到table的末尾 并返回该位置的指针 BACK 源程序文件指针回退一个字符 PROCEDUREScanner BEGINLS0 string ReadChar CurrentChar caseCurrentCharof A Z a z gotoLS1 0 9 gotoLS2 gotoLS3 gotoLS4 gotoLS5 gotoLS8 end LS1 string Append string CurrentChar ReadChar CurrentChar caseCurrentCharof A Z a z 0 9 gotoLS1 other BEGINBACK c KeyWord string if c 0 thenreturn c elsebeginpID AddTable IdTable string return id pID end ENDend LS2 string Append string CurrentChar ReadChar CurrentChar caseCurrentCharof 0 9 gotoLS2 other BEGINBACK pNB AddTable NbTable string return int pNB ENDend LS3 return plus LS4 return semi LS5 ReadChar CurrentChar caseCurrentCharof gotoLS6 other gotoLS7 end LS6 return assi LS7 BACK return colon LS8 ReadChar CurrentChar caseCurrentCharof gotoLS9 other gotoLS10 end LS9 return le LS10 BACK return lt END 3 4词法分析程序自动生成 一个数的二进制表示后面加一个 0 得到的数相当于该数乘以2 一个数的二进制表示后面加一个 1 得到的数相当于该数乘2加1 练习题 用正则表达式表示能被3整除的二进制数的集合 结果 1 10 1 01 0 10 0 0 1 0 0 1 0 1 1 10111010011 2 1 11 5 23 46 93 186 372 745 1491 0 1 0 0 1 0 1 1 01 0 01 0 10 1 10 1 1 01 0 10 1 1 1 01 0 10 1 10 1 01 0 10 1 1 0
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!