编译原理语法制导翻译.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理语法制导翻译

第五章 语法制导翻译 学习重点 语法制导定义概念 利用语法制导定义构造语法树 S-属性定义、L-属性定义 自顶向下计算属性 自底向上计算属性 递归方法计算属性 内存分配 概述 语法制导定义 翻译模式 “编程语言的翻译根据语法进行” “属性”,attribute 每个语法符号与若干属性相关联 翻译——指定属性的相互依赖关系 语义规则,semantic rule 语言规则的执行反映属性的相互关系 5.1 语法制导定义 扩充CFG 语法符号??属性——语法树节点,记录域 产生式??语义规则——语法树节点,用于计算属性 属性类型 综合,synthesized,根据孩子节点属性计算 继承,inherited,由父、兄弟节点属性计算 依赖图,dependency graph 注释语法树:节点属性值计算完毕 annotated parse tree, annotating, decorating 5.1.1 语法制导定义的形式 每个产生式A ? ?与一组语义规则相关联,每个语义规则具有如下形式: b = f(c1, c2, …, ck),两种可能情况 b为A的综合属性,c1, c2, …, ck为A、?中语法符号的属性 b为?中某个符号的继承属性,c1, c2, …, ck为A、?中语法符号的属性 b依赖c1, c2, …, ck 属性文法:扩充了语法制导定义,无副作用 例5.1 digit.lexval:终结符只有综合属性,由词法分析器提供 开始符号通常没有继承属性 5.1.2 综合属性 只有综合属性:S-属性定义 语法树自底向上计算属性 例5 5.1.3 继承属性 表达程序语言结构在上下文中的相互依赖关系更加自然、方便 例5.3 变量定义 real id1, id2, id3; 例5.3(续) 自顶向下计算 5.1.4 依赖图 属性b依赖属性c,则b应在c之后计算 有向图表示这种依赖关系——依赖图 构造方法: for 语法树中每个节点n do for n的每个语法符号的属性a do 在依赖图中为a构造一个节点 for 语法树中每个节点n do for n使用的产生式的每个语义规则b = f(c1, c2, …, ck) do for i = 1 to k do 构造从ci到b的一条边 例5.4 E ? E1 + E2, E.val = E1.val + E2.val 例5.5 5.1.5 计算顺序 拓扑排序,计算顺序满足依赖关系 m1, m2, …, mk,存在边mi?mj??i j 计算b=(c1, c2, …, ck)时,属性值c1, c2, …, ck已经计算出来 文法?语法树?依赖图?拓扑排序?语义规则计算顺序?输入串翻译 例5.6 例5.5依赖图的边:小数字?大数字 按编号排列?满足要求的拓扑排序 a4=real; a5=real; addtype(id3.entry, a5); a7=a5; addtype(id2.entry, a7); a9=a7; addtype(id1.entry, a9); 5.2 构造语法树 作为中间表示形式——分离分析与翻译 在进行语法分析的同时进行翻译存在缺陷: 适合分析的文法可能未反映自然的语言结构 分析顺序可能与翻译顺序不一致 利用语法制导翻译方法来构造语法树 5.2.1 语法树 (抽象)语法树,压缩形式 关键字和运算符均在内部节点 链式结构会被压缩 语法树压缩例 5.2.2 表达式语法树的构造 与表达式翻译为后缀形式类似 数据结构:语法树每个节点用一个记录表示 运算符节点记录格式: { 运算符 指向运算对象节点1的指针 执行运算对象节点2的指针 … } 辅助函数 mknode(op, left, right):为运算符op创建语法树中节点,标记(运算符)为op,运算对象节点指针left和right mkleaf(id, entry):为标识符创建语法树节点,标记为id,另一个域为符号表项指针entry mkleaf(num, val):为运算数创建节点,标记为num,另一个域为数值 例5.7 a-4+c的语法树 (1) p1=mkleaf(id, entry_a); (4) p4=mkleaf(id, entry_c); (2) p2=mkleaf(num, 4); (5) p5=mknode(‘+’, p3, p4); (3) p3=mknode(‘-’, p1, p2); 5.2.3 构造语法树的语法制导定义 例5.8 例5.8(续) 5.2.4 用有向无环图表示表达式 公共子表达式用公共节点表示 可能出现一个节点有多个“父节点”的情况 构造方法 类似语法树构造 构造节点前检查是否已构造相同节点

文档评论(0)

zilaiye + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档