Analiza leksykalna w kompilatorze

Analiza leksykalna w kompilatorze jest pierwszym krokiem w analizie programu źródłowego. Analiza leksykalna odczytuje strumień wejściowy z programu źródłowego znak po znaku i tworzy sekwencję tokenów. Tokeny te są dostarczane jako wejście do parsera w celu parsowania. W tym kontekście omówimy w skrócie proces analizy leksykalnej wraz z błędami leksykalnymi i ich odzyskiwaniem.

zawartość: Analiza leksykalna w kompilatorze

  1. Terminologie w analizie leksykalnej
  2. czym jest analiza leksykalna?
    • przykłady analizy leksykalnej
  3. rola analizatora leksykalnego
  4. błąd leksykalny
  5. Odzyskiwanie błędów
  6. najważniejsze wnioski

Terminologie w analizie leksykalnej

zanim przejdziemy do tego, co to jest analiza leksykalna, porozmawiajmy o niektórych terminologiach, które napotkamy podczas omawiania analizy leksykalnej.

  • leksem
    leksem można zdefiniować jako ciąg znaków, który tworzy wzorzec i może być rozpoznany jako token.
  • wzór
    po zidentyfikowaniu wzoru leksemu można opisać, jaki rodzaj tokenu można utworzyć. Tak jak wzorzec niektórych leksemów tworzy słowo kluczowe, wzorzec niektórych leksemów tworzy identyfikator.
  • Token
    leksem z prawidłowym wzorcem tworzy token. W analizie leksykalnej ważnym tokenem mogą być identyfikatory, słowa kluczowe, separatory, znaki specjalne, stałe i operatory.

Tokens

czym jest analiza leksykalna?

wcześniej nie używaliśmy analizatora leksykalnego w naszym kompilatorze treści w komputerze. Dowiedzieliśmy się, że kompilator przeprowadza analizę programu źródłowego przez różne fazy, aby przekształcić go w program docelowy. Analiza leksykalna jest pierwszą fazą, przez którą musi przejść program źródłowy.

analiza leksykalna to proces tokenizacji tj. czyta ciąg wejściowy programu źródłowego znak po znaku i jak tylko identyfikuje koniec leksemu, identyfikuje jego wzorzec i konwertuje go na token.

analizator leksykalny składa się z dwóch następujących po sobie procesów, które obejmują skanowanie i analizę leksykalną.

proces analizatora leksykalnego

  1. skanowanie: Faza skanowania-eliminuje tylko elementy niebanalne z programu źródłowego. Takich jak eliminacja komentarzy, zagęszczanie kolejnych białych spacji itp.
  2. Analiza Leksykalna: Faza analizy leksykalnej wykonuje tokenizację na wyjściu dostarczonym przez skaner i w ten sposób wytwarza tokeny.

program używany do wykonywania analizy leksykalnej jest określany jako lexer lub lexical analyzer. Weźmy teraz przykład analizy leksykalnej wykonanej na oświadczeniu:

przykład 1 analizy leksykalnej:

Analiza leksykalna w projektowaniu kompilatora, identyfikacja tokenów.

teraz, kiedy przeczytamy to oświadczenie, możemy łatwo zidentyfikować, że w powyższym oświadczeniu jest dziewięć żetonów.

  1. identyfikatory -> leksykalne
  2. identyfikatory -> analiza
  3. identyfikatory -> w
  4. identyfikatory – > kompilator
  5. identyfikatory – > projektowanie
  6. Separator -> ,
  7. identyfikatory – > identyfikacja
  8. identyfikatory -> tokeny
  9. Separator -> .

tak więc w sumie w powyższym strumieniu znaków jest 9 tokenów.

przykład 2 analizy leksykalnej:

printf(” value of I is %d “, i);

spróbujmy teraz znaleźć tokeny z tego strumienia wejściowego.

  1. słowo kluczowe – > printf
  2. znak specjalny-> (
  3. Literal – > “wartość i to %d”
  4. Separator -> ,
  5. identyfikator- > i
  6. znak specjalny -> )
  7. Separator -> ;

Uwaga:

  • cały łańcuch wewnątrz podwójnego odwróconego przecinka tj. “” jest uważany za pojedynczy token.
  • pusta Biała spacja oddzielająca znaki w strumieniu wejściowym oddziela tylko tokeny i w ten sposób jest eliminowana podczas liczenia tokenów.

rola analizatora leksykalnego

będąc pierwszą fazą analizy programu źródłowego analizator leksykalny odgrywa ważną rolę w transformacji programu źródłowego do programu docelowego.

cały ten scenariusz można zrealizować za pomocą poniższego rysunku:

Analiza leksykalna w kompilatorze

  1. analizator leksykalny ma zaimplementowany w nim program skanera lub lexera, który wytwarza tokeny tylko wtedy, gdy są one nakazane przez parser.
  2. parser generuje polecenie getNextToken i wysyła je do analizatora leksykalnego w odpowiedzi na to analizator leksykalny rozpoczyna odczyt strumienia wejściowego znak po znaku, dopóki nie zidentyfikuje leksemu, który może być rozpoznany jako token.
  3. gdy tylko token zostanie wytworzony, analizator leksykalny wysyła go do analizatora składni w celu przetworzenia.
  4. wraz z analizatorem składni, analizator leksykalny komunikuje się również z tabelą symboli. Gdy analizator leksykalny identyfikuje leksem jako identyfikator, wprowadza go do tabeli symboli.
  5. czasami informacja o identyfikatorze w tabeli symboli pomaga analizatorowi leksykalnemu w określeniu tokenu, który ma zostać wysłany do parsera.
  6. oprócz identyfikacji tokenów w strumieniu wejściowym, analizator leksykalny eliminuje również pustą spację/białą spację i komentarze programu. Takie inne rzeczy obejmują znaki oddziela żetony, tabulatory, spacje, nowe linie.
  7. analizator leksykalny pomaga w powiązaniu komunikatów o błędach generowanych przez kompilator. Na przykład analizator leksykalny przechowuje zapis każdego nowego znaku linii, który natknie się podczas skanowania programu źródłowego, dzięki czemu łatwo łączy komunikat o błędzie z numerem linii programu źródłowego.
  8. jeśli program źródłowy używa makr, analizator leksykalny rozszerza makra w programie źródłowym.

błąd leksykalny

sam analizator leksykalny nie jest skuteczny do określenia błędu z programu źródłowego. Na przykład rozważmy polecenie:

prtf (“wartość i to %d”, i);

teraz, w powyższej instrukcji, gdy napotkany jest ciąg prtf, analizator leksykalny nie jest w stanie odgadnąć, czy prtf jest nieprawidłową pisownią słowa kluczowego ‘printf’, czy jest to niezgłoszony identyfikator funkcji.

ale zgodnie z predefiniowaną regułą prtf jest poprawnym leksem, którego wzorzec zakłada, że jest tokenem identyfikującym. Teraz analizator leksykalny wyśle token prtf do następnej fazy, czyli parsera, który będzie obsługiwał błąd, który wystąpił z powodu transpozycji liter.

Odzyskiwanie błędów

cóż, czasami jest nawet niemożliwe, aby analizator leksykalny zidentyfikował leksem jako token, ponieważ wzór leksemu nie pasuje do żadnego z predefiniowanych wzorców dla tokenów. W tym przypadku musimy zastosować kilka strategii odzyskiwania błędów.

  1. w trybie panic odzyskiwanie kolejnych znaków z leksemu jest usuwane, dopóki analizator leksykalny nie zidentyfikuje poprawnego tokenu.
  2. wyeliminuj pierwszy znak z pozostałego wejścia.
  3. Zidentyfikuj ewentualny brakujący znak i włóż go odpowiednio do pozostałych danych wejściowych.
  4. Zastąp znak w pozostałym wejściu, aby uzyskać prawidłowy token.
  5. Wymień pozycję dwóch sąsiednich znaków w pozostałym wejściu.

podczas wykonywania powyższych czynności odzyskiwania błędów Sprawdź, czy prefiks pozostałego wejścia pasuje do dowolnego wzorca tokenów. Ogólnie rzecz biorąc, błąd leksykalny występuje z powodu pojedynczego znaku. Można więc skorygować błąd leksykalny za pomocą pojedynczej transformacji. I tak dalece, jak to możliwe, mniejsza liczba przekształceń musi przekształcić program źródłowy w sekwencję ważnych tokenów, które może przekazać parserowi.

kluczowe zagadnienia

  • Analiza leksykalna jest pierwszym etapem analizy programu źródłowego w kompilatorze.
  • analizator leksykalny realizowany jest przez dwa kolejne procesy: skaner i analizę leksykalną.
  • Skaner eliminuje elementy nie-tokenowe ze strumienia wejściowego.
  • Analiza leksykalna wykonuje tokenizację.
  • tak więc analizator leksykalny generuje sekwencję tokenów i przekazuje je do parsera.
  • parser na posiadaniu tokenu z analizatora leksykalnego wykonuje wywołanie getNextToken, które wymaga, aby analizator leksykalny odczytał strumień wejściowy znaków, dopóki nie zidentyfikuje następnego tokena.
  • jeśli analizator leksykalny identyfikuje wzorzec leksemu jako identyfikator, to analizator leksykalny wprowadza ten lekseme do tabeli symboli do wykorzystania w przyszłości.
  • Analizator leksykalny nie jest skuteczny w wykrywaniu błędów w samym programie źródłowym.
  • jeśli wystąpi leksem, którego wzorzec nie pasuje do żadnego z predefiniowanych wzorców tokenów, musisz wykonać działania odzyskiwania błędów, aby naprawić błąd.

chodzi więc o analizę leksykalną, która przekształca strumień znaków w tokeny i przekazuje go do parsera. O działaniu analizy leksykalnej dowiedzieliśmy się na przykładzie. Zakończyliśmy dyskusję błędem leksykalnym i jego strategią odzyskiwania.

Leave a Reply