Lexikálna analýza v dizajne kompilátora s príkladom

Obsah:

Anonim

Čo je to lexikálna analýza?

LEXICKÁ ANALÝZA je úplne prvou fázou navrhovania kompilátora. Lexer vezme upravený zdrojový kód, ktorý je napísaný vo forme viet. Inými slovami, pomáha vám previesť postupnosť znakov do postupnosti tokenov. Lexikálny analyzátor túto syntax rozdeľuje na sériu tokenov. Odstráni akýkoľvek ďalší priestor alebo komentár napísaný v zdrojovom kóde.

Programy, ktoré vykonávajú lexikálnu analýzu, sa nazývajú lexikálne analyzátory alebo lexery. Lexer obsahuje tokenizer alebo skener. Ak lexikálny analyzátor zistí, že token je neplatný, generuje chybu. Číta prúd znakov zo zdrojového kódu, kontroluje legálne tokeny a na požiadanie odovzdáva údaje syntaktickému analyzátoru.

Príklad

How Pleasant Is The Weather?

Pozri tento príklad; Tu ľahko rozpoznáme, že existuje päť slov Aké príjemné, počasie je. To je pre nás veľmi prirodzené, pretože môžeme rozpoznať oddeľovače, medzery a interpunkčný symbol.

 HowPl easantIs Th ewe ather?

Teraz si pozrite tento príklad, môžeme si ho tiež prečítať. Bude to však trvať nejaký čas, pretože oddeľovače sú umiestnené v Divných miestach. Nie je to niečo, čo k vám príde okamžite.

V tomto návode sa naučíte

  • Základné terminológie:
  • Architektúra Lexical Analyzer: Ako sa rozpoznávajú tokeny
  • Úlohy Lexikálneho analyzátora
  • Lexikálne chyby
  • Obnova po chybe v Lexical Analyzer
  • Lexical Analyzer vs. Parser
  • Prečo oddeliť Lexical a Parser?
  • Výhody lexikálnej analýzy
  • Nevýhoda lexikálnej analýzy

Základné terminológie

Čo je lexéma?

Lexéma je postupnosť znakov, ktoré sú zahrnuté do zdrojového programu podľa zodpovedajúceho vzoru tokenu. Nie je to nič iné ako inštancia tokenu.

Čo je to token?

Token je postupnosť znakov, ktorá predstavuje jednotku informácií v zdrojovom programe.

Čo je to vzor?

Vzor je popis, ktorý používa token. V prípade kľúčového slova, ktoré sa používa ako token, je vzorom postupnosť znakov.

Architektúra Lexical Analyzer: Ako sa rozpoznávajú tokeny

Hlavnou úlohou lexikálnej analýzy je čítať vstupné znaky v kóde a vyrábať tokeny.

Lexikálny analyzátor skenuje celý zdrojový kód programu. Identifikuje každý token jeden po druhom. Skenery sú zvyčajne implementované tak, aby produkovali tokeny, iba ak to vyžaduje syntaktický analyzátor. Takto to funguje -

  1. „Získať ďalší token“ je príkaz, ktorý sa od parseru odošle do lexikálneho analyzátora.
  2. Po prijatí tohto príkazu lexikálny analyzátor skenuje vstup, kým nenájde ďalší token.
  3. Vráti token do analyzátora.

Lexical Analyzer pri vytváraní týchto tokenov preskočí medzery a komentáre. Ak sa vyskytne nejaká chyba, potom Lexikálny analyzátor porovná túto chybu so zdrojovým súborom a číslom riadku.

Úlohy Lexikálneho analyzátora

Lexikálny analyzátor vykonáva nasledujúce úlohy:

  • Pomáha identifikovať token do tabuľky symbolov
  • Odstráni medzery a komentáre zo zdrojového programu
  • Súvisí chybové hlásenie so zdrojovým programom
  • Pomáha vám rozšíriť makra, ak sa nachádzajú v zdrojovom programe
  • Prečítajte si vstupné znaky zo zdrojového programu

Príklad lexikálnej analýzy, tokeny, ne tokeny

Zvážte nasledujúci kód, ktorý sa privádza do Lexical Analyzer

#include int maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}

Príklady vytvorených tokenov

