Lexikální analýza Teorie programovacích jazyků

Podobné dokumenty
Překladač a jeho struktura

Poslední aktualizace: 14. října 2011

Programovací jazyk Pascal

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Úvod. Programovací paradigmata

TÉMATICKÝ OKRUH TZD, DIS a TIS

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Uplatnění metod na zvolený jazyk

Úvod do programovacích jazyků (Java)

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Lexikální analýza. Rozhraní lexikálního analyzátoru. Miroslav Beneš Dušan Kolář. M. Beneš, D. Kolář: Lexikální analýza 1. Lexikální analýza 2

Lexikální analýza. Miroslav Beneš Dušan Kolář

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Konstruktory překladačů

Formální jazyky a gramatiky Teorie programovacích jazyků

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

O datových typech a jejich kontrole

Program a životní cyklus programu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Algoritmizace a programování

ALGORITMIZACE A PROGRAMOVÁNÍ

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Implementace LL(1) překladů

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Konečný automat. Jan Kybic.

Struktura programu v době běhu

dovolují dělení velkých úloh na menší = dekompozice

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

6 Příkazy řízení toku

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Úvod do programování

Dynamické datové typy a struktury

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Identifikátory označují objekty v programu používané (proměnné, typy, podprogramy).

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Implementace překladače imperativního jazyka IFJ05

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Semestrální práce z předmětu Teorie programovacích jazyků

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Paměť počítače. alg2 1

Programy v prostředí operačního systému

Software602 Form Designer

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Syntaxí řízený překlad

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Regulární výrazy. Filtry grep, sed a awk.

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Lexikální analýza (Obsah)

Časová a prostorová složitost algoritmů

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

VZORCE A VÝPOČTY. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý

OSTRAVSKÁ UNIVERZITA V OSTRAVĚ

Algoritmizace. 1. Úvod. Algoritmus

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Interpret jazyka IFJ2011

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Úvod do programování. Lekce 1

NPRG030 Programování I, 2015/16 1 / :25:32

Vstupní požadavky, doporučení a metodické pokyny

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Konečný automat Teorie programovacích jazyků

VISUAL BASIC. Přehled témat

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Vztah jazyků Chomskeho hierarchie a jazyků TS

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Algoritmizace prostorových úloh

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

Programování v C++ 1, 1. cvičení

1. Definujte překladač. Jaký je rozdíl mezi interpretačním a kompilačním překladačem? Co je to konverzační překladač?

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

10 Algoritmizace Příklad 2 Word 2007/ VBA

/01: Teoretická informatika(ti) přednáška 5

Transkript:

Lexikální analýza Teorie programovacích jazyků doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz

Osnova dnešní přednášky 1 Úvod do teorie překladačů kompilátor a interpret možnosti využití překladačů struktura překladače reakce na chybu ve vstupu 2 Lexikální analyzátor lexikální symboly a jejich atributy rozpoznávání symbolů ze vstupu možnosti implementace 3 Příklad implementace návrh jazyka realizace Teorie programovacích jazyků Přednáška 5: Lexikální analýza 2 / 32

Základní pojmy z teorie překladačů Překladač je program, který čte zdrojový program a převádí ho do ekvivalentního cílového programu Zdrojový program je napsán ve zdrojovém jazyce, cílový program je v cílovém jazyce Důležitou částí procesu překladu jsou diagnostické zprávy například o přítomnosti chyb ve zdrojovém programu Generační překladač (kompilátor) převádí zdrojový jazyk do ekvivalentního strojového kódu nebo jazyka symbolických instrukcí Interpretační překladač (interpret) přímo interpretuje příkazy zdrojového jazyka tak, jak jsou napsány Teorie programovacích jazyků Přednáška 5: Lexikální analýza 3 / 32

Kompilátor interpret Data Zdrojový program Překladač Cílový program Výsledky Data Zdrojový program Interpret Výsledky Teorie programovacích jazyků Přednáška 5: Lexikální analýza 4 / 32

