如何依据活前缀的DFA构造SLR分析表
第一步 各个符号和函数的意义
- s j s_j sj:进栈当前元素,再进栈状态 j j j(即当前状态变为状态 j j j)
- r j r_j rj:归约栈中已有的元素(当前元素暂时不处理),归约的依据为第 j j j条产生式
-
g
o
t
o
[
I
j
,
a
]
goto[I_j,a]
goto[Ij,a]:
- 定义:当前状态和当前元素到下一状态的映射
- 计算规则:如果有状态 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]
-
a
c
t
i
o
n
[
i
,
a
]
action[i,a]
action[i,a]:
- 定义:当前状态号和当前元素到应该采取的动作的映射
- 计算规则:依据·的位置讨论以下情形
- 如果 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状态)
- 如果 A → α ⋅ A\rightarrow\alpha· A→α⋅(即 ⋅ · ⋅ 恰好在产生式末尾),则 ∀ a ∈ F O L L O W ( A ) \forall a \in FOLLOW(A) ∀a∈FOLLOW(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→α的编号
- 如果 ( S ′ → S ⋅ ) ∈ I j (S'\rightarrow S·)\in I_j (S′→S⋅)∈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) |
---|---|---|
a | E | |
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同理