自下而上语法制导翻译过程

    语义变量和语义过程:

  • NEWTEMP: 它是一个函数过程, 每次调用时, 它都回送一个代表新临时变量名的整数码作为函数值. 临时变量名按产生顺序可想像为T1, T2, … 等等.
  • ENTRY(i): 它是一个函数过程. 它对i所代表的标识符查找符号表,并返回它在表中的入口.
  • E.PLACE: 它是和非终结符E相联系的语义变量,表示存放E值的变量名在符号表的入口或整数码(若此变量是一个临时变量).
  • GEN(op, ARG1, ARG2, RESULT): 它是一个语义过程, 该过程把四元式(op, ARG1, ARG2, RESULT)填进四元式表中.

    语义动作:

 

         产生式                                 语义动作

         (1)A→i:=E                           {GEN(:=, E.PLACE, ―, ENTRY(i)) }

         (2)E→E(1)+E(2)                 {E.PLACE:=NEWTEMP;

                                                    GEN(+, E(1).PLACE, E(2).PLACE, E.PLACE) }

        (3)E→E(1)*E(2)                  {E.PLACE:=NEWTEMP;

                                                    GEN(*, E(1).PLACE, E(2).PLACE, E.PLACE) }

        (4)E→―E(1)                        {E.PLACE:=NEWTEMP;

                                                    GEN(@, E(1).PLACE, ― , E.PLACE) }

        (5)E→(E(1))                         {E.PLACE := E(1).PLACE }

        (6)E→i                                 {E.PLACE := ENTRY(i) }

  自下而上分析产生中间代码的过程:

    举栗大于百言:分析  A:=-B*(C+D) 的过程 (见下表)

 

输入PLACE四元式
A:=-B*(C+D)     
:=-B*(C+D)iA 
-B*(C+D)i:=A_ 
B*(C+D)i:=-A_ _ 
*(C+D)i:=-iA_ _B 
*(C+D)i:=-EA_ _B(@,B,_,T1)
*(C+D)i:=EA_T1 
(C+D)i:=E*A_T1_ 
C+D)i:=E*(A_T1_ _ 
+D)i:=E*(iA_T1_ _C 
+D)i:=E*(EA_T1_ _C 
D)i:=E*(E+A_T1_ _C_ 
)i:=E*(E+iA_T1_ _C_D 
)i:=E*(E+EA_T1_ _C_D(+,C,D,T2)
)i:=E*(EA_T1_ _T2 
 i:=E*(E)A_T1_ _T2_ 
 i:=E*EA_T1_T2(*,T1,T2,T3)
 i:=EA_T3(:=,T3,_,A)
  A 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值