Analiza leksykalna w projekcie kompilatora z przykładem

Spisie treści:

Anonim

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-

  1. „Pobierz następny token” to polecenie wysyłane z parsera do analizatora leksykalnego.
  2. Po otrzymaniu tego polecenia analizator leksykalny skanuje dane wejściowe, dopóki nie znajdzie następnego tokenu.
  3. 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

#include int 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