Překladače 4. Lexikální analýza © Milan Keršlágerhttp://www.pslib.cz/ke/slajdy Obsah: ● vstupní formáty,symboly.

Slides:



Advertisements
Podobné prezentace
Pro začátek něco lehčího
Advertisements

Programování funkcí v Excelu
Jazyk VHDL Martin Štěpánek
Semestrální práce KIV/PT Martin Kales Hana Hůlová.
ALGO – Algoritmizace 1. cvičení
Algoritmy I. Cvičení č. 10.
Principy překladačů Mezikód Jakub Yaghob.
Programování v Pascalu Přednáška 7
Materiály k přednášce Úvod do programování Ondřej Čepek.
Lexikální a syntaktická analýza Jakub Yaghob
PHP PHP – základy syntaxe (část 1) - 03 Mgr. Josef Nožička IKT PHP
Algoritmizace a programování
Informatika I 3. přednáška
Jazyk vývojových diagramů
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Algoritmy a programovací techniky
Sémantická analýza Jakub Yaghob
Příklady jazyků Příklad 1: G=({S}, {0,1}, P, S)
Syntaxí řízený překlad
Gramatiky a jazyky Přednáška z předmětu Řízení v komplexních systémech
Algoritmy vyhledávání a řazení
Úvod do Pascalu. Co je Pascal? vyšší programovací jazyk poskytuje prostředky pro popis algoritmů, které odrážejí povahu řešených problémů, a nikoliv technickou.
JavaScript Podmínky, cykly a pole.
Cvičení.
3. Příkazy  Příkazy dělíme na jednoduché a strukturované.  Jednoduché příkazy - žádnou jejich dílčí částí neni příkaz - přiřazovací, vstupu a výstupu,
Konstanty u jsou datové objekty u jejich hodnoty nelze v programu měnit u Deklarace Const jméno = hodnota Příklad: Textový řetězec ZPRAVA Const ZPRAVA.
Datové typy a struktury
Programovací jazyk PASCAL
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Vztah bezkontextových jazyků a ZA
Dokumentace informačního systému
STROMY Datová struktura sestávající z uzlů
Regulární výrazy Regulární výrazy představují další možnost popisu regulárních jazyků (právě od nich dostaly své jméno). Definice: Množina všech regulárních.
10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Konečné automaty Vít Fábera.
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Gymnázium, Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Hodonín Úvod do programování.
Elektrotechnika Mikroprocesorová technika
Výrok „Vypadá to, že jsme narazili na hranici toho, čeho je možné dosáhnout s počítačovými technologiemi. Člověk by si ale měl dávat pozor na takováto.
ZÁKLADNÍ POJMY. ZDROJOVÝ TEXT PROGRAMU Tvoří: klíčová slova komentáře identifikátory.
doc. RNDr. Zdeněk Botek, CSc.
4. Typ pole 4.1 Jednorozměrná pole
Cvičení 3-4 Procedury, funkce,řetězce. Procedury Procedura Procedura Procedura je podprogram, který mění stav programu (změnou stavu proměnných nebo změnou.
Miroslav Beneš Dušan Kolář
Překladače Vnitřní struktura překladače © Milan Keršláger
Základy programování mikropočítačů První program v jazyce symbolických adres.
Překladače 6. Sémantická analýza
Programovací jazyk C# 4. část - cykly.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Výukový materiál zpracován v rámci projektu
Výukový materiál zpracován v rámci projektu
C# konzole – Podíl dvou čísel, podmínka IF
Výukový materiál zpracován v rámci projektu
Překladače 5. Syntaktická analýza
Výukový materiál zpracován v rámci projektu
Překladače Syntaktická analýza
Programovací jazyk C Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
Algoritmizace a programování
Překladače Lexikální analýza
Programování v jazyce C++
Operační systémy Vnitřní struktura překladače
Překladače 4. Lexikální analýza
Příkazy cyklu (1) Umožňují vícekrát (nebo ani jednou) pro-vést určitý příkaz Jazyk C rozlišuje příkaz cyklu: s podmínkou na začátku: obecný tvar: while.
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Překladače 6. Sémantická analýza
Cyklus for (1) Obecný tvar: for (výraz1; výraz2; výraz3) příkaz
Transkript prezentace:

Překladače 4. Lexikální analýza © Milan Keršlágerhttp:// Obsah: ● vstupní formáty,symboly ● syntaktické grafy ● rozpoznání jazyka konečným automatem ● implementace, příklady ● datové typy, převod čísla, řetězce

Lexikální analýza ● první fáze zpracování zdrojového kódu ● vstup: zdrojový kód programu ● zápis v nějakém programovacím jazyce – různé vstupní formáty – řeší se raději konverzními programy ● výstup: posloupnost symbolů ● atom, lexém, lexikální jednotka ● lexikální chyby

Lexikální chyby ● pouze v rámci jednoho symbolu ● neplatný znak – mimo alfanumerické znaky, avšak některé speciální ano ● neplatný identifikátor – název proměnné nesmí začínat číslem ● neplatný řetězec – chybějící ukončovací uvozovky

Vstupní formáty ● text ● holý text (plain text), jeden či více souborů – snadno čitelný, bez skrytých významů, case sensitive? ● vázaný text ● struktura používána k vytváření konstrukcí jazyka – odsazování v Pythonu, jeden příkaz = jeden řádek atp. ● binární formát ● typicky generovaný kód (návrhář formulářů) ● dynamická struktura v paměti ● produkt jiného programu

Symboly ● též atom, lexém, lexikální jednotka,... ● jsou to nejmenší části s vlastním významem ● klíčové slovo, číslo, operátor, název proměnné,... ● skládá se ze dvou částí ● název (identifikace symbolu) – S_BEGIN, S_NUM, S_PLUS, S_ID,... ● atribut (skutečná hodnota) – číslo, název proměnné,... – pozor na nevhodné atributy (typ operátoru) – → obtížnější určování priority operátorů

Příklad zpracování CONST pi=3.14; VAR obvod; BEGIN obvod:=2*pi*polomer;... END S_CONST S_IDpi S_EQ S_NUM3.14 S_SEM S_VAR S_IDobvod S_SEM S_BEGIN S_IDobvod S_IS S_NUM2 S_MUL S_IDpi S_MUL S_IDpolomer S_SEM... S_END // pro výstup záznamů // použit výčtový typ Tsymbol = record typ: TtypSymbolu; attr:string; end;

Skladba vstupu ● abeceda ● A..Z, a..z, 0..9, +, -, ×, /, >, <, =, (, ), ;, : ● rezervované identifikátory (klíčová slova) ● BEGIN, END, VAR, CONST, IF, THEN, ELSE,... ● ostatní identifikátory (názvy proměnných) ● operátory ● aritmetické, relační, přiřazení ● pomocné symboly ● závorky, středník,...

Syntaktické grafy ● slouží pro definici jazyka (v učebnicích) ● definuje jednotlivé lexikální symboly písme no číslo Symbol S_ID číslo Symbol S_NUM + Symbol S_PLUS <= Symbol S_LE

Rozpoznávání symbolů ● potřebujeme konečný deterministický automat ● na vstupu je řetězec znaků k analýze ● čtení znaků + změna vnitřního stavu automatu – lze využít výstupní pásku ● pro každý symbol má automat jiný koncový stav – po načtení celého vstupu zjistíme, jaký je to symbol ● nejprve zákres automatu ● kolečka značí stavy automatu ● šipky nesou symbol, který způsobí změnu stavu

Konečné automaty S S_I D písmeno Konečný automat pro S_ID písmeno číslo S S_N UM číslo Konečný automat pro S_NUM číslo S S_I S : Konečný automat pro S_IS S S_L T < Konečný automat pro relační operace A = S_L E S_N E > =

Rozpoznání jazyka automatem ● stavové diagramy pro všechny symboly ● využijeme syntaktické grafy ● vzniknou konečné deterministické automaty ● koncové stavy představují symboly ● shrneme všechny diagramy do jednoho ● sloučíme počáteční stavy pro všechna slova jazyka ● může vzniknout problém determinističnosti – jeden znak vede do dvou různých stavů – nejlépe jazyk, který toto nemá; nicméně lze vyřešit i jinak ● vzniká automat rozpoznávající jazyk

Činnost konečného automatu 1) v každém stavu se načte jeden další znak ● podle něho se rozhodne, kterou větví dále 2) v koncovém stavu ještě následující znak ● pro kontrolu správného ukončení symbolu 3) nenalezne-li se další větev → symbol? ● není větev, po které by se pokračovalo ● je v koncovém stavu → je to symbol (zapíšeme) 4) hlášení chyby ● není-li v koncovém stavu a není kam pokračovat

