Microsoft PowerPoint - L9-v3.pptx

Similar documents
大侠素材铺

Microsoft PowerPoint - ch4.ppt [兼容模式]

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx

Microsoft PowerPoint - ch4.ppt [兼容模式]

编译原理原理与技术

Microsoft PowerPoint - syntaxdirect

内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句

编译原理与技术

大侠素材铺

Microsoft PowerPoint - ch6 [Compatibility Mode]

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident "GCC: (GNU) egcs /Linux (egcs release)" 修改图 6.5 中计算声明名字

Microsoft PowerPoint - ch7.ppt [兼容模式]

Microsoft PowerPoint - SyntaxDirectedTranslation [Compatibility Mode]

编译原理与技术

Microsoft PowerPoint - ch7 [Compatibility Mode]

PowerPoint Presentation


OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018

Microsoft PowerPoint - 6 Intermediate-Code Generation.pptx

1-5,6

再版前言

Microsoft PowerPoint - L12-v3.pptx

Microsoft PowerPoint - 2-FormalLang.ppt

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

ebook14-4

PowerPoint Presentation

南華大學數位論文

什么是函数式编程?

第二章

chap07.key

"!""#!"#$!"""!""$ %&# #$(!""%!""& ) *+#,$ -.# % /&01!""(!" " &#(& ) 203,+," #$4,$ #5, %&# #$(!""%!""( #$!""# $ $!"#

数学分析(I)短课程 [Part 2] 4mm 自然数、整数和有理数

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft PowerPoint - ir

实践 : 能够独立设计和开发简单语言的编译器 课程意义 : 1. 本课程能使学生对编程语言的设计和实现有深刻的理解, 对和编程语言有关的理论 ( 形式语言和自动机理论 类型论等 ) 有所了解, 对宏观上把握编程语言来说, 起一个奠基的作用 2. 对软件工程来说, 编译器是一个很好的实例 ( 基本设计

Microsoft PowerPoint - 1-Introduction.ppt

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

PowerPoint Presentation

Microsoft PowerPoint - ch3 [Compatibility Mode]

第5章修改稿

Microsoft PowerPoint - typecheck


Book1


团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

X 广 州 澳 希 亚 实 业 有 限 公 司 广 州 市 荔 湾 区 国 家 税 务 局 第 二 税 务 分 局 广 州 市 运 输 有 限 公 司 广 州 市 荔 湾 区 国 家 税 务 局 第 二 税 务 分

5) 错误类型 5: 赋值号两边的表达式类型不匹配 6) 错误类型 6: 赋值号左边出现一个只有右值的表达式 7) 错误类型 7: 操作数类型不匹配或操作数类型与操作符不匹配 ( 例如整型变量与数组变量相加减, 或数组 ( 或结构体 ) 变量与数组 ( 或结构体 ) 结构体变量相加减 ) 8) 错误


D 江 苏 汉 邦 建 设 集 团 有 限 公 司 江 苏 邦 实 建 设 工 程 有 限 公 司

无类继承.key

PowerPoint Presentation

PowerPoint Presentation

了 波 涛 和 号 声 袁 读 者 很 容 易 就 进 入 广 州 城 的 水 上 旅 途 袁 进 入 一 座 野 水 上 名 城 冶 的 传 说 中 去 遥 于 是 袁 一 座 名 城 往 事 充 满 了 漂 流 感 袁 旋 律 自 水 上 而 来 袁 我 们 就 这 样 来 到 了 往 事 的

壹、摘 要

第 卷 逆向转换流程 本文提出的基于 [ ] 编译生成技术的 - 程序模型逆向变换, 转换的目标是将 程序源 码转换生成容易理解的过程蓝图和 类图的可 视化模型, 辅助系统理解 逆向转换流程如图 所示 图 逆向转换流程 图 描述了逆向转换的流程, 可分为如下几个 步骤 : ) 构造产生 编译器 采用

