- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7讲-语法分析-II
中国科大 编译原理和技术 本讲纲要 回顾 语法分析方法 自上而下分析 词法分析部分编程题补充规定 Program Assignment 1 要求计算与单词相关的词法属性:单词在整个文本中出现的次数,甚至出现的位置(在文本中的第几行,第几个字符) Program Assignment 2 DFA,用表格定义状态(有一般性) 比如,将状态转移关系描述为 第一次上机作业 为简单的语言T编写词法分析程序 使用工具lex 相关文件常见ftp我的目录下的proj1.rar 要求:独立尽早完成;最终提交源码与相关文档到huyan.ssdut@ 上机时间核对 周3晚上 软0601-05 , 软件室1+ IBM 周4晚上 编译原理 软0606-10 ,教学楼五楼 文法、推导与分析树 表达式文法 E ? E + E | E * E | (E ) | ? E | id 语法分析的目标是:给出一个句子,比如id+id*id ,怎么判断该句子是满足文法说描述的语法规则? 判断是不是存在一个推导,使得E推导出给定的句子 文法、推导与分析树 推导过程 E=E+E=id+E=id+E*E=id+id*E=id+id*id 二义性 表达式文法 消除二义之后的表达式文法 消除二义的途径 层次化的观点看待表达式 本讲纲要 回顾 语法分析方法 自上而下分析 语法分析? 给定一个句子id+id*id 语法分析的目标 分析句子的语法结构,明该句子符合表达式文法 怎么做? 分析的途径 自上而下 自下而上 本讲纲要 回顾 语法分析方法 自上而下分析 自上而下分析方法 从根部开始构建语法树 存在的问题 文法存在左递归怎么办? 自上而下分析中的问题 E=E+E=E+E+E=E+E+E+E=… 自上而下分析方法 从根部开始构建语法树 存在的问题 文法存在左递归怎么办? 文法中一步推导可能存在多个产生式选择时,怎么办? 如果要用自上而下的方法进行分析,那么就必须避免例子中出现的问题 每一步推导,不能因为左递归的存在而使得推导过程陷入死循环 每一步推导,可以选择的产生式必须是唯一的 消除左递归 文法中存在左递归时,为了采用自上而下的分析方法,必须采取方法消除左递归 3.2 语言和文法 3.2.6 消除左递归 文法左递归 A?+Aa 直接左递归 A?Aa |b 串的特点 ba . . . a 消除直接左递归 A ? b A? A?? a A? | ? 3.2 语言和文法 例 算术表达文法 E ? E + T | T ( T + T . . . + T ) T ? T * F | F ( F * F . . . * F ) F ? ( E ) | id 3.2 语言和文法 例 算术表达文法 E ? E + T | T ( T + T . . . + T ) T ? T * F | F ( F * F . . . * F ) F ? ( E ) | id 消除左递归后文法 E ? TE ? E ? ? + TE ? | ? T ? FT ? T ? ? * F T ? | ? F ? ( E ) | id 3.2 语言和文法 非直接左递归 S ? Aa | b A ? Sd | ? 先变换成直接左递归 S ? Aa | b A ? Aad | bd | ? 再消除左递归 S ? Aa | b A ? bd A? | A? A? ? adA? | ? 提取左因子 当存在某一步推导可能有多种选择的产生式的时候,可以通过提取左因子的方法修改文法 比如,对于文法 S ? aCb C ? cd | c 可以将文法改写为 3.2 语言和文法 3.2.7 提左因子 有左因子的文法 A ???1 | ??2 提左因子 A ? ? A? A? ? ?1 | ?2 3.2 语言和文法 例 悬空else的文法 stmt ? if expr then stmt else stmt | if expr then stmt | other 3.2 语言和文法 例 悬空else的文法 stmt ? if expr then stmt else stmt | if expr then stmt | other 提左因子 stmt ? if expr then stmt optional_else_part | other optional_else_part ? else stmt | ? 通过左递归与提取左因子,解决了文法中一些形式上的问题,但是
文档评论(0)