Lexeme Token
int Kľúčové slovo
maximálne Identifikátor
( Prevádzkovateľ
int Kľúčové slovo
X Identifikátor
, Prevádzkovateľ
int Kľúčové slovo
Y Identifikátor
) Prevádzkovateľ
{ Prevádzkovateľ
Ak Kľúčové slovo

Príklady Nontokens

Typ Príklady
Komentovať // Takto sa porovnajú 2 čísla
Smernica pred spracovaním #include
Smernica pred spracovaním #define NUMS 8,9
Makro NUM
Biely vesmír / n / b / t

Lexikálne chyby

Postupnosť znakov, ktorú nie je možné naskenovať do žiadneho platného tokenu, je lexikálna chyba. Dôležité fakty o lexikálnej chybe:

  • Lexikálne chyby nie sú veľmi časté, mal by ich však spravovať skener
  • Nesprávny pravopis identifikátorov, operátorov, kľúčových slov sa považuje za lexikálne chyby
  • Všeobecne je lexikálna chyba spôsobená výskytom nejakého nelegálneho znaku, väčšinou na začiatku tokenu.

Obnova po chybe v Lexical Analyzer

Tu uvádzame niekoľko najbežnejších techník obnovy po chybe:

  • Odstráni jeden znak zo zostávajúceho vstupu
  • V panickom režime sú nasledujúce znaky vždy ignorované, kým nedosiahneme správne sformovaný token
  • Vložením chýbajúceho znaku do zostávajúceho vstupu
  • Nahraďte znak iným znakom
  • Transponujte dva sériové znaky

Lexical Analyzer vs. Parser

Lexikálny analyzátor Analyzátor
Program skenovania vstupu Vykonajte syntaktickú analýzu
Identifikujte tokeny Vytvorte abstraktné znázornenie kódu
Vložte žetóny do tabuľky symbolov Aktualizujte položky tabuľky symbolov
Generuje lexikálne chyby Generuje syntaktický strom zdrojového kódu

Prečo oddeliť Lexical a Parser?

  • Jednoduchosť návrhu: Uľahčuje proces lexikálnej analýzy a syntaktickej analýzy elimináciou nežiaducich tokenov
  • Zlepšenie efektívnosti prekladača: Pomáha vám zvýšiť efektívnosť prekladača
  • Špecializácia: na zlepšenie procesu lexikálnej analýzy možno použiť špecializované techniky
  • Prenosnosť: komunikácia s okolitým svetom vyžaduje iba skener
  • Vyššia prenosnosť: zvláštnosti špecifické pre vstupné zariadenie obmedzené na lexera

Výhody lexikálnej analýzy

  • Metódu lexikálneho analyzátora používajú programy ako kompilátory, ktoré dokážu pomocou analyzovaných údajov z kódu programátora vytvoriť kompilovaný binárny spustiteľný kód
  • Používajú ho webové prehliadače na formátovanie a zobrazovanie webovej stránky pomocou analyzovaných údajov z Javscript, HTML, CSS.
  • Samostatný lexikálny analyzátor vám pomôže skonštruovať špecializovaný a potenciálne efektívnejší procesor pre danú úlohu

Nevýhoda lexikálnej analýzy

  • Musíte stráviť značný čas čítaním zdrojového programu a jeho rozdelením na tokeny
  • Niektorým regulárnym výrazom je dosť ťažké porozumieť v porovnaní s pravidlami PEG alebo EBNF
  • Je potrebné vyvinúť väčšie úsilie na vývoj a ladenie lexeru a jeho popisov tokenov
  • Na vygenerovanie tabuliek lexeru a vytvorenie tokenov je potrebná ďalšia runtime réžia

Zhrnutie

  • Lexikálna analýza je úplne prvou fázou navrhovania kompilátora
  • Lexéma je postupnosť znakov, ktoré sú zahrnuté do zdrojového programu podľa zodpovedajúceho vzoru tokenu
  • Lexikálny analyzátor je implementovaný na skenovanie celého zdrojového kódu programu
  • Lexikálny analyzátor pomáha identifikovať token do tabuľky symbolov
  • Postupnosť znakov, ktorú nie je možné naskenovať do žiadneho platného tokenu, je lexikálna chyba
  • Odstráni jeden znak zo zvyšného vstupu je užitočná metóda obnovenia chyby
  • Lexical Analyzer skenuje vstupný program, zatiaľ čo syntaktický analyzátor vykonáva syntaktickú analýzu
  • Uľahčuje proces lexikálnej analýzy a syntaktickej analýzy elimináciou nežiaducich tokenov
  • Lexikálny analyzátor používajú webové prehliadače na formátovanie a zobrazovanie webových stránok pomocou analyzovaných údajov z Javscript, HTML, CSS
  • Najväčšou nevýhodou používania Lexikálneho analyzátora je, že na generovanie tabuliek lexerov a tvorbu tokenov je potrebná ďalšia runtime réžia.