Microsoft PowerPoint - ch1.ppt [兼容模式]

香港社會的特徵1b

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

第2章 PL设计概述

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

<4D F736F F F696E74202D20B5DA31D5C220D2FDC2DB2E BD6BBB6C15D205BBCE6C8DDC4A3CABD5D>

CC213

14052_公開用.pdf

# 7 % % % < % +!,! %!!

#!! +!,! # &!. / !!, 7!!, & #! % 7! % )

& ( )! +!, # %! ( & &.! / /.

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

PowerPoint Presentation

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

目 次 寫 在 前 面 李 世 宜... 3 第 一 組 Is this true love- 由 愛 生 恨... 4 曾 毓 皓 丁 士 甫 邱 俐 綺 姜 季 芸 黃 子 芹... 4 第 二 組 流 年 方 學 緯 邱 子 銘 施 酈 庭 曾 柏 陞 黃 勻 琪 羅 凱 騰...

Microsoft PowerPoint - 5-BottomUpParsing12.ppt [兼容模式]


山东建筑大学学分制管理规定(试行)

公理化 数学的公理化 数学公理化起源于欧几里德 公理化的要求 : 协调性, 即无矛盾性 完备性 喻良 ( 南京大学现代数学研究所 ) 可计算性与可判定性 October 30, / 28

Microsoft PowerPoint - 1-Introduction12.ppt [兼容模式]

Personal Branding Roadmap Template

78 云 芝 79 五 加 皮 80 五 味 子 81 五 倍 子 82 化 橘 红 83 升 麻 84 天 山 雪 莲 85 天 仙 子 86 天 仙 藤 87 天 冬 88 天 花 粉 89 天 竺 黄 90 天 南 星 91 天 麻 92 天 然 冰 片 ( 右 旋 龙 脑 ) 93 天 葵

43081.indb

一 天 吃 两 顿, 从 不 例 外 我 上 班 就 是 找 一 个 网 吧 上 网 上 网 的 内 容 很 杂, 看 新 闻, 逛 论 坛, 或 者 打 打 小 游 戏 如 果 没 钱 上 网, 我 会 独 自 一 个 人 到 一 个 偏 僻 的 地 方, 静 静 地 坐 着 发 呆 这 也 是




序 1995 年 我 走 进 了 朝 阳 区 将 台 乡 五 保 老 人 院, 如 今 17 年 后, 十 分 欣 喜 有 机 会 为 这 本 流 金 岁 月 小 集 作 序 在 多 年 陪 伴 孤 单 老 人 的 过 程 中, 我 深 深 地 体 会 到 每 位 老 人 的 生 命 里 其 实 都


工 造 价 15 邗 江 南 路 建 设 工 一 标 市 政 公 用 6000 中 机 环 建 集 团 有 限 公 胡 美 娟 16 邗 江 南 路 建 设 工 二 标 市 政 公 用 品 尊 国 际 花 园 1# 2# 3# 4# 7# 9# 10# 11# 楼 地 库 C 区 工

第一篇 建置区划

untitled

31 121

ǎà

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3



2


Transcription:

Lecture 9: 语法制导的翻译 -I Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301

Introduction 9.1 概述

语义分析在编译程序中的作用 词法分析 目标代码生成 语法分析 中间代码优化 语义分析 分析 中间代码生成 合成

语法和语义的区别 语法 是描述一个合法定义的程序结构的规则 例如 <函数调用语句> id( <实参表达式>) 语义 说明一个合法定义的程序的含义 int x; float* f(); x(); x = f(); 符合变量声明的语法 语义 符合函数声明的语法 语义 符合函数调用的语法 不符合语义 符合赋值语句的语法 不符合语义

语义分析的必要性 一个语法正确的程序不能保证它是有意义的! 程序中容易出现各种语义错误 : 标识符未声明 y = x+3; 操作数的类型与操作符的类型不匹配 y = x*3; 数组下标变量的类型出错 A[x]; 语义分析不能检查程序在计算逻辑上的错误!!!!

