Standardowa odpowiedź na pytanie, jak zbudować parser (które budują ASTs) jest czytać standardowe teksty na kompilacji. Kompilator "Dragon" Aho i Ullmana jest dość klasyczny. Jeśli nie masz cierpliwości, aby uzyskać najlepsze materiały referencyjne, będziesz miał więcej problemów, ponieważ dostarczają teorii i badają subtelności. Ale here is my answer dla osób w pośpiechu, budowanie parserów rekurencyjnych.
Można budować parsery z wbudowanym odzyskiwaniem po błędzie. Jest wiele artykułów na ten temat, gorący temat w latach osiemdziesiątych. Sprawdź Google Scholar, poluj na "naprawę błędów składni". Podstawową ideą jest to, że parser, napotykając błąd parsowania, przechodzi do jakiegoś znanego beacona (";" ogranicznik instrukcji jest dość popularny w językach podobnych do języka C, dlatego zostałeś poproszony o komentarz, jeśli twój język terminatory instrukcji) lub proponuje różne usuwanie lub wstawianie strumienia wejściowego w celu wspięcia się w punkcie błędu składni. Sama różnorodność takich programów jest zaskakująca. Kluczową ideą jest zazwyczaj uwzględnienie jak największej liczby punktów informacyjnych o numerze . Jedna z najbardziej intrygujących pomysłów, jakie kiedykolwiek widziałem, zawierała parsery, z których jeden prowadził N tokenów przed sobą, szukał min lądowych składni, a drugi parser naprawiał błędy karmy na podstawie dostępnych tokenów N, zanim napotkał błąd składni. Dzięki temu drugi parser może działać inaczej, zanim dojdzie do błędu składni. Jeśli tego nie zrobisz, większość analizatorów wyrzuci lewy kontekst i straci zdolność do naprawy. (Nigdy nie wprowadziły taki system.)
wybór rzeczy do wstawienia często mogą pochodzić z informacji wykorzystywanych do budowania parser (często Pierwszy i Śledź zestawy) w pierwszej kolejności. Jest to względnie łatwe w przypadku parserów L (AL) R, ponieważ tabele parse zawierają niezbędne informacje i są dostępne dla analizatora składni w punkcie, w którym napotkał błąd. Jeśli chcesz zrozumieć, jak to zrobić, musisz zrozumieć teorię (oops, znowu jest ta książka kompilatora), jak konstruuje się parsery. (Z powodzeniem wdrożyłem ten program kilka razy).
Bez względu na to, co robisz, naprawa błędów składniowych niewiele nie pomaga, ponieważ jest prawie niemożliwe, aby zgadnąć, co pisarz parsowanego dokumentu faktycznie zamierzał. Sugeruje to, że fantazyjne schematy nie będą naprawdę pomocne. Trzymam się prostych; ludzie są zadowoleni, gdy otrzymają raport o błędach i pewną półobjętą kontynuację parsowania.
Prawdziwym problemem z toczeniem własnego parsera dla prawdziwego języka jest to, że prawdziwe języki są nieprzyjemnymi bałaganem; ludzie budujący prawdziwe implementacje robią to źle i zamarzają w kamieniu ze względu na istniejące podstawy kodu, albo nalegają na zginanie/ulepszanie języka (standardy są dla żon, gadżety są dla marketingu), ponieważ jest cool. Spodziewaj się poświęcić wiele czasu na ponowną kalibrację, która według ciebie jest gramatyczna, wbrew prawdzie prawdziwego kodu. Zasadniczo, jeśli chcesz mieć działający parser, lepiej zdobyć taki, który ma zapis, a nie samodzielnie.
Lekcja dla większości ludzi, którzy są piekielnie zgięci, aby zbudować parser, nie jest, jest to, że jeśli chcą wszystko, co przydatne z wyników analizy lub drzewa, będą potrzebowali o wiele więcej podstawowych maszyn niż tylko parser. Sprawdź mój bio za "Life After Parsing".
AST zawsze dopuszczają błędy semantyczne, jest to błąd składniowy. – harold
Naprawiono typ błędu, o którym mowa. Dzięki) – Medvedev
Czy twój język ma sposób ograniczania wypowiedzi? –