Algorytmy parsingu
Teoria automatów i języków formalnych
Dr inŜ. Janusz Majewski Katedra Informatyki
Metody rozbioru gramatycznego
Problem rozbioru gramatycznego jest próbą odpowiedzi na pytanie:
„czy dany ciąg symboli terminalnych jest słowem naleŜącym do języka L(G) generowanego przez daną gramatykę?”. Istota postępowania jest następująca: jeśli dla danego słowa moŜna zbudować drzewo rozbioru w danej gramatyce, to słowo to naleŜy do języka generowanego przez gramatykę, jeśli zaś dla badanego słowa nie moŜna zbudować drzewa rozbioru, wówczas słowo nie naleŜy do języka. W zaleŜności od strategii budowania drzewa rozbioru stosujemy jeden z dwóch algorytmów:
• algorytm wyprowadzający „top-down” (budujemy drzewo w kolejności: od korzenia ku liściom, odtwarzając wyprowadzenie lewostronne)
• algorytm redukujący „bottom-up” (budujemy drzewo w odwrotnej kolejności: od liści ku korzeniowi, odtwarzając wyprowadzenie prawostronne)
RozwaŜany ciąg symboli badany jest zawsze od lewej strony, w tym sensie oba algorytmy są lewostronne.
Przykład
Przykład:
Gramatyka:
E → E + T | T T → T * F | F F → (E) | id Analizowane
słowo:
id + id * id
E
E + T T T +
T F + id + T
T * F id + id + F * F id + id * F id + id * id
wywód lewostronny
od lewej do prawej
Top-down
E F + T +
T * F E + id + id * id
wywód prawostronny
od lewej do prawej
Bottom-up
id * id id * id + id * id E + F * id E + T * id
E + T E E
E + T T T * F F
id F id
id
kierunek analizy
Metoda „top-down”
Symbol początkowy
gramatyki Analizowane słowo
Rozpoczynamy od symbolu wyróŜnionego gramatyki. W kaŜdym kroku najbardziej lewy symbol nieterminalny zastępujemy prawą stroną jakiejś produkcji. Jeśli w wyniku kolejnego kroku otrzymamy symbol terminalny, to sprawdzamy, czy jest on identyczny z odpowiednim symbolem
analizowanego słowa. Jeśli nie, to moŜemy „cofnąć się” i spróbować od nowa, korzystając w ponownym wyprowadzeniu z jakiejś innej produkcji (lub innych produkcji). Byłby to algorytm z powrotami (mało efektywny).
Wynik: akceptacja słowa lub odrzucenie w wyniku przebadania wszystkich moŜliwości.
Problem: „jak uniknąć konieczności powrotów” moŜe być pozytywnie i jednoznacznie rozstrzygnięty dla pewnej klasy gramatyk bezkontekstowych zwanych gramatykami LL(k). „Top-down” odtwarza wyprowadzenie
lewostronne.
Metoda „bottom-up”
Analizując słowo od lewej strony bierzemy symbol bądź grupę symboli i zastępujemy ją lewą stroną jakiejś odpowiedniej produkcji. Postępujemy tak długo, aŜ dojdziemy do symbolu wyróŜnionego gramatyki, co jest
równoznaczne z akceptacją słowa. W kaŜdym kroku powinna być
redukowana osnowa, czyli najbardziej na lewo połoŜona fraza prosta. TakŜe w tej metodzie moŜliwe jest postępowanie z powrotami.
Problem: „jak znaleźć osnowę nie mając jeszcze drzewa rozbioru
syntaktycznego i czym ją zastąpić” moŜe być pozytywnie i jednoznacznie rozstrzygnięty dla pewnych klas gramatyk bezkontekstowych: gramatyk precedencyjnych, czy tzw. gramatyk LR(k). „Bottom-up” odtwarza wyprowadzenie prawostronne.