程序设计语言语义的分类 静态语义(static semantics) 编译时(compile-time)可以检查的语义 例如 标识符未声明 标识符重复声明 动态语义(dynamics semantics) 目标程序运行时 run-time 才能检查的语义 例如 除零溢出错误 x/(y-i); 当 y = i时 数组下标越界 int a[5]; a[5] =0; 无效指针 int*p; p =NULL; *p = 3;

如何描述程序设计语言的语义? 程序设计语言的形式语义 属性文法 ( 用于描述静态语义 ) 操作语义 (Operational Semantics) 指称语义 (Denotational Semantics) 代数语义 (Algebra Semantics) 公理语义 (Axiomatic Semantics) 形式语义技术没有形式语法技术成熟硕士研究生的课程 -- 形式语义学

Basic concepts 9.2 基本概念

什么是语法制导翻译 语法制导翻译 在语法分析基础上边分析边翻译 翻译的依据 语义规则或语义子程序 翻译的结果 相应的中间代码 翻译的做法 为每个产生式配置相应的语义子程序 每当使用某 个产生式进行规约或推导时 就调用语义子程序 完成一部分翻 译工作 语法分析完成时 翻译工作也告结束

语义规则 产生式与语义规则 每个文法产生式A 有一组形式为b=f(c1, c2,, ck )的语义规则 其中b和c1, c2,, ck 是该产生式文法符号的属性 f 是函数 描述一个产生式所对应的翻译工作 如 改变某些变量的值 填/查各种符号表 发现并报告源程序错误 产 生中间代码 决定于要产生什么样的中间代码

文法属性 文法属性 每个文法符号有一组属性 X是一个文法符号 a是x的一个属性 用X.a表示a在某个标号为X 的分析树结点上的属性值 属性可以有多种类型 如num, type, table_entry, text等 两种类型 综合属性 如果b是A的属性 c1, c2,, ck 是产生式右部文法符 号的属性或A的其它属性 继承属性 如果b是右部某文法符号X的属性

基本概念(skip, 将在后面讨论) 综合属性 在分析树结点N上的非终结符号A的属性值由N对应的产生式所关 联的语义规则来定义 通过N的子结点或N本身的属性值来定义 继承属性 结点N的属性值由N的父结点所关联的语义规则来定义 依赖于N 的父结点 N本身和N的兄弟结点上的属性值 不允许N的继承属性通过N的子结点上的属性来定义, 但是允许N的综合属性依赖 于N本身的继承属性, 终结符号有综合属性(由词法分析获得) 但是没有继承属性

语法制导定义 语法制导(的文法)定义是一个CFG和属性及规则的结合 Syntax-Directed Definition, SDD 属性和文法符号相关联 规则与产生式相关联 只含有综合属性的例子

语法分析树上的SDD求值 实践中很少先构造语法分析树再进行SDD求值 但在分析树上求值有助于翻译方案的可视化 便于理解 注释语法分析树 包含了各个结点的各属性值的语法分析树 步骤 对于任意的输入串 首先构造出相应的分析树 给各个结点 根据其文法符号 加上相应的属性值 按照语义规则计算这些属性值即可

语法分析树上的SDD求值 产 生 式 L En 注释分析树:结点的属性值都标注出来的分析树 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 S属性SDD的分析树各结点属性的计算可以自下而上地完成 L En 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 产 生 式 分析树各结点属性的计算可以自下而上地完成L E n 8+5*2 n的注释分析树 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 语 义 规 则 print (E.val) E E1 + T E.val = E1.val + T.val E T E.val = T.val T T1 F T.val = T1.val F.val T F T.val = F.val F (E) F.val = E.val F digit F.val = digit.lexval F.val = 2 digit.lexval = 2

语法分析树上的SDD求值 按照分析树中的分支对应的文法产生式 应用相应的语义规则计算属 性值 计算顺序问题 如果我们可以给各个属性值排出计算顺序 那么这个注释分析树就可 以计算得到 如果某个结点N的属性a为f(N1.b1,N2.b2,,Nk.bk) 那么我们需要先算出 N1.b1,N2.b2,,Nk.bk的值 S属性的SDD一定可以按照自底向上的方式求值 下面的SDD不能计算 A B A.s=B.i B.i=A.s+1

回顾一下两种属性的定义 综合属性 在分析树结点N上的非终结符号A的属性值由N对应的产生式所关 联的语义规则来定义 通过N的子结点或N本身的属性值来定义 继承属性 结点N的属性值由N的父结点所关联的语义规则来定义 依赖于N 的父结点 N本身和N的兄弟结点上的属性值 不允许N的继承属性通过N的子结点上的属性来定义, 但是允许N的综合属性依赖 于N本身的继承属性, 终结符号有综合属性(由词法分析获得) 但是没有继承属性

SDD (含有继承属性的例子1) 左递归文法使用自顶向下分析时 要消除左递归 出现了继承属性

SDD (含有继承属性的例子1) 3*5注释分析树及属性依赖图 注意观察inh属性是如何传递的

SDD (含有继承属性的例子2) SDD int id1, id2, id3 产 生 式 D TL T int 语 义 规 则 L.in = T.type T.type = integer T real T.type = real L L1, id L id L1.in = L.in; addtype(id.entry, L1.in) addtype(id.entry, L.in) 对于一个属性 不允许出现即是综合又是继承的现象

SDD (含有继承属性的例子2) int id1, id2, id3 注释分析树 不可能像像综合属性那样自下而上标注属性 D L.in = integer T.type = integer, L.in = integer int L.in = integer id1, id2 id3

SDD (含有继承属性的例子2) int id1, id2, id3的分析树 虚线 的依赖图 实线 D TL L.in = T.type 10个结点 每个属性一个结点 D T 4 type int in 9 in 5 L 8 in 7 L 10, id1 1 entry L 6, id2 2 entry id3 3 entry

SDD (含有继承属性的例子2) int id1, id2, id3的分析树 虚线 的依赖图 实线 L L1, id L1.in = L.in; addtype (id.entry, L.in) D T 4 type int in 9 in 5 L 8 in 7 L 10, id1 1 entry L 6, id2 2 entry id3 3 entry

拓扑顺序 使用依赖图来表示计算顺序 ---拓扑顺序 显然 这些值的计算顺序应该形成一个偏序关系 如果依赖图中出现了 环 表示属性值无法计算 给定一个SDD 很难判定是否存在一棵分析树 其对应的 依赖图包含环

SDD (含有继承属性的例子2) Int id1,id2, id3计算顺序 1.先构造输入的分析树 D T 4 type int in 9 in 5 L 8 in 7 L 10, id1 1 entry 4.按拓扑排序的次序计算属性 L 6, 2.构造属性依赖图 id3 3 entry id2 2 entry 3.对结点进行拓扑排序 结点的一种排 序 使得边只会从该次序中先出现的结 点到后出现的结点 例 1 2 3 4 5 6 7 8 9 10 --- 不一定唯一

SDD (只含综合属性的例子) 8+5*2 n的计算顺序 L E.val = 18 E.val = 8 + T.val = 8 T.val = 5 F.val = 8 F.val = 5 digit.lexval = 8 n T.val = 10 digit.lexval = 5 F.val = 2 digit.lexval = 2

语义规则的计算方法---理论做法

语义规则的计算方法 --- 实际操作 tips 基于规则的方法 :( 编译器实现者 ) 静态确定 ( 编译器设计者提供的 ) 语义规则的计算次序 --- 用于手工构造的方法忽略规则的方法 :( 编译器实现者 ) 事先确定属性的计算策略 ( 如边分析边计算 ),( 编译器设计者提供的 ) 语义规则必须符合所选分析方法的限制 --- 适用于自动生成的方法

