Teoria kompilacji i kompilatory (2016/17)

Zadanie 1

Podać definicję gramatyki LL(1).

Niech:

ω,x,yΣβ,γ(VE)AV\omega, x, y \in \Sigma^* \\ \beta, \gamma \in (V \cup E)^* \\ A \in V

G=<V,Σ,P,S>GBKG=<V, \Sigma, P, S> \in G_{BK} jest klasy LL(1) \Leftrightarrow dla każdej pary wywodów lewostronnych:

  1. SLωAαLωβαLωxS\Rightarrow^*_L\omega A\alpha\Rightarrow_L\omega\beta\alpha\Rightarrow^*_L\omega x
  2. SLωAαLωγαLωyS\Rightarrow^*_L\omega A\alpha\Rightarrow_L\omega\gamma\alpha\Rightarrow^*_L\omega y

jeżeli FIRST1(x) = FIRST1(y) to β=γ\beta=\gamma

Nieformalnie: Gramatyka LL(1) w wywodzie lewostronnym ma własność taką, że zawsze pierwszy symbol słowa końcowego w sposób jednoznaczny określa regułę (produkcję), jaką należy zastosować.

Zadanie 2

Dla gramatyki:

SS@  LLa[S]  aS \rightarrow S@\ |\ L \\ L \rightarrow a[S]\ |\ a

zbudować tablicę parsera LL(1) i sprawdzić, czy ciąg a[a@]@a[a@]@ należy do gramatyki.

Podpowiedź: być może z tą gramatyką coś najpierw trzeba zrobić.

  1. Usunięcie lewostronnej rekursji

    SLSS@S  ϵLa[S]  aS \rightarrow LS' \\ S' \rightarrow @S'\ |\ \epsilon \\ L \rightarrow a[S]\ |\ a

  2. Usunięcie lewostronnej faktoryzacji

    SLSS@S  ϵLaLL[S]  ϵS \rightarrow LS' \\ S' \rightarrow @S'\ |\ \epsilon \\ L \rightarrow aL' \\ L' \rightarrow [S]\ |\ \epsilon

  3. Wyznaczenie zbiorów FIRST i FOLLOW

    FIRST FOLLOW
    SS a $, ]
    SS' @, ϵ\epsilon $, ]
    LL a @, $, ]
    LL' [, ϵ\epsilon @, $, ]
  4. Tworzenie tablicy parsera

    1. SLSS \rightarrow LS'
    2. S@SS' \rightarrow @S'
    3. LaLL \rightarrow aL'
    4. L[S]L' \rightarrow [S]
    5. SϵS' \rightarrow \epsilon
    6. LϵL' \rightarrow \epsilon
    a @ [ ] $
    SS LSLS' - 1
    SS' @S@S' - 2 ϵ\epsilon - 5 ϵ\epsilon - 5
    LL aLaL' - 3
    LL' ϵ\epsilon - 6 [S][S] - 4 ϵ\epsilon - 6 ϵ\epsilon - 6
  5. Sprawdzenie ciągu a[a@]@a[a@]@

    stos symbole produkcje
    #S a[a@]@$ ϵ\epsilon
    #S'L a[a@]@$ 1
    #S'L'a a[a@]@$ 1, 3
    #S'L' [a@]@$ 1, 3
    #S']S[ [a@]@$ 1, 3, 4
    #S']S a@]@$ 1, 3, 4
    #S']S'L a@]@$ 1, 3, 4, 1
    #S']S'L'a a@]@$ 1, 3, 4, 1, 3
    #S']S'L' @]@$ 1, 3, 4, 1, 3
    #S']S' @]@$ 1, 3, 4, 1, 3, 6
    #S']S'@ @]@$ 1, 3, 4, 1, 3, 6, 2
    #S']S' ]@$ 1, 3, 4, 1, 3, 6, 2
    #S'] ]@$ 1, 3, 4, 1, 3, 6, 2, 5
    #S' @$ 1, 3, 4, 1, 3, 6, 2, 5
    #S'@ @$ 1, 3, 4, 1, 3, 6, 2, 5, 2
    #S' $ 1, 3, 4, 1, 3, 6, 2, 5, 2
    # $ 1, 3, 4, 1, 3, 6, 2, 5, 2, 5

    Zadany ciąg należy do tej gramatyki.

Zadanie 3

Mamy daną gramatykę i zbudowaną tablicę parsera SLR(1). Mamy sprawdzić tylko, czy zadany ciąg należy do tej gramatyki.

SASSbAaBBaBBbS \rightarrow AS \\ S \rightarrow b \\ A \rightarrow aB \\ B \rightarrow aB \\ B \rightarrow b

a b # S A B
0 s2 s3 r1 1 1
1 s2 s3 acc 4 1
2 s5 s3 4
3 r5 r5 r2
4 r3 r3 r1
5 s5 s3 6
6 r4 r4

Ciąg do sprawdzenia: abaabb#abaabb\#

stos symbole wejście akcja
0 abaabb# przesunięcie
0 2 a baabb# przesunięcie
0 2 3 ab aabb# redukcja BbB \rightarrow b
0 2 4 aB aabb# redukcja AaBA \rightarrow aB
0 1 A aabb# przesunięcie
0 1 2 Aa abb# przesunięcie
0 1 2 5 Aaa bb# przesunięcie
0 1 2 5 3 Aaab b# redukcja BbB \rightarrow b
0 1 2 5 6 AaaB b# redukcja BaBB \rightarrow aB
0 1 2 4 AaB b# redukcja AaBA \rightarrow aB
0 1 1 AA b# przesunięcie
0 1 1 3 AAb # redukcja SbS \rightarrow b
0 1 1 4 AAS # redukcja SASS \rightarrow AS
0 1 4 AS # redukcja SASS \rightarrow AS
0 S # akceptacja

Zadany ciąg należy do tej gramatyki.