Parser LL(*)
Parser LL(*) to lewostronny parser z podglądem dowolnej liczby symboli.
Parsery lewostronne mają tę zaletę w porównaniu z prawostronnymi, że produkcje mogą być w naturalny sposób przestawione w kodzie jako funkcje rekurencyjne. Zwykle jednak wadą prostych parserów LL jest to, że mogą parsować mniejszą klasę języków niż parsery LR jak np. LALR. Dotyczy to parserów LL bez podglądu czy z podglądem jednego symbolu, jednak obecnie rozwijane są parsery LL(*) umożliwiające podgląd dowolnej ilości symboli w razie potrzeby. Taki parser użyty jest w narzędziu ANTLR.
Algorytm tworzenia parsera LL(*)
Dla zadanej gramatyki budujemy grafy ATN. W ten sposób że węzeł startowy grafu jest oznaczony nazwą symbolu nieterminalnego, przechodzi się do innego węzła poprzez krawędzie oznaczone symbolami terminalnymi, lub symbolami nieterminalnymi. Gdy używamy do przejścia symbolu nieterminalnego, wkładamy na stos docelowy węzeł grafu, i przechodzimy do sieci ATN dla tego symbolu nieterminalnego.
Przykładowa prosta gramatyka:
S->Ac
S->Ad
A->aA
A->b
Mamy dla niej dwie sieci ATN, po jednej dla każdego symbolu, dla S:
- i dla A:
DFA
Weźmy wejście: bc, czy mamy wybrać S->Ac czy S->Ad? To nie jest gramatyka LL(1).
Należy użyć predykcji. Tworzymy automat DFA w ten sposób że każdy jego stan jest zbiorem konfiguracji, gdzie konfiguracja to węzeł ATN, numer produkcji którą mamy wybrać w początkowym stanie oraz stos.
Wygląda to tak: [1]
Stan początkowy jest zbiorem wszystkich stanów ATNów osiągalnych ze stanu początkowego bez konsumpcji żadnego symbolu terminalnego, jedynie przez dojście do innych stanów ATN przez i odpowiednie symbole nieterminalne.
Na początku w mamy dwie początkowe konfiguracje oznaczone grubszą czcionką, dodajemy dla nich przejścia przez symbole nieterminalne A, więc stos z [] zmienia się na i i idziemy do drugiego ATN.
W ten sposób mamy zbiór konfiguracji.
Następnie podglądamy symbol b: z ostatnich konfiguracji w zbiorze możemy pójść przez b: z idziemy do a z idziemy do
Patrzymy, że nadal w zbiorze konfiguracji występują numery 1 i 2 numerów produkcji ze stanu bazowego predykcji. Czyli podglądamy jeszcze jeden symbol c i mamy już wybór produkcji numer 1, a dla d byłaby 2.
{Przypisy}
Przypisy
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.