Analiza leksykalna (analizator) w projektowaniu kompilatora z przykładem

⚡ Inteligentne podsumowanie

Analiza leksykalna to pierwszy etap projektowania kompilatora, w którym lekser konwertuje strumień znaków źródłowych na zrozumiałe tokeny. Usuwa spacje i komentarze, rejestruje tokeny w tabeli symboli i zgłasza błędy leksykalne do parsera.

  • 🔤 Pierwsza faza kompilatora: Analiza leksykalna odczytuje znaki źródłowe i przekształca je w sekwencję tokenów.
  • 🧩 Kluczowe terminy: Leksem to dopasowana sekwencja znaków, token to jej kategoria, a wzorzec definiuje regułę.
  • 🏗️. Jak To Działa: Parser żąda „pobierz następny token”, a skaner zwraca tokeny na żądanie.
  • 🧹 Rola sprzątania: Analizator leksykalny usuwa spacje i komentarze, rozszerza makra i wypełnia tablicę symboli.
  • ⚠️ Błędy leksykalne: Niedozwolone znaki lub błędnie napisane identyfikatory powodują błędy, które można rozwiązać za pomocą technik odzyskiwania, takich jak usuwanie lub transpozycja.
  • 🔀 Lexer kontra Parser: Lekser identyfikuje tokeny, a parser buduje drzewo parsowania podczas analizy składniowej.

Analiza leksykalna

Co to jest analiza leksykalna?

Analiza leksykalna jest pierwszą fazą projektowania kompilatora. Lekser pobiera zmodyfikowany kod źródłowy zapisany w formie zdań. Innymi słowy, pomaga przekonwertować ciąg znaków na ciąg 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ą w projekcie kompilatora, nazywane są analizatorami leksykalnymi lub lekserami. Lekser zawiera tokenizator lub skaner. Jeśli analizator leksykalny wykryje, że token jest nieprawidłowy, generuje błąd. Rolą analizatora leksykalnego w projektowaniu kompilatora jest odczytywanie strumieni znaków z kodu źródłowego, sprawdzanie legalnych tokenów i przekazywanie danych do analizatora składni, gdy tego wymaga.

Przykład

How Pleasant Is The Weather?

Zobacz ten przykład analizy leksykalnej; Możemy tutaj łatwo rozpoznać, że istnieje pięć słów: How Pleasant, The, Weather, Is. Jest to dla nas bardzo naturalne, ponieważ potrafimy rozpoznać separatory, spacje i znaki interpunkcyjne.

 HowPl easantIs Th ewe ather?

Teraz sprawdź ten przykład, możemy to również przeczytać. Zajmie to jednak trochę czasu, ponieważ w nieparzystych miejscach umieszczone zostaną separatory. To nie jest coś, co przychodzi do ciebie natychmiast.

Podstawowe terminologie

Co to jest leksem?

Leksem to ciąg znaków zawarty w programie źródłowym zgodnie ze wzorcem pasującym do tokena. To nic innego jak instancja tokena.

Co to jest token?

Tokeny w projekcie kompilatora to ciąg znaków reprezentujący jednostkę informacji w programie źródłowym.

Co to jest wzór?

Wzorzec to opis, którego używa token. W przypadku słowa kluczowego, które pełni funkcję tokena, wzorcem jest ciąg znaków.

Analizator leksykalny Architecture: Jak rozpoznawane są tokeny

Głównym zadaniem analizy leksykalnej jest odczytanie znaków wejściowych w kodzie i utworzenie 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 generowania tokenów tylko na żądanie parsera. Oto jak działa rozpoznawanie tokenów w projektowaniu kompilatora:

Analizator leksykalny Architektura
Analizator leksykalny Architektura
  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, aż znajdzie następny token.
  3. Zwraca token do Parsera.

Analizator leksykalny pomija białe znaki 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 realizuje poniższe zadania:

  • Pomaga zidentyfikować token w tabeli symboli
  • Usuwa białe spacje i komentarze z programu źródłowego
  • Koreluje komunikaty o błędach z programem źródłowym
  • Pomaga w rozwijaniu makr, 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ż poniższy kod, który jest przekazywany do analizatora leksykalnego

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Przykłady utworzonych Tokenów

