Lexikální analýza (analyzátor) v návrhu kompilátoru s příkladem

Co je lexikální analýza?

Lexikální analýza je úplně první fází při navrhování kompilátoru. Lexer převezme upravený zdrojový kód, který je napsán ve formě vět. Jinými slovy, pomáhá vám převést posloupnost znaků na posloupnost tokenů. Lexikální analyzátor rozdělí tuto syntaxi na řadu tokenů. Odstraní všechny mezery nebo komentáře zapsané ve zdrojovém kódu.

Programy, které provádějí lexikální analýzu v návrhu kompilátoru, se nazývají lexikální analyzátory nebo lexery. Lexer obsahuje tokenizér nebo skener. Pokud lexikální analyzátor zjistí, že token je neplatný, vygeneruje chybu. Úlohou Lexical Analyzer v návrhu kompilátoru je číst proudy znaků ze zdrojového kódu, kontrolovat legální tokeny a předávat data syntaktickému analyzátoru, když to vyžaduje.

Příklad

How Pleasant Is The Weather?

Viz tento příklad Lexikální analýzy; Zde snadno poznáme, že existuje pět slov How Pleasant, The, Weather, Is. To je pro nás velmi přirozené, protože dokážeme rozpoznat oddělovače, mezery a symbol interpunkce.

 HowPl easantIs Th ewe ather?

Nyní se podívejte na tento příklad, můžeme si to také přečíst. Bude to však nějakou dobu trvat, protože oddělovače jsou umístěny na Odd Places. Není to něco, co k vám přijde okamžitě.

Základní terminologie

Co je to lexém?

Lexém je posloupnost znaků, které jsou zahrnuty ve zdrojovém programu podle shodného vzoru tokenu. Není to nic jiného než instance tokenu.

Co je to token?

Tokeny v designu kompilátoru jsou sekvence znaků, které představují jednotku informace ve zdrojovém programu.

Co je vzor?

Vzor je popis, který používá token. V případě klíčového slova, které se používá jako token, je vzorem sekvence znaků.

Lexikální analyzátor Architecture: Jak se rozpoznávají tokeny

Hlavním úkolem lexikální analýzy je číst vstupní znaky v kódu a vytvářet tokeny.

Lexikální analyzátor prohledá celý zdrojový kód programu. Identifikuje každý token jeden po druhém. Skenery jsou obvykle implementovány tak, aby produkovaly tokeny pouze na žádost analyzátoru. Zde je návod, jak funguje rozpoznávání tokenů v návrhu kompilátoru –

Lexikální analyzátor Architecture
Lexikální analyzátor Architecture
  1. „Get next token“ je příkaz, který je odeslán z analyzátoru do lexikálního analyzátoru.
  2. Po přijetí tohoto příkazu lexikální analyzátor prohledává vstup, dokud nenajde další token.
  3. Vrátí token do analyzátoru.

Lexical Analyzer při vytváření těchto tokenů přeskakuje mezery a komentáře. Pokud je přítomna jakákoli chyba, pak Lexikální analyzátor koreluje tuto chybu se zdrojovým souborem a číslem řádku.

Role lexikálního analyzátoru

Lexikální analyzátor provádí níže uvedené úkoly:

  • Pomáhá identifikovat token do tabulky symbolů
  • Odebere ze zdrojového programu bílá místa a komentáře
  • Koreluje chybové zprávy se zdrojovým programem
  • Pomůže vám rozšířit makra, pokud je nalezena ve zdrojovém programu
  • Přečtěte si vstupní znaky ze zdrojového programu

Příklad lexikální analýzy, tokeny, non-tokeny

Zvažte následující kód, který je přiváděn do Lexical Analyzer

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

Příklady vytvořených tokenů

