编译分析技术与工具ppt课件.pptVIP

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

学习资料 理论教材 《程序设计语言编译原理》,陈火旺 ★ ★ ★ 《编译原理》,吕映芝 ★ ★ ★ ★ ★ 《编译原理及编译程序构造》,金茂忠,高仲仪 ★ ★ ★ 《Crafting A Compiler With C》,Charles N. Fischer ★ ★ ★ ★ ★ 《形式语言与自动机》 实践教材 《可变目标编译器:设计与实现》,Chris W. Fraser ★ ★ ★ ★ ★ 《Lex与Yacc》,John R. Levine, Tony Mason ★ ★ ★ ★ ★ 完 Thanks! 递归下降分析:下降 下降 逐级下降分工 每一级均为函数调用 1+2*3+4/5 表达式 因子 + 因子 1 * + 因子 / 2 3 4 5 递归下降分析:递归 递归 语法为递归定义时,调用也递归调用 严格定义的递归接口 1+2*(3+4*5) 表达式 因子 1 * + 因子 2 表达式 因子 3 + 4 5 * 递归下降分析 递归下降分析 结构简单、自然 编码容易 语言不复杂时性能极佳 采用递归下降作为前端的著名的C编译器: LCC GCC(3.0)C Compiler OpenWatcom C Compiler LLVM/Clang …… LL分析法(1) LL:Left-Left 从左向右读入单词 从左向右分析 递归下降分析法即为LL分析法的一种特例 LL(k):提前扫描k个单词 LL(1):提前查看1个单词,最常用的LL分析法 1+2+3+4 1 1+ 1+2 3 3+ 3+3 6 6+ 6+4 10 LL分析法(2) LL(1)分析法 自顶向下分析 程序直观 可用状态转换表实现 可用递归下降实现 易于手工实现 LR分析法(1) LR:Left-Right by Donald Knuth, 1965 从左向右读入单词 从右向左分析 LR(k):提前查看k个单词 LALR(1):LR(1)加约束,最常用的LR分析法 1+2+3+4 1 1+ 1+2 1+2+ 1+2+3+ 1+2+3+4 10 1+2+7 1+9 LR分析法(2) LALR(1)分析法 自底向上的分析 用二维状态转换表实现 转换表构造过程复杂,难以手工实现 自己维护较大的栈(“记忆”的多) 可表达的语法范围比LL分析法广 LL和LR的兼容问题 int foo() { x = 4; return 1; } int bar() { x = 8; return 1; } …… if (foo() bar()) { printf(“x=%d\n”, x); } YACC:概念(1) 背景 写一个编译器前端很困难 大量编译器前端的工作重复 形式语言理论成熟 MULTICS项目 LALR分析法 “很好很强大” 手工构造状态转换表很困难 构造状态转换表的方法较机械 YACC YACC:概念(2) Yet Another Compiler’s Compiler by Stephen C. Johnson, 1975, Bell Lab 神一般的工作 人 编译器 程序 苦力 YACC 神 ? YACC:概念(3) YACC 输入一个CFG文法 输出一个LALR分析器(C语言实现) 与主程序结合,成为一个编译器/解释器 ATT Yacc, Berkeley Yacc, GNU Bison…… grammar.y YACC y.tab.c CC main.c 编译器/ 解释器 源程序 …… YACC:实践(1) 实践任务:简单的四则混合运算计算器calc 例如:1+(2+3)*6/5-4*6 从文件中读入源程序 源程序为一个混合运算式 程序以#结尾 运算数为个位数 运算符为+、-、*、/和括号(、) 分析完后执行运算,打印出结果 9-8*7/(1+2+1)+4*(2+5)# calc source.calc 23 YACC:实践(2) 分析文法,归纳语法 1 + 2 * ( 3 + 4 * 5 ) + 6 括号里和整个表达式是同构关系 乘除运算优先级较高 加减运算优先级最低 最直接的文法 表达式 ::= 因子 +- 因子 +- 因子 +- ……(一个或多个) 因子 ::= 因数 */ 因数 */因数 */ ……(一个或多个) 因数 ::= 数字 因数 ::= ( 表达式 ) YACC:实践(3) 化简为2型文法(CFG) BNF/EBNF表示的产生式(尽量用右递归) 程序 :: 表达式 ‘#’ 表达式 ::= 表达式 + 因子 表达式 ::= 表达式 - 因子 表达式 ::= 因子 因子 ::= 因子*因数 因子 ::= 因子/因数 因子 ::= 因数 因数 ::= 数字 因数 ::= ‘(’ 表达式 ‘)’ 数字 :: ‘0’ …… 数字 :: ‘9

文档评论(0)

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

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

1亿VIP精品文档

相关文档