编译原理第四章语法制导定义L属性文法的自下而上计算

L属性文法的自下而上计算

  • 可以实现任何基于LL(1)文法的L属性定义
  • 也能实现大部分基于LR(1)的L属性定义
一.删除翻译方案中嵌入的动作

方法:
1.加入新产生式M→ξ
2.把嵌入在产生式中每个语义动作用不同的非终结符代替,并把这动作放到1的产生式后面

R→+T{print(’+’)}R1 | -T{print(’-’)}R1 | ξ
=>R→+TMR1 | -TNR1 | ξ
M→ξ {print(’+’)}
N→ξ {print(’-’)}

二.分析栈上的继承属性
(1)属性位置能预测

int p,q,r
D→T{L.in=T.type;}L
T→int{T.type=integer;}
L→{L1.in=L.in;}L1,id{addtype(id.entry,L.in);}
L→id{addtype(id.entry,L.in);}

当识别int时按第二个产生式进行归约,栈顶只有T,识别p时因为自下而上分析我们不知道L.in的值是多少,但我们从上而下看L.in的值跟T一样,所以当p归约成L时,此时栈中栈顶为p以及栈底的T,所以我们可以把翻译模式改为栈中addtype(val[top],val[top-1]),同理,当L,q按第三个产生式归约时,栈中自底向上为T、L、,、q可以改写为addtype(val[top],val[top-3])

产生式代码段
D→TL
T→intval[top]=integer;
L→L1,idaddtype(val[top],val[top-3])
L→idaddtype(val[top],val[top-1])
(2)属性位置不能预测

S→aAC C.i=A.s;
S→bABC C.i=A.s
C→c C.s=g(C.i);

例如上面的文法c归约为C后,C无法确定按第一个还是第二个产生式进行归约,前者的话要去top-1获取A.s,后者则要去top-2获取,所以不能准确得出到底去哪获取,此时我们可以增加标记非终结符,使得位置可以预测

S→aAC C.i=A.s;C.i=M.s==
S→bABMC M.i=A.s;C.i=M.s;
C→c C.s=g(C.i);
M→ξ M.s=M.i

这里的M.i在M归约前获取了A.s的值,M规约后等于M.s,C在归约前获取了M.s,相当于可以使C每次在归约时都在栈中往前看top-1的值就可以获取了

三.模拟继承属性的计算

该类情况通常适用于继承属性是某个综合属性的一个函数

S→aAC C.i=f(A.s);
C→c C.s=g(C.i);

这类情况往往是计算完函数的值后无法存储以至于无法获取,通常增加标记非终结符,把f(A.s)的计算移到对标记非终结符归约时进行

S→aANC N.i=A.s;C.i=N.s;
N→ξ N.s=f(N.i)
C→c C.s=g(C.i);

N在归约前用继承属性记录了A.s的值,在归约后计算出函数的值存储到N的综合属性上,放到栈顶,C在归约前就可以获取,运用到数学方面,先用一个未知量x存储一个数字,然后再把这个数字带入到函数关系中。
当然这类方法也可以增加一个变量,但会使计算变得更复杂,不可取。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
编译原理第三版第六章主要介绍了自顶向下语法分析和递归下降语法分析相关内容。其中包括了预测翻译器的设计方法、S-属性文法定义和使用、语法制导翻译的实现等。具体内容如下: 1. 自顶向下语法分析 自顶向下语法分析是一种从语法的高层符号开始,逐步向下展开,直到推导出输入串的过程。它的主要思想是将输入串与语法规则进行匹配,从而得到语法树。自顶向下语法分析的方法包括了递归下降分析、LL分析和预测分析等。 2. 递归下降语法分析 递归下降语法分析是一种自顶向下语法分析的方法,它的主要思想是将每个非终结符对应的语法规则转化为一个对应的函数,然后通过递归调用这些函数来实现语法分析。递归下降语法分析的优点是易于理解和实现,但是它也存在一些问题,例如左递归和回溯等。 3. 预测翻译器的设计方法 预测翻译器是一种递归下降语法分析的方法,它的主要思想是通过预测下一个输入符号来选择相应的语法规则进行语法分析。预测翻译器的设计方法包括了FIRST集和FOLLOW集的计算、LL(1)文法的定义和使用等。 4. S-属性文法定义和使用 S-属性文法是一种语法制导翻译的方法,它的主要思想是将语法规则和属性相结合,通过对语法树的遍历来计算属性值。S-属性文法定义和使用包括了属性的定义、属性计算规则的定义、属性计算顺序的确定等。 5. 语法制导翻译的实现 语法制导翻译是一种将语法分析和语义分析相结合的方法,它的主要思想是通过对语法树的遍历来实现语义分析。语法制导翻译的实现包括了属性计算的方法、类型检查的方法、中间代码生成的方法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值