Zápis vystupujících symbolů ● holý text ● snadné hledání chyb lexikálního analyzátoru ● např. vázaný text ● pomalejší na zpracování ● binární soubor ● jednodušší načítání (např. pole nebo typ záznam) ● dynamická struktura v paměti ● vhodné pro přímé předání další fázi překladu ● dynamický seznam

Implementace automatu ● automat pro nekonečné jazyky ● obsahují identifikátory proměnných, čísla, řetězce... ● těmi běžně programujeme ● automat pro konečné jazyky ● používá se na rozlišení klíčových slov ● kombinujeme oba přístupy 1) jako nekonečné jazyky → vše je identifikátor 2) konečné jazyky → není identifikátor klíčové slovo?

Vstup analyzátoru ● ve formě textového souboru ● čtení po znacích není efektivní ● čteme po řádcích – řádek do záznamu – včetně čísla řádku, délky a pozice čteného znaku ● type Tznak = record rad: string;// zpracovávaný řádek pozice: byte;// pozice posl. načt. znaku delka: byte;// délka řádku cislo: word;// číslo řádku (pro chyb. hláš.) end;

Výstup analyzátoru ● lexikální analyzátor jako funkce ● každé zavolání funkce vrátí jeden symbol – symbol předán na vstup syntaktického analyzátoru ● výstupní symboly do výčtového typu – vystupující název symbolu bude index do výčtu – atribut bude řetězec ● type TTypSymbolu = (S_BEGIN,...) ● Tsymbol = record typ: TTypSymbolu;// index atrib: string;// atribut ● end;

