Po co rozdzielać leksowanie i parsowanie?


15

Możliwe jest parsowanie dokumentu za pomocą pojedynczego przejścia z automatu stanów. Jaka jest korzyść z dwóch przejść, tj. posiadanie leksera do konwersji tekstu na tokeny i parsera do testowania reguł produkcyjnych dla tych tokenów? Dlaczego nie mieć pojedynczego przejścia, które stosuje reguły produkcji bezpośrednio do tekstu?



2
Zostało to już omówione w CS, stackexchange, z wieloma bardzo technicznymi komentarzami w odpowiedzi na Ekspresyjną moc lexer + parser . Ale może być miejsce na dalsze odpowiedzi.
— babou

Zastanawiam się, czy paralelizm w stylu rurociągu (aczkolwiek wysoce niezrównoważone etapy) może być dodatkową zaletą. Interesujące może być także zachowanie instrukcji i pamięci podręcznej danych. O ile (jeśli w ogóle) takie skrócenie czasu kompilacji zależy od konkretnego sprzętu.
— Paul A. Clayton

Jednym z dość oczywistych (przynajmniej dla mnie) powodów jest to, że możesz wtedy używać skanera osobno. W praktyce często używam flex do skanowania danych wejściowych, ale rzadko potrzebuję pełnej mocy yacc.
— jamesqf

Odpowiedzi:


13

Nie musisz ich rozdzielać. Ludzie łączą je w parsery bez skanera .

Kluczową wadą parserów bez skanera wydaje się być to, że wynikowe gramatyki są raczej skomplikowane - bardziej skomplikowane niż odpowiednia kombinacja wyrażeń regularnych wykonujących leksykację i gramatyki bezkontekstowej wykonującej analizę w strumieniu tokena. W szczególności gramatyki do analizowania bez skanera mają tendencję do dwuznaczności. Łatwiej jest usunąć niejednoznaczność dla gramatyk pracujących na strumieniu tokenu.

Pragmatyczną zaletą korzystania z dedykowanej wstępnej fazy leksykalnej jest to, że nie łączysz kolejnego parsera ze szczegółami leksykalnymi. Jest to przydatne podczas wczesnego rozwoju języka programowania, gdy szczegóły leksykalne i składniowe wciąż się często zmieniają.


1
T.P.P.P.T.

@babou Tak, to prawda. Nie znam żadnych formalnych wyników wyrażenia regularnego złożonego z LL (k) wychodzi z LL (k) lub podobnego. Co więcej, leksykowanie zwykle nie odbywa się w zwykłych językach, ale w czymś mocniejszym, a mianowicie w zwykłych językach z najdłuższym dopasowaniem i priorytetami słów kluczowych. Nie jestem pewien, co to dokładnie jest klasa językowa i jakie są jej właściwości zamykające.
— Martin Berger

2
Jeśli twoje spojrzenie w przyszłość wymaga odczytania identyfikatora, kompozycja będzie wymagać nieograniczonego spojrzenia w przyszłość, ponieważ (w zasadzie) nie ma ograniczenia co do długości identyfikatorów.
— babou

@babou Nie jestem pewien. Jeśli najdłuższe słowo kluczowe ma długość 17 znaków, każdy dłuższy ciąg musi być identyfikatorem lub być niepoprawny leksykalnie.
— Martin Berger

Ale twój identyfikator, ewentualnie łańcuch, liczba lub inny literał, jest sekwencją złożoną z ponad 17 pojedynczych symboli, która może stać przed tokenem, którego faktycznie potrzebujesz. To wielkie spojrzenie w przyszłość, bez ograniczeń. Możesz skończyć z niedeterministycznym językiem.
— babou
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.