我给出了以下语法:
S -> A a A b | B b B a
A -> epsilon
B -> epsilon
我知道很明显它是LL(1),但是我正面临构建解析表的麻烦..我逐字逐句地查找算法,找到每个非终端的第一个和后续行为,如果我是正确的我错了:
First(S) = {a,b}
First(A) = First(B) = epsilon
Follow(S) = {$}
Follow(A) = {a,b}
Follow(B) = {a,b}
当我构造解析表时,根据算法,我在$符号下发生了冲突......我到底做错了什么?
a b $
A A-> epsilon
B B-> epsilon
S S -> AaAb
S -> BbBa
如果我在$或者其他东西下获得2部作品,那该怎么办?或者我构建解析表错了?请帮助我是编译器课程的新手
答案 0 :(得分:4)
有一个小小的错误。算法如下龙书,
EndFragment fragment = new EndFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.addToBackStack(null)
.addSharedElement(imageView, imageTransitionName)
.addSharedElement(textView, textTransitionName)
.add(R.id.container, fragment)
.commit();
让我们一个接一个。
for each rule (S -> A):
for each terminal a in First(A):
add (S -> A) to M[S, a]
if First(A) contains empty:
for each terminal b in Follow(S):
add (S -> A) to M[S, b]
。在这里,S -> AaAb
。因此,请将First(AaAb) = {a}
添加到S -> AaAb
。M[S, a]
。在这里,S -> BbBa
。因此,请将First(BbBa) = {b}
添加到S -> BbBa
。M[S, b]
。在这里,A -> epsilon
。因此,请将Follow(A) = {a, b}
添加到A -> epsilon
和M[A, a]
。M[A, b]
。在这里,B -> epsilon
。因此,请将Follow(B) = {a, b}
添加到B -> epsilon
和M[B, a]
。