Co to jest analiza leksykalna?
ANALIZA LEKSYCZNA to pierwsza faza projektowania kompilatora. Lexer pobiera zmodyfikowany kod źródłowy, który jest zapisany w formie zdań. Innymi słowy, pomaga przekształcić sekwencję znaków w sekwencję tokenów. Analizator leksykalny dzieli tę składnię na serię tokenów. Usuwa wszelkie dodatkowe spacje lub komentarze zapisane w kodzie źródłowym.
Programy, które wykonują analizę leksykalną, nazywane są analizatorami leksykalnymi lub leksykami. Lekser zawiera tokenizer lub skaner. Jeśli analizator leksykalny wykryje, że token jest nieprawidłowy, generuje błąd. Odczytuje strumienie znaków z kodu źródłowego, sprawdza legalne tokeny i przekazuje dane do analizatora składni, gdy tego wymaga.
Przykład
How Pleasant Is The Weather?
Zobacz ten przykład; Tutaj możemy łatwo rozpoznać, że istnieje pięć słów How Pleasant, The, Weather, Is. Jest to dla nas bardzo naturalne, ponieważ możemy rozpoznać separatory, spacje i symbole interpunkcyjne.
HowPl easantIs Th ewe ather?
Teraz spójrz na ten przykład, możemy to również przeczytać. Jednak zajmie to trochę czasu, ponieważ separatory są umieszczane w dziwnych miejscach. To nie jest coś, co przychodzi do ciebie natychmiast.
W tym samouczku dowiesz się
- Podstawowe terminologie:
- Architektura analizatora leksykalnego: jak są rozpoznawane tokeny
- Role analizatora leksykalnego
- Błędy leksykalne
- Odzyskiwanie błędów w Analizatorze leksykalnym
- Analizator leksykalny a Parser
- Po co oddzielać leksykal i parser?
- Zalety analizy leksykalnej
- Wada analizy leksykalnej
Podstawowe terminologie
Co to jest leksem?
Leksem to sekwencja znaków, które są zawarte w programie źródłowym zgodnie z pasującym wzorcem tokenu. To nic innego jak instancja tokena.
Co to jest token?
Token to sekwencja znaków, która reprezentuje jednostkę informacji w programie źródłowym.
Co to jest wzór?
Wzorzec to opis używany przez token. W przypadku słowa kluczowego używanego jako token, wzorzec jest ciągiem znaków.
Architektura analizatora leksykalnego: jak są rozpoznawane tokeny
Głównym zadaniem analizy leksykalnej jest odczytywanie znaków wejściowych w kodzie i tworzenie tokenów.
Analizator leksykalny skanuje cały kod źródłowy programu. Identyfikuje każdy token jeden po drugim. Skanery są zwykle implementowane w celu tworzenia tokenów tylko na żądanie parsera. Oto jak to działa-
- „Pobierz następny token” to polecenie wysyłane z parsera do analizatora leksykalnego.
- Po otrzymaniu tego polecenia analizator leksykalny skanuje dane wejściowe, dopóki nie znajdzie następnego tokenu.
- Zwraca token do Parsera.
Analizator leksykalny pomija spacje i komentarze podczas tworzenia tych tokenów. Jeśli wystąpi jakikolwiek błąd, analizator leksykalny skoreluje ten błąd z plikiem źródłowym i numerem wiersza.
Role analizatora leksykalnego
Analizator leksykalny wykonuje poniższe zadania:
- Pomaga zidentyfikować token w tablicy symboli
- Usuwa spacje i komentarze z programu źródłowego
- Koreluje komunikaty o błędach z programem źródłowym
- Pomaga rozwinąć makra, jeśli zostaną znalezione w programie źródłowym
- Odczytaj znaki wejściowe z programu źródłowego
Przykład analizy leksykalnej, tokeny, nie-tokeny
Rozważmy następujący kod, który jest przekazywany do programu Lexical Analyzer
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Przykłady utworzonych tokenów
Lexeme | Znak |
int | Słowo kluczowe |
maksymalny | Identyfikator |
( | Operator |
int | Słowo kluczowe |
x | Identyfikator |
, | Operator |
int | Słowo kluczowe |
Y | Identyfikator |
) | Operator |
{ | Operator |
Gdyby | Słowo kluczowe |
Przykłady Nontokens
Rodzaj | Przykłady |
Komentarz | // To porówna 2 liczby |
Dyrektywa preprocesora | #include |
Dyrektywa preprocesora | # zdefiniować NUMS 8,9 |
Makro | NUMS |
Biała przestrzeń | / n / b / t |
Błędy leksykalne
Ciąg znaków, którego nie można zeskanować do żadnego ważnego tokena, jest błędem leksykalnym. Ważne fakty dotyczące błędu leksykalnego:
- Błędy leksykalne nie są zbyt częste, ale powinny być obsługiwane przez skaner
- Błędna pisownia identyfikatorów, operatorów, słów kluczowych uważana jest za błędy leksykalne
- Generalnie błąd leksykalny jest spowodowany pojawieniem się jakiegoś niedozwolonego znaku, głównie na początku tokena.
Odzyskiwanie błędów w Analizatorze leksykalnym
Oto kilka najczęstszych technik usuwania błędów:
- Usuwa jeden znak z pozostałych danych wejściowych
- W trybie paniki kolejne postacie są zawsze ignorowane, dopóki nie dotrzemy do dobrze uformowanego żetonu
- Wstawiając brakujący znak do pozostałych danych wejściowych
- Zastąp znak innym znakiem
- Transponuj dwa znaki seryjne
Analizator leksykalny a Parser
Analizator leksykalny | Parser |
Program wejściowy skanowania | Przeprowadź analizę składni |
Zidentyfikuj tokeny | Utwórz abstrakcyjną reprezentację kodu |
Wstaw żetony do tablicy symboli | Zaktualizuj wpisy w tablicy symboli |
Generuje błędy leksykalne | Generuje drzewo parsowania kodu źródłowego |
Po co oddzielać leksykal i parser?
- Prostota projektu: Ułatwia proces analizy leksykalnej i analizy składni poprzez eliminację niechcianych tokenów
- Aby poprawić wydajność kompilatora: Pomaga poprawić wydajność kompilatora
- Specjalizacja: można zastosować specjalistyczne techniki w celu usprawnienia procesu analizy leksykalnej
- Przenośność: tylko skaner wymaga komunikacji ze światem zewnętrznym
- Większa przenośność: cechy specyficzne dla urządzenia wejściowego ograniczone do leksera
Zalety analizy leksykalnej
- Metoda analizatora leksykalnego jest używana przez programy takie jak kompilatory, które mogą używać przeanalizowanych danych z kodu programisty do utworzenia skompilowanego binarnego kodu wykonywalnego
- Jest używany przez przeglądarki internetowe do formatowania i wyświetlania strony internetowej za pomocą przeanalizowanych danych z JavsScript, HTML, CSS
- Oddzielny analizator leksykalny pomaga skonstruować wyspecjalizowany i potencjalnie bardziej wydajny procesor do tego zadania
Wada analizy leksykalnej
- Musisz poświęcić sporo czasu na przeczytanie programu źródłowego i podzielenie go na partycje w postaci tokenów
- Niektóre wyrażenia regularne są dość trudne do zrozumienia w porównaniu z regułami PEG lub EBNF
- Potrzeba więcej wysiłku, aby opracować i debugować leksera i jego opisy tokenów
- Aby wygenerować tabele lexer i skonstruować tokeny, wymagane jest dodatkowe obciążenie środowiska uruchomieniowego
Podsumowanie
- Analiza leksykalna to pierwsza faza projektowania kompilatora
- Leksem to sekwencja znaków, które są zawarte w programie źródłowym zgodnie z pasującym wzorcem tokenu
- Analizator leksykalny służy do skanowania całego kodu źródłowego programu
- Analizator leksykalny pomaga zidentyfikować token w tablicy symboli
- Ciąg znaków, którego nie można zeskanować do żadnego ważnego tokena, jest błędem leksykalnym
- Usuwa jeden znak z pozostałych danych wejściowych jest przydatna Metoda odzyskiwania po błędzie
- Analizator leksykalny skanuje program wejściowy, podczas gdy parser przeprowadza analizę składni
- Ułatwia proces analizy leksykalnej i analizy składni poprzez eliminację niechcianych tokenów
- Analizator leksykalny jest używany przez przeglądarki internetowe do formatowania i wyświetlania strony internetowej za pomocą przeanalizowanych danych z JavsScript, HTML, CSS
- Największą wadą korzystania z analizatora leksykalnego jest to, że do wygenerowania tabel leksera i skonstruowania tokenów wymagane jest dodatkowe obciążenie środowiska uruchomieniowego