Kompilátor interpret Vlastnost Rychlost běhu cílového programu Rychlost spuštění cílového programu Rychlost překladu Spotřeba paměti operační (při běhu) Spotřeba paměti cílový soubor na médiu Přenositelnost kódu mezi SW platformami Možnosti optimalizace Nezávislost na překladači Kompilátor Interpret lepší lepší lepší lepší lepší lepší lepší lepší Teorie programovacích jazyků Přednáška 5: Lexikální analýza 5 / 32

Možnosti využití překladačů Překladače programovacích jazyků nejčastější použití Strukturované editory analýza textu, vkládání hierarchické struktury kontrola syntaxe, doplňování párových závorek kontextová nápověda při psaní Formátovací programy analýza programu a jeho tisk se zřetelnou strukturou barevné odlišení poznámek, příkazů apod. Programy pro sazbu textů TEX, jeho formáty a rozšíření Teorie programovacích jazyků Přednáška 5: Lexikální analýza 6 / 32

Struktura překladače Zdrojový jazyk Přední(analytická) část Lexikální analýza Syntaktická analýza Sémantická analýza Koncová(syntetická) část Intermediární jazyk Optimalizace intermediárního kódu Generátor kódu Optimalizace cílového kódu Cílový jazyk Teorie programovacích jazyků Přednáška 5: Lexikální analýza 7 / 32

Schéma konstrukce překladače i f a > = 4... jednosměrná vstupní páska Lexikální analyzátor lineární gramatiky regulární gramatiky nedeterministický konečný automat deterministický konečný automat Syntaktický analyzátor bezkontextové gramatiky deterministické bezkontextové gramatiky deterministický zásobníkový automat Sémantický analyzátor proměnné, vyhodnocení výrazů, podprogramy, podmínky, cykly, pole, systémová volání... atributové gramatiky Teorie programovacích jazyků Přednáška 5: Lexikální analýza 8 / 32

Analytická část překladače Lexikální analyzátor čte posloupnost znaků zdrojového kódu a sestavuje z ní lexikální symboly, vynechává oddělovače a komentáře na každé zavolání vrátí jeden lexikální symbol (token) konstanty, identifikátory, operátory, klíčová slova Syntaktický analyzátor vytváří hierarchicky zanořené struktury vytvořené na základě posloupnosti tokenů a kontroluje syntaxi výrazy, příkazy, deklarace Sémantický analyzátor kontrola vazeb, které nelze provádět na úrovni syntaktické analýzy deklarace, typová kontrola, intermediární kód Teorie programovacích jazyků Přednáška 5: Lexikální analýza 9 / 32

Informace o chybě ve zdroji Místo výskytu chyby číslo řádku a pozice na něm Druh chyby lexikální analyzátor neznámé symboly (12YT) syntaktický analyzátor chyby v syntaktické struktuře (begyn), přehozená či chybějící klíčová slova nebo symboly (if x else x := 3) sémantický procesor chyby zjistitelné při překladu (nedeklarovaná proměnná, nekompatibilní datový typ) a běhové chyby související s aktuální hodnotou proměnné (dělení nulou, přetečení, nedovolený přístup do paměti) U některých překladačů také návrhy na opravu chyby Logické chyby (chybná posloupnost příkazů, záměna operátorů, překlep v číslech) prakticky nelze odhalit! Teorie programovacích jazyků Přednáška 5: Lexikální analýza 10 / 32

Reakce překladače na chybu Při prvním výskytu chyby se zastaví, provede diagnózu, informuje uživatele a čeká na opravu chyby (Turbo Pascal) Pokouší se najít co nejvíce chyb najednou, zastaví se až při určitém maximálním počtu a informuje uživatele o všech objevených chybách, příp. o maximálním počtu chyb, které je schopen zobrazit (C++) Teorie programovacích jazyků Přednáška 5: Lexikální analýza 11 / 32

