Pok-11-wyk-Slajd26
Gramatyka niejednoznaczna – operatory bez wiązania
W celu określenia, że jakiś operator nie ma wiązania używamy słowa kluczowego % nonassoc . Wiązania nie ma np. operator porównania (=) w języku Pascal (podobnie jest np. w Fortranie z . EQ .).
Brak wiązania oznacza, że można konstruować wyrażenie o postaci: a = b
ale nie: a = b = c
które należy zapisać np. jako ( a = b ) = c .
W celu wprowadzenia do gramatyki operatora porównania, który nie ma mieć wiązania używamy deklaracji:
%nonassoc ‘=‘
i zazwyczaj nadajemy mu niski priorytet po to, aby w wyrażeniach typu:
(a + b) = (c + d)
można było opuścić nawiasy.
Dodajemy również produkcję E : E ‘=‘ E i kojarzymy z nią odpowiednie akcje semantyczne. Konieczne jest oczywiście również odpowiednie rozszerzenie analizatora leksykalnego.
W niektórych językach operator porównania jest łączny. Np. język C dopuszcza konstrukcję:
0 == 3 == 0 (natomiast bardzo specyficzna jest jej semantyka – ten warunek jest prawdziwy !).
Ciekawy jest fakt, że z technicznego punktu widzenia % nonassoc nie rozstrzyga konfliktu przesuń/redukuj. Skoro operator ‘=‘ nie ma mieć łączności, to sytuacja E –> E '=' E . '=', to po prostu błąd składniowy.