Lexeme Známka
int Klíčové slovo
maximum identifikátor
( OperaTor
int Klíčové slovo
x identifikátor
, OperaTor
int Klíčové slovo
Y identifikátor
) OperaTor
{ OperaTor
If Klíčové slovo

Příklady Nontokens

Typ Příklady
Komentář // Toto porovná 2 čísla
Předprocesorová směrnice #zahrnout
Předprocesorová směrnice #define NUMS 8,9
Makro NUMS
Whitespace /n /b /t

Lexikální chyby

Sekvence znaků, kterou nelze naskenovat do žádného platného tokenu, je lexikální chyba. Důležitá fakta o lexikální chybě:

  • Lexikální chyby nejsou příliš časté, ale měly by být spravovány skenerem
  • Překlepy v identifikátorech, operátorech, klíčových slovech jsou považovány za lexikální chyby
  • Obecně je lexikální chyba způsobena výskytem nějaké nelegální postavy, většinou na začátku tokenu.

Obnova chyb v Lexical Analyzer

Zde je několik nejběžnějších technik obnovy chyb:

  • Odebere jeden znak ze zbývajícího vstupu
  • V panickém režimu jsou po sobě následující postavy vždy ignorovány, dokud nedosáhneme dobře vytvořeného tokenu
  • Vložením chybějícího znaku do zbývajícího vstupu
  • Nahraďte znak jiným znakem
  • Transponujte dva sériové znaky

Lexikální analyzátor vs. Parser

Lexikální analyzátor Parser
Program Scan Input Proveďte analýzu syntaxe
Identifikujte tokeny Vytvořte abstraktní reprezentaci kódu
Vložte žetony do tabulky symbolů Aktualizujte položky tabulky symbolů
Vytváří lexikální chyby Generuje strom analýzy zdrojového kódu

Proč oddělovat Lexical a Parser?

  • Jednoduchost designu: Usnadňuje proces lexikální analýzy a syntaktické analýzy odstraněním nežádoucích tokenů
  • Zlepšení efektivity kompilátoru: Pomáhá zlepšit efektivitu kompilátoru
  • Specializace: specializované techniky lze použít ke zlepšení procesu lexikální analýzy
  • Přenositelnost: pouze skener vyžaduje komunikaci s vnějším světem
  • Vyšší přenositelnost: zvláštnosti specifické pro vstupní zařízení jsou omezeny na lexer

Výhody Lexikální analýzy

  • Metodu lexikálního analyzátoru používají programy, jako jsou kompilátory, které mohou použít analyzovaná data z kódu programátora k vytvoření zkompilovaného binárního spustitelného kódu.
  • Používají jej webové prohlížeče k formátování a zobrazení webové stránky pomocí analyzovaných dat z JavaScript, HTML, CSS
  • Samostatný lexikální analyzátor vám pomůže vytvořit specializovaný a potenciálně efektivnější procesor pro daný úkol

Nevýhoda Lexikální analýzy

  • Musíte strávit značný čas čtením zdrojového programu a jeho rozdělením ve formě tokenů
  • Některé regulární výrazy jsou ve srovnání s pravidly PEG nebo EBNF poměrně obtížné pochopit
  • K vývoji a ladění lexeru a jeho popisů tokenů je zapotřebí více úsilí
  • Ke generování lexerových tabulek a konstrukci tokenů je vyžadována další provozní režie

Shrnutí

  • Lexikální analýza je úplně první fází návrhu kompilátoru
  • Lexemy a tokeny jsou posloupností znaků, které jsou zahrnuty ve zdrojovém programu podle shodného vzoru tokenu.
  • Lexikální analyzátor je implementován pro skenování celého zdrojového kódu programu
  • Lexikální analyzátor pomáhá identifikovat token do tabulky symbolů
  • Sekvence znaků, kterou nelze naskenovat do žádného platného tokenu, je lexikální chyba
  • Odstranění jednoho znaku ze zbývajícího vstupu je užitečná metoda zotavení po chybě
  • Lexical Analyzer skenuje vstupní program, zatímco parser provádí analýzu syntaxe
  • Usnadňuje proces lexikální analýzy a syntaktické analýzy odstraněním nežádoucích tokenů
  • Lexikální analyzátor používají webové prohlížeče k formátování a zobrazení webové stránky pomocí analyzovaných dat z JavaScriptu, HTML, CSS
  • Největší nevýhodou použití lexikálního analyzátoru je to, že pro generování lexerových tabulek a sestavení tokenů vyžaduje další provozní režii.