Zotavení po chybě v lexikální analýze Obecně se při lexikální analýze rozpozná jen malé množství chyb Možnosti reakce analyzátoru na neznámý symbol na vstupu vypouštění znaků ze zbývajícího vstupu tak dlouho, dokud není rozpoznán známý symbol vrácení kódu zvláštního terminálního symbolu bez ohlášení chyby a předání řešení problému syntaktickému analyzátoru vypuštění přebývajícího znaku vložení chybějícího znaku náhrada nesprávného znaku správným vzájemná výměna dvou sousedních znaků Teorie programovacích jazyků Přednáška 5: Lexikální analýza 12 / 32

Lexikální analýza Na vstupní pásce rozlišujeme množiny řetězců, které tvoří stejné významové kategorie tzv. lexikální symboly (tokeny) jazyka klíčová slova operátory identifikátory konstanty (literály) řetězce interpunkční symboly (závorky, čárky, středníky) komentáře oddělovače (bílé znaky) Na složitost lexikální analýzy mají značný dopad některé jazykové konvence Teorie programovacích jazyků Přednáška 5: Lexikální analýza 13 / 32

Problémy lexikální analýzy Pevná pozice určitých konstrukcí na vstupním řádku umístění může být důležité při určování správnosti zdrojového programu (Fortran) trendy tvorby moderních programovacích jazyků směřují spíše ke vstupu ve volném formátu Zpracování mezer v některých jazycích nejsou mezery významné (s výjimkou mezer uvnitř řetězce) mohou být doplněny pro zvýšení čitelnosti programu konvence týkající se mezer mohou značně komplikovat identifikaci symbolů Teorie programovacích jazyků Přednáška 5: Lexikální analýza 14 / 32

Problémy lexikální analýzy Rezervované řetězce předdefinovaný význam, který uživatel nemůže změnit nejsou-li klíčová slova rezervována, musí je od uživatelem definovaného identifikátoru rozlišit lexikální analyzátor definice klíčových slov jako samostatných symbolů jazyka definice klíčových slov pomocí ztotožnění s běžnými identifikátory, následné porovnání s tabulkou klíčových slov je jednodušší na implementaci Teorie programovacích jazyků Přednáška 5: Lexikální analýza 15 / 32

Atributy symbolů Lexikální analyzátor musí následujícím fázím překladače poskytovat informaci o tom, jaký symbol byl rozpoznán Důležitý je nejen typ symbolu (např. identifikátor), ale také jeho skutečný obsah (např. vysledek) Informace o jednotlivých rozpoznaných symbolech jsou shromažďovány v atributech symbolů Atributy symbolů významně ovlivňují překlad, neboť mají vliv na rozhodování syntaktického analyzátoru Pro účely diagnostiky nás často kromě samotného symbolu zajímá také číslo řádku, na kterém se symbol objevil Teorie programovacích jazyků Přednáška 5: Lexikální analýza 16 / 32

Lexikální analýza Příklad Vstup: pozice := počátek + rychlost * 60 Výstup: identifikátor pozice symbol přiřazení := identifikátor počátek operátor + identifikátor rychlost operátor * číslo 60 Teorie programovacích jazyků Přednáška 5: Lexikální analýza 17 / 32

Vstup zdrojového textu Může být v nejjednodušším případě realizováno voláním standardních funkcí programovacích jazyků, avšak obecně se jedná o problém daleko složitější čtení po jednotlivých znacích může být značně neefektivní ve srovnání se čtením po řádcích nebo po velkých blocích textu při čtení zdroje se může provádět jeho opis do výstupní tiskové soustavy doplněný o další získané informace při vkládání částí zdrojového textu z jiných souborů, práci s makrodefinicemi nebo podmíněném překladu je třeba tuto činnost provést samostatně předem nebo současně s lexikální analýzou během čtení znaků největším problémem je nutnost návratu zpět ve vstupním souboru po rozpoznání symbolu Teorie programovacích jazyků Přednáška 5: Lexikální analýza 18 / 32

