证明语法是LL(1)

时间:2015-03-09 19:21:47

标签: parsing compiler-construction computer-science lookahead

我给出了以下语法:

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部作品,那该怎么办?或者我构建解析表错了?请帮助我是编译器课程的新手

1 个答案:

答案 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 -> epsilonM[A, a]
  • M[A, b]。在这里,B -> epsilon。因此,请将Follow(B) = {a, b}添加到B -> epsilonM[B, a]