Projekt kompilatora - analiza leksykalna

Analiza leksykalna to pierwsza faza kompilatora. Pobiera zmodyfikowany kod źródłowy z preprocesorów języka, które są zapisane w postaci zdań. Analizator leksykalny dzieli te składnie na serię tokenów, usuwając wszelkie białe znaki lub komentarze w kodzie źródłowym.

Jeśli analizator leksykalny stwierdzi, że token jest nieprawidłowy, generuje błąd. Analizator leksykalny ściśle współpracuje z analizatorem składni. Odczytuje strumienie znaków z kodu źródłowego, sprawdza legalne tokeny i przekazuje dane do analizatora składni, gdy tego wymaga.

Tokeny

Mówi się, że leksemy są sekwencją znaków (alfanumerycznych) w tokenie. Istnieją pewne predefiniowane reguły, które mają być identyfikowane jako ważny token dla każdego leksemu. Reguły te są określone przez reguły gramatyczne za pomocą wzorca. Wzorzec wyjaśnia, co może być tokenem, a wzorce te są definiowane za pomocą wyrażeń regularnych.

W języku programowania słowa kluczowe, stałe, identyfikatory, łańcuchy, liczby, operatory i symbole interpunkcyjne mogą być traktowane jako tokeny.

Na przykład w języku C wiersz deklaracji zmiennej

int value = 100;

zawiera tokeny:

int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).

Specyfikacje tokenów

Rozumiemy, jak teoria języka przyjmuje następujące terminy:

Alfabety

Dowolny skończony zbiór symboli {0,1} jest zbiorem binarnych alfabetów, {0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F} to zestaw alfabetów szesnastkowych, {az, AZ} to zestaw alfabetów języka angielskiego.

Smyczki

Każda skończona sekwencja alfabetów nazywana jest łańcuchem. Długość ciągu to całkowita liczba wystąpień alfabetów, np. Długość ciągu znaków tutorialspoint wynosi 14 i jest oznaczona przez | tutorialspoint | = 14. Łańcuch bez alfabetów, czyli ciąg o zerowej długości, nazywany jest łańcuchem pustym i oznaczany jest przez ε (epsilon).

Symbole specjalne

Typowy język wysokiego poziomu zawiera następujące symbole: -

Symbole arytmetyczne Dodawanie (+), odejmowanie (-), modulo (%), mnożenie (*), dzielenie (/)
Interpunkcja Przecinek (,), średnik (;), kropka (.), Strzałka (->)
Zadanie =
Specjalne zadanie + =, / =, * =, - =
Porównanie ==,! =, <, <=,>,> =
Preprocesor #
Specyfikator lokalizacji &
Logiczny &, &&, |, ||,!
Operator zmiany >>, >>>, <<, <<<

Język

Język jest uważany za skończony zbiór ciągów na pewnym skończonym zbiorze alfabetów. Języki komputerowe są traktowane jako zbiory skończone i można na nich wykonywać operacje na zestawach matematycznych. Języki skończone można opisać za pomocą wyrażeń regularnych.

Zasada najdłuższego meczu

Kiedy analizator leksykalny odczytuje kod źródłowy, skanuje literę po literze; a kiedy napotka biały znak, symbol operatora lub symbole specjalne, decyduje, że słowo jest zakończone.

For example:

int intvalue;

Podczas skanowania obu leksemów do „int”, analizator leksykalny nie może określić, czy jest to słowo kluczowe int, czy inicjały wartości identyfikatora int.

Reguła najdłuższego dopasowania stanowi, że skanowany leksem powinien być określany na podstawie najdłuższego dopasowania spośród wszystkich dostępnych tokenów.

Dalej następuje analizator leksykalny rule prioritygdzie zarezerwowane słowo, np. słowo kluczowe języka, ma pierwszeństwo przed wprowadzaniem danych przez użytkownika. Oznacza to, że jeśli analizator leksykalny znajdzie leksem pasujący do dowolnego istniejącego słowa zastrzeżonego, powinien wygenerować błąd.