实现边分析边翻译 怎样的SDD可以和以前所介绍的语法分析结合在一起 属性的计算次序一定受分析方法所限定的分析树结点建立次序的限制 在对SDD的求值过程中 如果结点N的属性a依赖于结点M1的属性a1 M2的属性a2 那么我们必须先计算出Mi的属性 才能计算N的属性a 分析树的结点是自左向右生成 如果属性信息是自左向右流动 那么就有可能在分析的同时完成属性 计算

实现边分析边翻译 特定类型的SDD一定不包含环 且有固定排序模式 S属性的SDD L属性的SDD 对于这些类型的SDD 我们可以确定属性的计算顺序 且可以把不需 要的属性 及分析树结点 抛弃以提高效率 这两类SDD可以很好地和我们已经研究过的语法分析相结合

S属性的SDD及其相容分析方法 只包含综合属性的SDD称为S属性的SDD 自底向上 和LR语法分析器一起实现 每个语义规则都根据产生式体中的属性值来计算头部非终结符号的属性值 在依赖图中 总是通过子结点的属性值来计算父结点的属性值 可以和自顶向下 自底向上的语法分析过程一起计算 在构造分析树的结点的同时计算相关的属性 此时其子结点的属性必然已经计算完 毕 栈中的状态可以附加相应的属性值 在进行归约时 按照语义规则计算归约 得到的符号的属性值 自顶向下 递归下降分析中 可以在过程A()的最后计算A的属性---此时A调用的其他过程 对 应于子结构 已经调用完毕

S属性的SDD及其相容分析方法 例如 和LR分析相容