Metody programování ● přímé stavové programování ( nekonečné jazyky ) ● změna stavu vyjádřena místem v programu ● tj. algoritmus sleduje strukturu jazyka ● tabulka přechodů ( konečné jazyky ) ● změna stavu je změnou pozice v tabulce ● obecně naprogramovaný automat ● stav reprezentován proměnnou ( konečné jazyky ) ● variace na tabulku

Stavové programování ● po načtení znaku ● změna stavu → příkaz switch (case) ● načtení nemění stav (smyčka) → while ● při změně struktury jazyka: → nutné měnit kód programu ● smyčka nesmí být přes více, než 1 stav ● v kódu programu nelze couvat (tj. vrátit se do výše položeného místa) → GOTO?

Příklad: stavové programování

Tabulka přechodů ● pro regulární gramatiku ● pravidla ve tvaru: A → aB nebo A → a – velká písmena: neterminály, malá: terminální symboly ● různé neterminály označují různé stavy ● použijeme-li indexy → řádky tabulky ● terminální symboly → sloupce ● při výpočtu se mění pozice v matici ● čísla uvnitř matice → číslo nového stavu ● je to nejobecněji naprogramovaný automat ● změna v jazyce mění pouze tabulku, ne však kód

Příklad: tabulka přechodů

Příklad: tabulka přechodů (kód)

Stav reprezentován proměnnou ● pro konečné, ale i nekonečné jazyky ● přechod do jiného stavu je přímo v kódu ● změna jazyka mění kód automatu ● odpadají velké tabulky v paměti → dají se však realizovat řídkými maticemi ● to však dále komplikuje kód lexikálního analyzátoru ● čtení vstupu pomocí smyčky while ● příkaz switch zajistí různé stavy ● jednotlivé case řeší přechody do jiného stavu

Příklad: stav pomocí proměnné

Datové typy ● dosud uvažována jen celá kladná čísla ● reálná čísla, řetězce, výčtové typy, pole, pointery... ● lexikální analýza to nemusí řešit, ale: ● konstanty se řeší již v lexikální analýze ● jako by přibylo další klíčové slovo ● ovlivňují analýzu dynamicky (za běhu) ● reprezentace v atributu symbolu ● číslo jako řetězec ● převod na vhodnou binární reprezentaci

Převod čísla na binární tvar ● buď v lexikální nebo sémantické analýze ● číslo načteme jako řetězec ● volíme cílový datový typu ● prostorově nejnáročnější (reálné, komplexní) ● prostorově nejúspornější – nutná bližší analýza (znaménko?, mezní hranice?, E?) ● problém reprezentace na dané architektuře – integer 4 bajty na 32bitovém CPU, ale 8 bajtů na 64bit. – může způsobit nepřenositelnost programu

Řetězce ● důležitá je jen délka řetězce ● optimalizace prostorové náročnosti ● někdy (jazyk C) lze řetězec na více řádků ● můžeme složit dohromady ● nezabýváme se však spojováním řetězců ● tzv. zřetězení → syntaktická analýza ● nicméně lze v primitivních případech

Pole, záznamy ● jde jen o zadávání polí a záznamů ● každý jazyk definuje jinak ● příliš komplikované a sofistikované ● není to úloha pro lexikální analýzu ● předáváme dál v rozloženém tvaru ● jako jednotlivé symboly