3编译原理之词法分析.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3编译原理之词法分析

构建词法分析器的方法 DFA代码化 使用词法分析器自动生成工具,如:LEX 词法错误 词法层能发现的错误很有限 fi ( a = = f(x) ) … fi 是拼写错误?合法的标识符? 词法分析器的实现方案 1 编制词法说明,使用工具自动生成LEX 2 使用高级程序设计语言编写词法分析器 3 使用汇编语言编写词法分析器 词法分析器的实现方案(续) 输入缓冲 词法分析器需要逐个读入分析源程序的字符流 频繁的磁盘读写操作 超前扫描需要回退 耗时,影响编译器工作效率 设置输入缓冲可缓解这一问题 3.2 .1 双缓冲区方案 一个缓冲区分为两个部分,每部分容纳N个字符 一个读命令向缓冲区某个部分读入N个字符 输入不足N时将读入eof 设置两个指针跟踪字符位置 3.2 .1 双缓冲区方案(续) 向前指针移动算法 3.2 .2 双缓冲区方案改进 在缓冲区两部分的结尾处设置一个标志字符(eof),可减少一次测试 3.2 .2 双缓冲区方案改进(续) 改进后的向前指针移动算法 一个状态转换图可用于识别(或接受)一定的字符串。 Lex程序的例子 子集构造法的例子(1) 正则表达式到NFA (Thompson结构法) 即McMaughton-YamadaThompson算法 基本思想 根据正则表达式的递归定义,按照正则表达式的结构递归地构造出相应的NFA。 算法分成两个部分: 基本规则,处理ε和单符号的情况 对于每个正则表达式的运算,建立组合相应NFA的方法。 内容 词法分析器的作用 记号的说明 记号的识别 状态转换图构造 状态转换图代码化 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法 3.3 记号的识别 词法分析器要求能够检查输入字符串,在前缀中找出和某个模式匹配的词素。 首先通过正则定义来描述各种记号的模式。 定义ws?(blank | tab | newline)+来消除空白 词法分析器识别到这个模式时,不返回记号,继续识别其它模式。 状态转换图(transition diagram) 是词法分析器的重要组件之一 状态转换图 状态(state):表示了在识别词素的过程中可能出现的情况 状态可看作是已处理部分的总结。 某些状态为接受状态或最终状态,表明已经找到词素。 加上*的接受状态表示最后读入的符号不属于词素(先行符号)。 开始状态(初始状态):用start边表示。 边(edge):从一个状态指向另一个状态;边上标记一个或者多个符号,即状态变迁的条件 若如果当前状态为s,当前输入符号为a,则沿着从S发出、标记为a的边进入下一个状态。 问题:试设计一个状态图描述日光灯的状态转换过程 识别标识符的状态转换图 1 2 3 字母 其他 字母或数位 * 识别整常数的状态转换图 1 2 3 数位 其他 数位 * 状态转换图举例:关系算符relop 注:双圈表示 接收状态 保留字和标识符的识别 在很多程序设计语言中,保留字也符合标识符的模式,识别标识符的状态转换图也会识别保留字。 解决方法 在符号表中预先填写保留字,并指明它们不是普通标识符。 为关键字/保留字建立单独的状态转换图。并设定保留字的优先级高于标识符。 其它常用状态转换图 问题:状态19,20,21分别识别什么记号 词法分析器的体系结构 从转换图构造词法分析器的方法(DFA代码化) 变量state记录当前状态 整体可通过一个switch来根据state的值转到相应的代码 每个状态对应于一段代码。 这段代码根据读入的符号,确定下一个状态 如果找不到相应的边,则调用fail()进行错误恢复 进入某个接受状态时,返回相应的记号。 注意状态有*标记时,需要回退forward指针。 失效函数 DFA代码化举例——Relop对应的代码概要 处理多个模式的方法 词法分析器需要匹配多个模式 解决方法(3种) 顺序地尝试各个记号对应的状态转换图。如果引发fail(),回退并启动下一个状态图。可以根据优先级确定尝试顺序。 “并行地”运行各个状态转换图。通过greedy策略,识别最长的和某个模式匹配的输入前缀 最长前缀匹配原则 预先把各个状态转换图合成一个状态转换图,然后运行这个状态转换图。 内容 词法分析器的作用 记号的说明 记号的识别 词法分析器生成工具Lex 有穷自动机 从正则表达式到自动机 词法分析器生成工具的设计方法 3.4 词法分析工具Lex/Flex Lex/Flex是一个有用的词法分析器生成工具 通常和Yacc一起使用,生成编译器的前端 Lex程序的结构 声明部分包含: 明示常量:表示常数的标识符 正则定义 转换规则 模式 {动作} 模式是正则表达式 动作表示识别到相应模式时采取的动作。 辅助函数 各个动作需要使用的函数 声明部分 %% 转换

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档