Pok-7-wyk-Slajd23
Obsługa błędów – gramatyka
Język wejściowy jest językiem kontekstowym, więc nie da się go opisać gramatyką LL(1). Musimy zdefiniować gramatykę bezkontekstową opisującą szerszy język (zgodny z wyrażeniem regularnym a+b+c+), a następnie za pomocą akcji semantycznych sprawdzić, czy wejście jest poprawne.
Całe wejście (S) składa się z ciągu liter a (nieterminal A), ciągu liter b (nieterminal B) i ciągu liter c (nieterminal C). Nieterminale A, B i C mają atrybuty syntetyzowane len , w których będzie akumulowana długość ciągów poszczególnych liter. Po przetworzeniu całego wejścia porównywane są długości poszczególnych ciągów, jeśli są równe drukowany jest komunikat „OK”, jeśli są różne – komunikat „Error”.
Ciąg liter a (opisany nieterminalem A) składa się z pojedynczej litery a i reszty (RA). Rezultatem (atrybutem syntetyzowanym len symbolu A) będzie więc długość reszty (atrybutu length symbolu RA) powiększona o 1.
Reszta (RA) to albo litera a i dalszy ciąg reszty (RA1), albo napis pusty. W pierwszym przypadku rezultatem (atrybut length nieterminala RA) będzie długość reszty (atrybut length symbolu RA1) powiększona o 1, w drugim przypadku – bazowym – 0.
Nieterminale B (RB) i C (RC) mają (z dokładnością do rozpoznawanych znaków) identyczną definicję.