如何依据活前缀的DFA构造SLR分析表——编译原理

如何依据活前缀的DFA构造SLR分析表

第一步 各个符号和函数的意义

  1. s j s_j sj:进栈当前元素,再进栈状态 j j j(即当前状态变为状态 j j j
  2. r j r_j rj:归约栈中已有的元素(当前元素暂时不处理),归约的依据为 j j j产生式
  3. g o t o [ I j , a ] goto[I_j,a] goto[Ij,a]
    1. 定义:当前状态和当前元素到下一状态的映射
    2. 计算规则:如果有状态 q q q遇到 a a a之后转换为状态 p p p,说明 I p = g o t o [ I q , a ] I_p = goto[I_q,a] Ip=goto[Iq,a]
  4. a c t i o n [ i , a ] action[i,a] action[i,a]
    1. 定义:当前状态号和当前元素到应该采取的动作的映射
    2. 计算规则:依据·的位置讨论以下情形
      1. 如果 A → α ⋅ a β A\rightarrow \alpha·a\beta Aαaβ(即 ⋅ · 恰好在某个终结符a之前),且 g o t o [ I i , a ] = I j goto[I_i,a] = I_j goto[Ii,a]=Ij(此时 a a a恰好能够推动状态转换),则 a c t i o n [ i , a ] = j action[i,a]=j action[i,a]=j(表示 i i i状态在遇到终结符 a a a之后转换为 j j j状态)
      2. 如果 A → α ⋅ A\rightarrow\alpha· Aα(即 ⋅ · 恰好在产生式末尾),则 ∀ a ∈ F O L L O W ( A ) \forall a \in FOLLOW(A) aFOLLOW(A) a c t i o n [ i , a ] = r j action[i,a]=r_j action[i,a]=rj(即判断出在a移进之前要先处理栈内的元素才能保证处理的正确性),其中 j j j为产生式 A → α A\rightarrow\alpha Aα的编号
      3. 如果 ( S ′ → S ⋅ ) ∈ I j (S'\rightarrow S·)\in I_j (SS)Ij(即 ⋅ · 所在的位置标志着最终完成),得出 a c t i o n [ j , d o l l a r ] = a c c action[j,dollar] = acc action[j,dollar]=acc

第二步 构造SLR分析表

根据上述方法计算 g o t o goto goto函数和 a c t i o n action action函数的所有值,将这些值填入如下所示的表格中

状态动作(action)转移(goto)
aE
0 s i s_i si r q r_q rq
1 r j r_j rj a c c acc acc
⋮ \vdots ⋮ \vdots ⋮ \vdots

注:上图仅为示例,其中 a c t i o n [ i , a ] action[i,a] action[i,a]填入表的 a c t i o n action action部分的状态 i i i行元素 a a a列, g o t o goto goto同理

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值