博客 > 硬件&操作系统&网络&DevOps > 编译原理
# 语法制导翻译-语法制导定义(SDD) > 语法制导翻译是基于CFG的,即产生式左部必须是单个非终结符,右部是其展开式。 ![4a08e1aa5260b46352d04a4f64148688.png](/resources/1433f1e9c0354669af1be9ca179ace31) ## 文法符号与语义属性,产生式与语义规则 - 每个文法符号都可以具有若干属性(语义属性) - 每条产生式可以有若干语义规则,即对产生式内出现的文法符号(仅限非终结符)的属性的计算式,一般呈现为赋值语句 - 根据一条产生式的语义规则的具体定义,划分两种属性: - 计算产生式左部非终结符的属性,则将此属性称为该非终结符的综合属性(synthesized attribute),感觉叫合成属性更好理解。![554d0d105b044384f472c46f3d0126e7.png](/resources/20a1fed8a36243efbf4f9e6ab4a13b32) - 计算产生式右部出现的非终结符的属性,则将此属性称为该非终结符的继承属性(inherited attribute)![e1f67a112421997f91304554ff3f5271.png](/resources/761b936dab5348e89570a30942a9246b) - 终结符只有词法分析给出的静态属性,即其字面量,也可视为一种特殊的综合属性 ## SDD ![b5b43f7c560e8f38ac4051cc294cc1aa.png](/resources/b7bd57d34a584c41893f184a573f51bd) ![0853c8fe58f3225ad555dad11db38b28.png](/resources/8e821ca7209f4f6f89919bce7d6997f0) ## SDD的计算图 由于SDD将属性的实际计算过程定义为数条赋值语句,赋值语句表达式中的属性一定是赋值目标属性的前置数据,必须提前计算。 因此把各个属性看作结点(副作用动作看作特殊的结点),属性间的必要条件关系作为弧,将形成一个有向计算图。若计算图无环,则对计算图拓扑排序,可得至少一个合法的计算顺序。 ![67176e274d7f411cc4a121d17f5215db.png](/resources/9f3d3e57e5f048c8a1bd6a13cf56c8e3) 有典型的两种SDD,其必然形成DAG,分别为: - S-属性定义(S-SDD),其中S指Synthesized - L-属性定义(L-SDD),其中L指Left ## S-SDD 仅允许存在定义并计算**综合属性**的语义规则的SDD,称为S-SDD。易知其计算图为严格的与语法分析树同型的自底向上结构。 S-SDD可以轻松植入LR文法的分析(自底向上)方案中,实现语法制导翻译 ## L-SDD 仅允许存在以下两种属性的SDD,称为L-SDD: - 允许存在**综合属性**,与S-SDD一样没有限制 - 允许存在**某些继承属性**,以(A→X1...Xn)中计算Xi的继承属性为例: - 允许使用**A的继承属性**进行计算 - 允许使用**X1...X(i-1)的任意属性**进行计算,不得使用X(i+1)...Xn - 允许使用Xi本身的属性进行计算,但此时不得有环路 - 可见L-SDD的计算图套入语法分析树后,必然为一个只有要么自底向上,要么自左向右的弧的DAG - 每个S-SDD都自然为一个L-SDD L-SDD可以使用LL文法的自顶向下分析实现语法制导翻译,也可以稍加改造后使用LR文法的自底向上分析实现语法制导翻译。