属性文法

 
利用L属性文法自上向下分析,输出四元式的翻译模式:
 
S->id=E {gen('=',E.place,__,entry(id))}
 
E->T {R.i = T.place}
   R {E.place = R.s}
R->+
   T  {R1.i= newtemp; gen('+',R.i,T.place,R1.i)}
   R1 {R.s =R1.s}
R->@(空串)
   {R.s =R.i}
T->F {P.i = F.place}
   P {T.place =P.s}
P->*
   F {P1.i =newtemp;gen('*',P.i,F.place,P1.i)}
   P1 {P.s =P1.s }
P->@ {P.s =P.i}
F->(E) {F.place =E.place}
F->id {F.place = entry(id)}
非终结符R和P的继承属性i用于自上而下传递信息。
根据该翻译模式很容易写出相应的递归下降分析程序,从而实现输出四元式的目的。
for example:
input :a = a+b*(c+d)/f-g/(a+b)/d-g*d*f/g-h;
output:
0:    +    c    d    T1
1:    *    b    T1    T2
2:    /    T2   f    T3
3:    +    a    T3    T4
4:    +    a    b    T5
5:    /    g    T5    T6
6:    /    T6   d    T7
7:    -    T4   T7    T8
8:    *    g    d    T9
9:    *    T9   f    T10
10:    /    T10  g    T11
11:    -    T8   T11   T12
12:    -    T12  h    T13
13:    =    T13  __    a
仅“属性文法和”这样的表述不太明确具体想问的内容。属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“属性”,属性代表与文法符号相关的信息,比如类型、值、代码序列、内存单元地址等。 属性分为综合属性和继承属性。综合属性用于自下而上传递信息,从子结点到父结点;继承属性用于自上而下传递信息,从父结点到子结点。通过语义规则来计算属性的值,语义规则是定义属性上的一组等式或函数。 以下以一个简单算术表达式的属性文法示例来说明: 考虑文法 $E \to E + T \mid T$,$T \to T * F \mid F$,$F \to (E) \mid id$ 可以为其定义属性: - 对于非终结符 $E$、$T$、$F$ 都有综合属性 $val$,表示表达式的值。 - 语义规则: - 若 $E \to E_1 + T$,则 $E.val = E_1.val + T.val$ - 若 $E \to T$,则 $E.val = T.val$ - 若 $T \to T_1 * F$,则 $T.val = T_1.val * F.val$ - 若 $T \to F$,则 $T.val = F.val$ - 若 $F \to (E)$,则 $F.val = E.val$ - 若 $F \to id$,则 $F.val$ 为 $id$ 所代表的值 下面是一个简单的Python代码模拟属性计算过程: ```python # 假设 id 对应的字典 id_values = {'a': 2, 'b': 3} class Node: def __init__(self, symbol, children=None): self.symbol = symbol self.children = children if children else [] self.val = None def evaluate(node): if node.symbol == 'E': if len(node.children) == 3 and node.children[1].symbol == '+': node.val = evaluate(node.children[0]) + evaluate(node.children[2]) else: node.val = evaluate(node.children[0]) elif node.symbol == 'T': if len(node.children) == 3 and node.children[1].symbol == '*': node.val = evaluate(node.children[0]) * evaluate(node.children[2]) else: node.val = evaluate(node.children[0]) elif node.symbol == 'F': if node.children[0].symbol == '(': node.val = evaluate(node.children[1]) else: node.val = id_values[node.children[0].symbol] return node.val # 构建语法树示例 E -> T -> F -> id tree = Node('E', [Node('T', [Node('F', [Node('a')])])]) result = evaluate(tree) print(result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值