Specifikace a rozpoznávání symbolů Při implementaci lexikálního analyzátoru vycházíme z popisu struktury jednotlivých lexikálních jednotek Tento popis může být v jednom z následujících tvarů slovní popis lineární nebo regulární gramatika přechodový graf konečného automatu regulární výraz Teorie programovacích jazyků Přednáška 5: Lexikální analýza 19 / 32

Implementace lexikálního analyzátoru Přímá implementace využití všech prostředků, které poskytuje implementační jazyk Implementace konečného automatu deterministický konečný automat se stavovým řízením Vytvoření konstruktorem nejvýhodnější popis struktury regulárním výrazy nejjednodušší, ale nejméně efektivní způsob implementace Teorie programovacích jazyků Přednáška 5: Lexikální analýza 20 / 32

Implementace lexikálního analyzátoru konečným automatem Navrhneme jazyky pro skupiny významových tokenů, které jsou výstupem lexikální analýzy jazyk identifikátorů (včetně klíčových slov) L id jazyk operátorů L op jazyk konstant L con jazyk řetězců L str jazyk ostatních symbolů L sym Navrhneme jazyky pro skupiny nevýznamových tokenů, které nejsou zahrnuty do výstupu lexikální analýzy jazyk komentářů L kom jazyk bílých znaků L bz Teorie programovacích jazyků Přednáška 5: Lexikální analýza 21 / 32

Implementace lexikálního analyzátoru konečným automatem Jazyk významových tokenů L vt = L id L op L con L str L sym Jazyk nevýznamových tokenů (oddělovačů) L od = L kom L bz Programovací jazyk L = (L od L vt) L od Dva významové tokeny mohou jít bezprostředně po sobě pouze tehdy, jsou-li různého typu, v opačném případě musí být odděleny alespoň jedním oddělovačem V každém kroku zpracuje lexikální analyzátor jazyk (L od L vt), na konci vstupu může být posloupnost oddělovačů L od Teorie programovacích jazyků Přednáška 5: Lexikální analýza 22 / 32

Implementace lexikálního analyzátoru Příklad návrh jazyka pracujícího s celými čísly Nejdříve navrhneme abecedu jazyka: Σ = {A,, Z, a,, z, 0,, 9, +,,, /, >, <, =, (, ), ;, :} Stanovíme potřebné lexikální jednotky: celá nezáporná čísla (pro konstanty) vyhrazená klíčová slova (BEGIN, END, VAR, CONST, IF, THEN, ELSE, PRINT) ostatní nerezervované identifikátory (proměnné) aritmetické operátory (+,,, /) relační operátory (<, <=, >, >=, <>, =) operátor přiřazení (:=) pomocné symboly (závorky, středník) Teorie programovacích jazyků Přednáška 5: Lexikální analýza 23 / 32

Implementace lexikálního analyzátoru Příklad pokračování Popíšeme navržený jazyk pomocí regulárních gramatik dílčích jazyků: Gramatika jazyka identifikátorů: G id = ({S id, A}, {l, d}, P, S id ) S id l la A l d la da Gramatika jazyka celých nezáporných čísel: G cis = ({S cis, B}, {d}, P, S cis ) S cis d db B d db Teorie programovacích jazyků Přednáška 5: Lexikální analýza 24 / 32

Implementace lexikálního analyzátoru Příklad pokračování Gramatika jazyka aritmetických operátorů: G ao = ({S ao }, {+,,, /}, P, S ao ) S ao + / Gramatika jazyka relačních operátorů: G ro = ({S ro, C, D}, {<, >, =}, P, S ro ) S ro < > = <C >D C = > D = Gramatika jazyka operátoru přiřazení: G op = ({S op, E}, {:, =}, P, S op ) S op :E E = Teorie programovacích jazyků Přednáška 5: Lexikální analýza 25 / 32

