type
status
date
slug
summary
tags
category
icon
password

属性文法
属性文法包含一个上下文无关文法和一系列语义规则。
- 是一种接近形式化的语义描述方法。
- 每个文法符号有相应的属性 V——属性集合,代表与文法符号相关的信息;例如类型、值、代码序列等。
- 每个产生式配有相应的语义规则 F——规则集合,计算属性的规则,可以产生代码、在符号表中存放信息、给出错误信息或执行任何其它动作,实现翻译;以函数形式 b:=f(c1,c2,…,ck) 表示。
- 属性文法:三元组,在上下文无关文法的基础上,把每个文法符号和一组属性相关联,并给产生式附加以语义规则。
A=(G,V,F)
属性分为两类:综合属性和继承属性。
- 对关联于产生式A→α的语义动作b:=f(c1,C2,···,Ck),如果b是A的某个属性,则b是A的一个综合属性。综合属性是自底向上传递信息。
- 对关联于产生式A→α的语义动作b:=f(c1,C2,···,ck),如果b是产生式右边某个文法符号X的某个属性,则b是A的一个继承属性。继承属性是自顶向下传递信息。
综合属性

下面是一个简单表达式文法G[S]的一个仅含综合属性的属性文法(开始符号为S)
S→ E {print(E.val)}
E→ E1+T {E.val:=Ej.val+T.val}
E→ T {E.val:=T.val}
T→ T1*F {T.val:=Ti.valxF.val}
T→ F {T.val:=F.val}
F→ (E) {F.val:= E.val}
F→ d {F.val:=d.lerval}
其中d.lecval表示数值,E.val,T.val,F.val都为综合属性


继承属性

下面是一个包含综合属性、继承属性的属性文法:
E→TR{R.in:=T.val;E.val:=R.val}
R→+TR1{R1.in:=R.in+T.val;R.val:=R1.val}
R→−TR1{R1.in:=R.in−T.val;R.val:=R1.val}
R→ε{R.val:=R.in}
T→num{T.val:=lexval(num)}


语法制导翻译
语法制导翻译法:
由源程序的语法结构所驱动的处理办法,为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则,完成相应的语义处理。每当用一个产生式推导或归约时,就执行对应的语义规则。
语法制导定义(SDD)
- 是关于语言翻译的高层次规格说明
- 隐蔽了许多具体实现细节,使用户不必显式地说明翻译发生的顺序
SDD是对CFG的推广
- 将每个文法符号和一个语义属性集合相关联
- 将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值
如果X是一个文法符号,a是X的一个属性,则用X.a表示属性a在某个标号为X的分析树结点上的值。

语法制导翻译方案(SDT)
- 可以看作是对SDD的一种补充,是SDD的具体实施方案
- 显式地指明了语义规则的计算顺序,以便说明某些实现细节
SDT是在产生式右部嵌入了程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作放在花括号内。

一个语义动作在产生式中的位置决定了这个动作的执行时间。
- 逆波兰式,即后缀式。
- 三元式、四元式,相比三元式四元式多一个中间值。
📎 参考文章
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/1f8c7b13-c6a7-8061-906d-ef4efbe93d9a
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!