Lista 6

by Jerry Sky



Zadanie 2.

Jak wyglądałaby tablica priorytetów obliczona algorytmem dla gramatyki EE+EEEEEE/Eid 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. aLEADING(A)a \in \operatorname{LEADING}(A) jeśli mamy produkcję ABaβA \to B a \beta lub AaβA \to a \beta.
  2. Jeśli istnieje produkcja ABαA \to B \alpha oraz aLEADING(B)a \in \operatorname{LEADING}(B) to aLEADING(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 Ax1xkA \to x_1 \dots x_k:

  1. Jeśli xix_i i xi+1x_{i+1} są terminalami, to xixi+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 xixi+2x_i \doteq x_{i+2}
  3. Jeśli xix_i jest terminalem a xi+1x_{i+1} nieterminalem to dla każdego aLEADING(xi+1)a \in \operatorname{LEADING}(x_{i+1}) mamy xiax_i \lessdot a.
  4. Jeśli xix_i jest nieterminalem a xi+1x_{i+1} terminalem to dla każdego aTRAILING(xi)a \in \operatorname{TRAILING}(x_i) mamy axi+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