Програмски преводиоци 1/К2 2020 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Rešenje samo prvog zadatka zasad)
 
м (Ispravka da se u petoj smeni množi sa 10)
 
(3 међуизмене истог корисника нису приказане)
Ред 34: Ред 34:
# <id'> → <terminal> <id'>
# <id'> → <terminal> <id'>
#: SELECT(4) = FIRST(<terminal>) = {SLOVO, CIFRA}
#: SELECT(4) = FIRST(<terminal>) = {SLOVO, CIFRA}
# <id'> → E
# <id'> → ε
#: SELECT(5) = FOLLOW(<id'>) = FOLLOW(<id>) = FOLLOW(<element>) = FIRST(<lista'>) ∪ FOLLOW(<lista'>) = {","} ∪ FOLLOW(<lista>) = {",", ";"}
#: SELECT(5) = FOLLOW(<id'>) = FOLLOW(<id>) = FOLLOW(<element>) = FIRST(<lista'>) ∪ FOLLOW(<lista'>) = {","} ∪ FOLLOW(<lista>) = {",", ";"}
# <konstanta> → CIFRA <konstanta'>
# <konstanta> → CIFRA <konstanta'>
Ред 40: Ред 40:
# <konstanta'> → CIFRA <konstanta'>
# <konstanta'> → CIFRA <konstanta'>
#: SELECT(7) = {CIFRA}
#: SELECT(7) = {CIFRA}
# <konstanta'> → E
# <konstanta'> → ε
#: SELECT(8) = FOLLOW(<konstanta'>) = {",", ";"}
#: SELECT(8) = FOLLOW(<konstanta'>) = {",", ";"}
# <element> → <id>
# <element> → <id>
Ред 50: Ред 50:
# <lista'> → , <element> <lista'>
# <lista'> → , <element> <lista'>
#: SELECT(12) = {","}
#: SELECT(12) = {","}
# <lista'> → E
# <lista'> → ε
#: SELECT(13) = {";"}
#: SELECT(13) = {";"}
# <S> → <lista>;
# <S> → <lista>;
Ред 61: Ред 61:
# <id> → <id> <terminal>
# <id> → <id> <terminal>
# <id> → SLOVO
# <id> → SLOVO
# &lt;konstanta><sub>v</sub> → &lt;konstanta><sub>v1</sub> CIFRA<sub>v2</sub>
# &lt;konstanta><sub>v</sub> → &lt;konstanta><sub>v<sub>1</sub></sub> CIFRA<sub>v<sub>2</sub></sub>
#: v ← v1 + v2
#: <math>v \leftarrow 10v_1 + v_2</math>
# &lt;konstanta><sub>v</sub> → CIFRA<sub>v1</sub>
# &lt;konstanta><sub>v</sub> → CIFRA<sub>v<sub>1</sub></sub>
#: v ← v1
#: <math>v \leftarrow v_1</math>
# &lt;element><sub>v</sub> → &lt;id>
# &lt;element><sub>v</sub> → &lt;id>
#: v 0
#: <math>v \leftarrow 0</math>
# &lt;element><sub>v</sub> → &lt;konstanta><sub>v1</sub>
# &lt;element><sub>v</sub> → &lt;konstanta><sub>v<sub>1</sub></sub>
#: v ← v1
#: <math>v \leftarrow v_1</math>
# &lt;lista><sub>v</sub> → &lt;lista><sub>v1</sub>, &lt;element><sub>v2</sub>
# &lt;lista><sub>v</sub> → &lt;lista><sub>v<sub>1</sub></sub>, &lt;element><sub>v<sub>2</sub></sub>
#: v ← v1 + v2
#: <math>v \leftarrow v_1 + v_2</math>
# &lt;lista><sub>v</sub> → &lt;element><sub>v1</sub>
# &lt;lista><sub>v</sub> → &lt;element><sub>v<sub>1</sub></sub>
#: v ← v1
#: <math>v \leftarrow v_1</math>
# &lt;S><sub>v</sub> → &lt;lista><sub>v1</sub>;
# &lt;S><sub>v</sub> → &lt;lista><sub>v<sub>1</sub></sub>;
#: v ← v1
#: <math>v \leftarrow v_1</math>


