Lista 6

by Jerry Sky



Zadanie 2.

Jak wyglądałaby tablica priorytetów obliczona algorytmem dla gramatyki E→E+E∣E−E∣E∗E∣E/E∣id E \to E + E | E - E | E * E | E / E | id

«Gramatyki operatorowe»

Zbiory LEADING⁡\operatorname{LEADING} oraz TRAILING⁡\operatorname{TRAILING}

Standardowy algorytm dla danej produkcji AA (pierwsze terminale wyprowadzane z AA):

  1. a∈LEADING⁡(A)a \in \operatorname{LEADING}(A) jeśli mamy produkcję A→BaβA \to B a \beta lub A→aβA \to a \beta.
  2. Jeśli istnieje produkcja A→BαA \to B \alpha oraz a∈LEADING⁡(B)a \in \operatorname{LEADING}(B) to a∈LEADING⁡(A)a \in \operatorname{LEADING}(A).
  3. Dla wszystkich terminali wykonujemy powyższe podpunkty do momentu, kiedy nic się nie zmienia.

Analogicznie dla TRAILING⁡(A)\operatorname{TRAILING}(A) (ostatnie terminale wyprowadzane z AA).


Obliczanie relacji ⋖\lessdot, ≐\doteq oraz ⋗\gtrdot

Standardowy algorytm:
Dla każdej produkcji A→x1…xkA \to x_1 \dots x_k:

  1. Jeśli xix_i i xi+1x_{i+1} są terminalami, to xi≐xi+1x_i \doteq x_{i+1}.
  2. Jeśli xix_i i xi+2x_{i+2} są terminalami a xi+1x_{i+1} nieterminalem, to xi≐xi+2x_i \doteq x_{i+2}
  3. Jeśli xix_i jest terminalem a xi+1x_{i+1} nieterminalem to dla każdego a∈LEADING⁡(xi+1)a \in \operatorname{LEADING}(x_{i+1}) mamy xi⋖ax_i \lessdot a.
  4. Jeśli xix_i jest nieterminalem a xi+1x_{i+1} terminalem to dla każdego a∈TRAILING⁡(xi)a \in \operatorname{TRAILING}(x_i) mamy a⋗xi+1a \gtrdot x_{i+1}.

Widać już, że w naszym przypadku krok 3. i 4. będą generować przeciwne sobie reguły, jako, że mamy tylko jeden nieterminal EE.


Implementacja

W gramatyce jest tylko jeden nieterminal EE, więc stosując powyższe algorytmy na LEADING⁡\operatorname{LEADING} oraz TRAILING⁡\operatorname{TRAILING} mamy:

Brak sprecyzowanego pierwszeństwa prowadzi do konfliktów w tabelce.

Przykład: „++”:

++ −- ∗* // idid $\$
++ ⋗⋖\gtrdot \lessdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖\lessdot ⋗\gtrdot
−- ⋗⋖\gtrdot \lessdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖\lessdot ⋗\gtrdot
∗* ⋗⋖\gtrdot \lessdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖\lessdot ⋗\gtrdot
// ⋗⋖\gtrdot \lessdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖⋗\lessdot \gtrdot ⋖\lessdot ⋗\gtrdot
idid ⋗\gtrdot ⋗\gtrdot ⋗\gtrdot ⋗\gtrdot ⋗\gtrdot
$\$ ⋖\lessdot ⋖\lessdot ⋖\lessdot ⋖\lessdot ⋖\lessdot