Implementace lexikálního analyzátoru Příklad pokračování Gramatika jazyka pomocných symbolů: G sym = ({S sym }, {(, ), ; }, P, S sym ) S sym ( ) ; Sestavíme jazyk významových tokenů a gramatiku, která jej generuje: L vt = L id L cis L ao L ro L op L sym G vt = ({S vt, S id, S cis, S ao, S ro, S op, S sym, A, B, C, D, E}, Σ, P, S vt ) S vt S id S cis S ao S ro S op S sym Dále sestavíme jazyk nevýznamových tokenů L od popsaný gramatikou G od = ({S od }, {L, }, P, S od ): S od L Teorie programovacích jazyků Přednáška 5: Lexikální analýza 26 / 32

Implementace lexikálního analyzátoru Příklad pokračování V každém kroku lexikální analyzátor zpracuje jazyk L = L od L vt, který lze intuitivně popsat (bezkontextovou) gramatikou G = (N, Σ, P, S): S S od S S vt Pro účely implementace analyzátoru konečným automatem bezkontextovou gramatiku využít nemůžeme, proto použijeme ekvivalentní lineární gramatiku G = (N, Σ, P, S): S LS S S vt Pokud povolíme existenci prázdného jazyka, tj. pokud ϵ L, přidáme nový startovací symbol S a nová pravidla S ϵ S. Nakonec odstraníme jednoduchá pravidla a dostaneme výslednou regulární gramatiku. Teorie programovacích jazyků Přednáška 5: Lexikální analýza 27 / 32

Implementace lexikálního analyzátoru Příklad pokračování Výsledná regulární gramatika lexikálního analyzátoru: G = ({S, A, B, C, D, E}, {l, d, +,,, /, <, >, =, :, (, ), ;, L, }, P, S) S LS S S l la d db + / < > = S <C >D :E ( ) ; A l d la da B d db C = > D = E = Teorie programovacích jazyků Přednáška 5: Lexikální analýza 28 / 32

Implementace lexikálního analyzátoru Příklad pokračování Převedeme gramatiku na nedeterministický konečný automat M = ({q S, q A, q B, q C, q D, q E, q F }, Σ, δ, q S, {q F }) δ l d + / < > = : ( ) ; L q S {q A, q F } {q B, q F } {q F } {q F } {q F } {q F } {q C, q F } {q D, q F } {q F } {q E} {q F } {q F } {q F } {q S} {q S } q A {q A, q F } {q A, q F } q B {q B, q F } q C {q F } {q F } q D {q F } q E {q F } q F Teorie programovacích jazyků Přednáška 5: Lexikální analýza 29 / 32

Implementace lexikálního analyzátoru Příklad pokračování Převedeme konečný automat na deterministický, odstraníme nepotřebné stavy: M = ({q S, q E, q F, q A F, q B F, q C F, q D F }, Σ, δ, q S, {q F, q A F, q B F, q C F, q D F }) δ l d + / < > = : ( ) ; L q S q A F q B F q F q F q F q F q C F q D F q F q E q F q F q F q S q S q E q F q F q A F q A F q A F q B F q B F q C F q F q F q D F q F Teorie programovacích jazyků Přednáška 5: Lexikální analýza 30 / 32

Implementace lexikálního analyzátoru Příklad pokračování d q A F l q C F l L qs < > + / = ( q D F > = = q F ) ; d : = qe q B F d Teorie programovacích jazyků Přednáška 5: Lexikální analýza 31 / 32

Realizace analyzátoru v program. jazyce Ze všech stavů automatu vytvoříme výčtový typ, z koncových stavů vytvoříme množinu V každém stavu automatu načteme ze zdrojového programu jeden znak a podle toho se rozhodneme, kterou větví pokračovat V koncovém stavu provedeme test korektního ukončení načteného symbolu načteme následující znak Pokud automat nenalezne větev, po které by pokračoval, a je v koncovém stavu, právě načetl jeden symbol a po analýze dalšího znaku (viz předchozí bod) se přesouvá do počátečního stavu q S Pokud automat nenalezne větev, po které by mohl pokračovat, a není v koncovém stavu, načtený znak je chybný a je ohlášena lexikální chyba Teorie programovacích jazyků Přednáška 5: Lexikální analýza 32 / 32