== 2. zadatak ==
== 2. zadatak ==
Ред 82: Ред 82:
# &lt;A> → c &lt;B>
# &lt;A> → c &lt;B>
# &lt;B> → f &lt;S> c
# &lt;B> → f &lt;S> c
# &lt;B> → Ɛ
# &lt;B> → ε
<div class="abc-list">
<div class="abc-list">
# Da li se sekvenca <code>fcffcfcf</code> može prepoznati opisanom gramatikom? Prikazati postupak.
# Da li se sekvenca <code>fcffcfcf</code> može prepoznati opisanom gramatikom? Prikazati postupak.
Ред 90: Ред 90:


=== Rešenje ===
=== Rešenje ===
<gallery widths="500" heights="500" class="transparent-svg">
  PPR K2 2020 zadatak 2 stavka a.svg | Stablo izraza u stavci pod a.
  PPR K2 2020 zadatak 2 stavka b.svg | Karakteristični automat u stavci pod b.
</gallery>
{| class="wikitable"
|+ Kontrolna tabela LR(0) parsera
! Stanje
! Operacija
|-
| ∇                  || SHIFT
|-
| &lt;S><sub>0</sub> || SHIFT
|-
| ─┤<sub>0</sub>    || ACCEPT
|-
| f<sub>11</sub>    || SHIFT
|-
| &lt;A><sub>1</sub> || SHIFT
|-
| f<sub>12</sub>    || REDUCE(1)
|-
| c<sub>2</sub>      || '''S/R konflikt'''
|-
| &lt;B><sub>2</sub> || REDUCE(2)
|-
| f<sub>3</sub>      || SHIFT
|-
| &lt;S><sub>3</sub> || SHIFT
|-
| c<sub>3</sub>      || REDUCE(3)
|}
FOLLOW skupovi ove gramatike su:
* FOLLOW(&lt;S>) = {─┤, c}
* FOLLOW(&lt;A>) = {f}
* FOLLOW(&lt;B>) = {f}
{| class="wikitable"
|+ Kontrolna tabela SLR(1) parsera
! Stanje            !! c        !! f        !! ─┤
|-
| ∇                  ||          || SHIFT    ||
|-
| &lt;S><sub>0</sub> ||          ||          || SHIFT
|-
| ─┤<sub>0</sub>    ||          ||          || ACCEPT
|-
| f<sub>11</sub>    || SHIFT    ||          ||
|-
| &lt;A><sub>1</sub> ||          || SHIFT    ||
|-
| f<sub>12</sub>    || REDUCE(1) ||          || REDUCE(1)
|-
| c<sub>2</sub>      ||          || '''S/R konflikt''' ||
|-
| &lt;B><sub>2</sub> ||          || REDUCE(2) ||
|-
| f<sub>3</sub>      ||          || SHIFT    ||
|-
| &lt;S><sub>3</sub> || SHIFT    ||          ||
|-
| c<sub>3</sub>      ||          || REDUCE(3) ||
|}


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:Програмски преводиоци 1]]
[[Категорија:Програмски преводиоци 1]]

Тренутна верзија на датум 3. децембар 2022. у 15:00

Drugi kolokvijum 2020. godine održan je 22. januara 2021. godine, zbog neodržavanja druge kolokvijumske nedelje u regularnom terminu. Postavka ovog roka je dostupna sa stranice predmeta (arhiva).

1. zadatak

Postavka

Posmatra se lista od jednog ili više identifikatora ili celobrojnih konstanti, razdvojenih zarezima, pri čemu se na kraju koristi ";". Ulazni simboli su SLOVO, CIFRA, "," i ";". Identifikatori počinju slovom, a u nastavku imaju nula ili više slova ili cifara. Konstante sadrže samo cifre, mogu počinjati nulom. Primer ispravne liste: 1, a, tt20r, 120;

  1. Napisati gramatiku (u kojoj repetitivne konstrukcije treba da budu predstavljene levo rekurzivnim smenama) za opisane liste. Terminalni simboli su SLOVO, CIFRA, "," i ";". Gramatika ne sme biti dvosmislena.
  2. Transformisati gramatiku iza tačke a) u LL(1) gramatiku, primenom standarnih transformacija. Izračunati selekcione skupove i proveriti da li je dobijena gramatika LL(1).
  3. Dodati u gramatiku iz tačke a) atribute kojima se računa vrednost svake od konstanti koje se pojavljuju u ulaznoj listi, a takođe i zbir vrednosti svih konstanti u listi. Napomena: akcione simbole ne uvoditi, nisu potrebni.

Rešenje

Gramatika tražena u stavci pod a može da glasi ovako:

  1. <terminal> → SLOVO
  2. <terminal> → CIFRA
  3. <id> → <id> <terminal>
  4. <id> → SLOVO
  5. <konstanta> → <konstanta> CIFRA
  6. <konstanta> → CIFRA
  7. <element> → <id>
  8. <element> → <konstanta>
  9. <lista> → <lista>, <element>
  10. <lista> → <element>
  11. <S> → <lista>;

Transformisana LL(1) gramatika sa selekcionim skupovima može da izgleda ovako:

  1. <terminal> → SLOVO
    SELECT(1) = {SLOVO}
  2. <terminal> → CIFRA
    SELECT(2) = {CIFRA}
  3. <id> → SLOVO <id'>
    SELECT(3) = {SLOVO}
  4. <id'> → <terminal> <id'>
    SELECT(4) = FIRST(<terminal>) = {SLOVO, CIFRA}
  5. <id'> → ε
    SELECT(5) = FOLLOW(<id'>) = FOLLOW(<id>) = FOLLOW(<element>) = FIRST(<lista'>) ∪ FOLLOW(<lista'>) = {","} ∪ FOLLOW(<lista>) = {",", ";"}
  6. <konstanta> → CIFRA <konstanta'>
    SELECT(6) = {CIFRA}
  7. <konstanta'> → CIFRA <konstanta'>
    SELECT(7) = {CIFRA}
  8. <konstanta'> → ε
    SELECT(8) = FOLLOW(<konstanta'>) = {",", ";"}
  9. <element> → <id>
    SELECT(9) = {SLOVO}
  10. <element> → <konstanta>
    SELECT(10) = {CIFRA}
  11. <lista> → <element> <lista'>
    SELECT(11) = FIRST(<element>) = {SLOVO, CIFRA}
  12. <lista'> → , <element> <lista'>
    SELECT(12) = {","}
  13. <lista'> → ε
    SELECT(13) = {";"}
  14. <S> → <lista>;
    SELECT(14) = FIRST(<lista>) = FIRST(<element>) = {SLOVO, CIFRA}

Zbog toga što se ni za jednu smenu ne preklapaju SELECT skupovi, ovo je LL(1) gramatika.

Atributivno-translaciona gramatika sa pomenutim atributima bi, zato, mogla da izgleda ovako:

  1. <terminal> → SLOVO
  2. <terminal> → CIFRA
  3. <id> → <id> <terminal>
  4. <id> → SLOVO
  5. <konstanta>v → <konstanta>v1 CIFRAv2
  6. <konstanta>v → CIFRAv1
  7. <element>v → <id>
  8. <element>v → <konstanta>v1
  9. <lista>v → <lista>v1, <element>v2
  10. <lista>v → <element>v1
  11. <S>v → <lista>v1;

2. zadatak

Postavka

Data je gramatika:

  1. <S> → f <A> f
  2. <A> → c <B>
  3. <B> → f <S> c
  4. <B> → ε
  1. Da li se sekvenca fcffcfcf može prepoznati opisanom gramatikom? Prikazati postupak.
  2. Nacrtati karakteristični automat i kontrolnu tabelu LR(0) parsera (potisnu ne crtati).
  3. Prikazati kontrolnu tabelu SLR(1) parsera. Da li postoje konflikti?

Rešenje

Kontrolna tabela LR(0) parsera
Stanje Operacija
SHIFT
<S>0 SHIFT
─┤0 ACCEPT
f11 SHIFT
<A>1 SHIFT
f12 REDUCE(1)
c2 S/R konflikt
<B>2 REDUCE(2)
f3 SHIFT
<S>3 SHIFT
c3 REDUCE(3)

FOLLOW skupovi ove gramatike su:

  • FOLLOW(<S>) = {─┤, c}
  • FOLLOW(<A>) = {f}
  • FOLLOW(<B>) = {f}
Kontrolna tabela SLR(1) parsera
Stanje c f ─┤
SHIFT
<S>0 SHIFT
─┤0 ACCEPT
f11 SHIFT
<A>1 SHIFT
f12 REDUCE(1) REDUCE(1)
c2 S/R konflikt
<B>2 REDUCE(2)
f3 SHIFT
<S>3 SHIFT
c3 REDUCE(3)