在分析树上计算SDD 按照后序遍历的顺序计算属性值即可 postorder(n) { for(从左边开始 对N的每个子结点C) postorder(c); //递归调用返回时 各子结点的属性计算完毕 对N的各个属性求值 } 一个自底向上的语法分析过程对应于一次后序遍 历 后续遍历精确地对应于一个LR分析器将一个 产生式规约为它的开始符号的过程 在LR分析过程中 我们实际上不需要构造分析树的结点

L属性的SDD及其相容分析方法 每个属性 要么是综合属性(S属性定义属于L属性定义) 要么是继承属性 且产生式A X1X2 Xn中计算Xi.a的规则只能使用 依赖图的边 A的继承属性 Xi左边的文法符号Xj的继承属性或综合属性 Xi自身的继承或综合属性 且这些属性之间的依赖关系不形成环 继承属性从左到右 从上到下 综合属性从下到上 在扫描过程中计算一个属性值时 和它相关的依赖属性都已经计算完毕

L属性的SDD及其相容分析方法 例如 教材例5.8所示SDD是L属性的 再如 教材例5.9 任何包含下列产生式和规则的SDD都不是L属性的

L属性的SDD及其相容分析方法 例如 变量类型声明的语法制导定义是一个L属性定义 产生式 语义规则 D L.in = T.type TL T int T. type = integer T T. type = real real L L1, L1.in = L.in; id addtype(id.entry, L.in) L id addtype(id.entry, L.in) 相容分析顺序 D T 4 type int in 9 in 5 L 8 in 7 L 10, id1 1 entry L 6, id2 2 entry id3 3 entry

具有受控副作用的语义规则 一个没有副作用的SDD称为属性文法 一个属性文法的规则仅 通过其他属性值和常量值来顶一个另一个属性值 增加了描述的复杂度 比如语法分析时如果没有副作用 标识符表就必须作为属性传递 可以把标识符表作为全局变量 然后通过副作用函数来添加新标识符 受控的副作用 不会对属性求值产生约束 即可以按照任何拓扑顺序求值 不会影响 最终结果 或者对求值过程添加简单的约束

受控副作用的例子 L En print(e.val) 通过副作用打印出E的值 总是在最后执行 而且不会影响其它属性的求值 变量声明的SDD中的副作用 addtype将标识符的类型信息加入到标识符表中 只要标识符不被重复声明 标识符的类型信息总是正确的

9.3 语法制导翻译的应用

语法制导翻译的应用 语法制导翻译技术主要应用 类型检查 处理基本类型和数组类型的L属性定义 中间代码生成 抽象语法树---一种中间代码表示形式

构造AST 抽象语法树AST 语法树是分析树的浓缩表示 算符和关键字是作为内部结点 语法制导翻译可以基于分析树 也可以基于语法树 语法树的例子 if B then S1 else S2 8+5 2 + if-then-else B S1 S2 * 8 5 2

构造AST 抽象语法树 每个结点代表一个语法结构 对应于一个运算符 结点的每个子结点代表其子结构 对应于运算分量 表示这些子结构按照特定方式组成了较大的结构 可以忽略掉一些标点符号等非本质的东西 语法树的表示方法 每个结点用一个对象表示 对象有多个域 Leaf(op, val)创造一个叶子对象 返回一个指向叶子结点对应新记录的指针 Node(op, c1, c2,, ck) 其中c1-ck为子结点

构造AST (S属性SDD) 例1 S属性SDD 构造语法树的语法制导定义 p203, 5.11 a-4+c

构造AST (S属性SDD) 例1 S属性SDD 构造语法树的语法制导定义 p203, 5.11 a-4+c, 构造步骤 p1=new Leaf(id, entry_a) p2=new Leaf(num, 4); p3=new Node( -, p1,p2); p4=new Leaf(id, entry_c); p5=new Node( +, p3,p4);

构造AST (S属性SDD) 例2 S属性SDD 构造语法树的语法制导定义 产 生 式 E E1 + T E T T T1 F T F F (E) F id F num 语 义 规 则 E.nptr = mknode( +, E1.nptr, T.nptr) E.nptr = T.nptr T.nptr = mknode(, T1.nptr, F.nptr) T.nptr = F.nptr F.nptr = E.nptr F.nptr = mkleaf (id, id.entry) F.nptr = mkleaf (num, num.val)

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (S属性SDD) a+5 b的语法树的构造 E.nptr T.nptr + E.nptr T.nptr T.nptr + F.nptr F.nptr num id id 指向符号表中a的入口 F.nptr id num 5 id 指向符号表中b的入口

构造AST (L属性SDD) 例3 L属性SDD 构造语法树的语法制导定义 p205, 5.12 消除左递归

构造AST (L属性SDD) 例3 L属性SDD 构造语法树的语法制导定义 p205, 5.12 a-4+c 构造依赖图

构造AST (L属性SDD) 例3 L属性SDD 构造语法树的语法制导定义 p205, 5.12 a-4+c 不同的语法分析 树与抽象语法树

基本类型和数组类型的L属性定义 例4 简化的类型表达式的语法 类型包括两个部分 T B C 基本类型B 分量C 分量形如[3][4] 表示3X4的二 维数组 e.g. int [3][4] 数组构造算符array array(3,array(4,int)) 表示抽象的3X4的二维数组

基本类型和数组类型的L属性定义 例4 简化的类型表达式的语法 int [2][3]的语法注释树 array(2, array(3, integer))

SDT 9.4 语法制导的翻译方案

语法制导的翻译方案 语法制导的翻译方案(syntax-directed translation scheme, SDT) SDD的一种补充 在产生式体内嵌入了程序片段的一个CFG 程序片段成为语义动作 可以出现在产生式体中任何地方 用 {语义动作}表示

可在语法分析过程中实现的SDT 实现SDT时 实际上并不会真的构造语法分析树 而是在分析过程中 执行语义动作 即使基础文法可以应用某种分析技术 仍可能因为动作的缘故导致此 技术不可应用 我们主要关注用SDT实现以下两类重要的SDD 基本文法是LR的 且SDD是S属性的 基本文法是LL的 且SDD是L属性的

可在语法分析过程中实现的SDT 判断是否可在分析过程中实现 将每个语义动作替换为一个独有的标记非终结符号 每个标记非 终结符号M的产生式为M ε 如果新的文法可以由某种方法进行分析 那么这个SDT就可以在 这个分析过程中实现 注意 这个方法没有考虑变量值的传递等要求

判断SDT可否用特定分析技术实现例子 L E n M1 M1 ε E E+T M2 M2 ε E T M3 M3 ε

面向S属性SDD的后缀翻译方案 后缀SDT 所有动作都在产生式最右端的SDT 文法可以自底向上分析且SDD是S属性的 必然可以构造 出后缀SDT 构造方法 将每个语义规则看作是一个赋值语义动作 将所有的语义动作放在规则的最右端

面向S属性SDD的后缀翻译方案 实现桌上计算器的后缀SDT 注意动作中对属性值的引用 我们允许语句引用全局变量 局部变量 文法符号的属性 文法符号的属性只能被赋值一次

面向S属性SDD的后缀翻译方案 后缀SDT的语法分析栈实现 可以在LR语法分析的过程中实现 归约时执行相应的语义动作 定义用于记录各文法符号的属性的union结构 栈中的每个文法符号 或者说状态 都附带一个这样的union类型的值 在按照产生式A XYZ归约时 Z的属性可以在栈顶找到 Y的属性可以 在下一个位置找到 X的属性可以在再下一个位置找到

面向S属性SDD的后缀翻译方案 分析栈实现的例子 假设语法分析栈存放在一个被称为stack的记录数组中 下标top 指向栈顶 stack[top]是这个栈的栈顶 stack[top-1]指向栈顶下一个位置 如果不同的文法符号有不同的属性集合 我们可以使用union来保存 这些属性值 归约时能够知道栈顶向下的各个符号分别是什么,因此我们也能够确定各 个union中究竟存放了什么样的值

面向S属性SDD的后缀翻译方案 分析栈实现的例子 注意 stack[top-i]和文法符号的对应

产生式内部带有语义动作的SDT 例 把有加和减的中缀表达式翻译成后缀表达式 例如如果输入是8+5 2 则输出是8 5 + 2 E TR R addop T {print (addop.lexeme)} R1 T num {print (num.val)} E T R num {print (8)} R num{print (8)}addop T{print (+)}R num{print(8)}addop num{print(5)}{print (+)}R {print(8)}{print(5)}{print(+)}addop T{print( )}R {print(8)}{print(5)}{print(+)}{print(2)}{print( )}

产生式内部带有语义动作的SDT 产生式内部带有语义动作的SDT 动作左边的所有符号(以及动作)处理完成后 就立刻执行这个动作 B X{a}Y 自底向上分析时 在X出现在栈顶时执行动作a 自顶向下分析时 在试图展开Y或者在输入中检测到Y的时刻执行a

产生式内部带有语义动作的SDT 不是所有的SDT都可以在分析过程中实现 例如 打印前缀表达式 后缀SDT以及L属性对应的SDT可以在分析时完成 移入/规约 冲突 M2 ε M4 ε 移入数字

SDT的基本实现方法 SDT的基本实现方法 忽略语义动作 对输入进行语法分析 产生一个语法分析树 检查每个内部结点N 如果产生式为A α 将α中各个动作当做 N的附加子结点加入 使得N的子结点从左到右和α中符号及动作 完全一致 对分析树进行前序遍历 在访问虚拟结点时执行相应动作

SDT的基本实现方法 例如 语句3*4*5的分析树如右 DFS可知动作执行顺序 A71,A5, A72, A41, A73, A42, A2 注意 一个动作的不同实例所访问的属性值属于不同的结点 E A 2 T 3 T * F A42 2 T 1 F * A5 digit:3 F A41 digit:4 A71 digit:5 A7 3 A72

SDT的基本实现方法 再如 语句3*5+4的分析树如右 分析后得到+*345

消除左递归时SDT的转换 如果动作不涉及属性值 可以把动作当作终结符号进行处理 然后消左递归 原始的产生式 E E1+T {print( + );} E T 转换后得到 E TR R + T {print ( + );} R R ε

消除左递归时SDT的一般转换形式 假设只有单个递归产生式 且该左递归非终结符只有单个属性 引入继承属性R.i 用来累计从A.a的值开始 不断应用g所得到的结果 XYY

消除左递归时 SDT 的一般转换形式

面向L属性SDD的翻译方案 产生式内部带有语义动作的SDT 将一个L属性的SDD转换为一个SDT的规则如下 将每个语义规则看作是一个赋值语义动作 将赋值语义动作放到相应产生式的适当位置 计算A的继承属性的动作插入到产生式体中对应的A的左边 如果A的继 承属性之间具有依赖关系 则需要对计算动作进行排序 计算产生式头的综合属性的动作在产生式的最右边

面向L属性SDD的翻译方案 例 数学排版语言EQN E sub 1.val S B B B1 B2 B B1 sub B2 B text E 1.val

面向L属性SDD的翻译方案 例 数学排版语言EQN 语法制导定义 E sub 1.val E.val 1 产 生 式 S B B B1 B2 B B1 sub B2 B text 语 义 规 则 B.ps = 10; S.ht = B.ht B1.ps = B.ps; B2.ps = B.ps; B.ht = max(b1.ht, B2.ht ) B1.ps =B.ps; B2.ps = shrink(b.ps); B.ht = disp (B1.ht, B2.ht ) B.ht = text.h B.ps

面向L属性SDD的翻译方案 例 数学排版语言EQN 翻译方案 S {B.ps = 10 } B继承属性的计算 B {S.ht = B.ht } 位于B的左边

面向L属性SDD的翻译方案 例 数学排版语言EQN 翻译方案 S {B.ps = 10 } B综合属性的计算 B {S.ht = B.ht } 放在右部末端

面向L属性SDD的翻译方案 例 数学排版语言EQN 翻译方案 S B B1 B2 B B text {B.ps = 10 } B {S.ht = B.ht } {B1.ps = B.ps } {B2.ps = B.ps } {B.ht = max(b1.ht, B2.ht ) } { B1.ps =B.ps } B1 sub { B2.ps = shrink(b.ps) } B2 {B.ht = disp (B1.ht, B2.ht ) } {B.ht = text.h B.ps }

面向L属性SDD的翻译方案 例 继承属性 next 语句结束后应该跳转到的标号 true false C为真/假时应该跳转到的标号 综合属性code表示代码

面向L属性SDD的翻译方案 语义动作 (a) (b) (c) (d) L1=new( ) L2=new( ) 计算临时值 C.false = S.next; C.true = L2 计算C的继承属性 S1.next = L1 计算S1的继承属性 S.code= 计算S的综合属型 根据放置语义动作的规则得到如下SDT (b)在c之前 (c)在s1之前 (d)在最右端 (a)可以放在最前面

作业 图5-4的SDD扩充如右图所示 为教材P198练习5.1.1的第二个表达式 P 语法规则 画出注释语法树和依赖图 教材P203 5.2.4 教材P207 5.3.1 1) L -> En L.val = E.val 2) E -> TE' E'.inh = T.val E.val = E'.syn 3) E' -> +TE1' E_1'.inh = E'.inh + T.val E'.syn = E_1'.syn 4) E' -> ε E'.syn = E'.inh 5) T -> FT' T'.inh = F.val T.val = T'.syn 6) T' -> *FT1' T_1'.inh = T'.inh * F.val T'.syn = T_1'.syn 7) T' -> ε T'.syn = T'.inh 8) F -> (E) F.val = E.val 9) F -> digit F.val = digit.lexval