Leksem żeton
int słowo kluczowe
maksymalny identyfikator
( OperaTor
int słowo kluczowe
x identyfikator
, OperaTor
int słowo kluczowe
Y identyfikator
) OperaTor
{ OperaTor
If słowo kluczowe

Przykłady nietokenów

Typ Przykłady
Komentarz // To porówna 2 liczby
Dyrektywa przedprocesorowa #włączać
Dyrektywa przedprocesorowa #zdefiniuj NUM 8,9
Macro LICZBY
Biała przestrzeń /n /b /t

Błędy leksykalne

Sekwencja znaków, której nie można zeskanować do żadnego prawidłowego tokena, jest błędem leksykalnym. Ważne fakty dotyczące błędu leksykalnego:

  • Błędy leksykalne nie są zbyt częste, ale skaner powinien sobie z nimi poradzić
  • Błędy ortograficzne w identyfikatorach, operatorach i słowach kluczowych są uważane za błędy leksykalne
  • Generalnie błąd leksykalny wynika z pojawienia się jakiegoś nielegalnego znaku, najczęściej na początku tokena.

Odzyskiwanie błędów w analizatorze leksykalnym

Oto kilka najpopularniejszych technik odzyskiwania po błędach:

  • Usuwa jeden znak z pozostałych danych wejściowych
  • W trybie paniki kolejne znaki są zawsze ignorowane, aż do momentu, gdy 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
Skanuj program wejściowy Wykonaj analizę składni
Identyfikuj tokeny Stwórz mięśnie brzuchatracreprezentacja kodu
Wstaw tokeny do tabeli symboli Zaktualizuj wpisy w tabeli symboli
Generuje błędy leksykalne Generuje drzewo analizy kodu źródłowego

Po co oddzielać leksykalny i parser?

  • Prostota projektu: Ułatwia proces analizy leksykalnej i analizy składni poprzez eliminację niepożądanych tokenów
  • Aby poprawić wydajność kompilatora: Pomaga poprawić wydajność kompilatora
  • Specjalizacja: można zastosować specjalistyczne techniki w celu usprawnienia procesu analizy leksykalnej
  • Przenośność: jedynie skaner wymaga komunikacji ze światem zewnętrznym
  • Większa przenośność: cechy specyficzne dla urządzenia wejściowego ograniczone do leksykonu

Zalety analizy leksykalnej

  • Metoda analizatora leksykalnego jest używana przez programy takie jak kompilatory, które mogą wykorzystywać przeanalizowane dane 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 JAVASCRIPT, HTML, CSS
  • Oddzielny analizator leksykalny pomaga skonstruować wyspecjalizowany i potencjalnie wydajniejszy procesor do zadania

Wady analizy leksykalnej

  • Musisz spędzić dużo czasu na czytaniu programu źródłowego i partycjonowaniu go w formie tokenów
  • Niektóre wyrażenia regularne są dość trudne do zrozumienia w porównaniu z regułami PEG lub EBNF
  • Opracowanie i debugowanie leksykonu i jego opisów tokenów wymaga więcej wysiłku
  • Do wygenerowania tabel leksykalnych i skonstruowania tokenów wymagane jest dodatkowe obciążenie środowiska wykonawczego

FAQ

Do popularnych narzędzi należą Lex i jego open-source'owa wersja Flex. Wzorce tokenów piszesz jako wyrażenia regularne, a narzędzie automatycznie generuje kod źródłowy skanera, oszczędzając Ci konieczności ręcznego kodowania tokenizera.

Analizator leksykalny definiuje każdy token jako wyrażenie regularne i implementuje dopasowanie za pomocą automatów skończonych. Skanuje znaki od lewej do prawej i emituje najdłuższe prawidłowe dopasowanie jako kolejny token.

Tabela symboli to struktura danych, w której analizator leksykalny przechowuje identyfikatory i ich atrybuty, takie jak nazwa i typ. Later fazy kompilatora odczytują i aktualizują go do track zmiennych i funkcji.

Sztuczna inteligencja może generować wyrażenia regularne tokenów na podstawie przykładów, wykrywać niejednoznaczności lub nakładanie sięping wzorce i wyjaśniają błędy skanera. Przyspiesza to budowanie i debugowanie leksera dla nowego języka lub DSL.

Nie do końca. Kompilatory używają stałych reguł i automatów skończonych do tokenizacji kodu, podczas gdy modele sztucznej inteligencji dzielą tekst na statystyczne tokeny podsłowne. Cele są różne: dokładne parsowanie kontra elastyczne rozumienie języka.

Podsumuj ten post następująco: