Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Překladače 4. Lexikální analýza

Podobné prezentace


Prezentace na téma: "Překladače 4. Lexikální analýza"— Transkript prezentace:

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

2 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

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

4 Vstupní formáty text prostý 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

5 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ů

6 Příklad zpracování CONST pi=3.14; VAR obvod; BEGIN
obvod:=2*pi*polomer; ... END S_CONST S_ID pi S_EQ S_NUM 3.14 S_SEM S_VAR S_ID obvod S_BEGIN S_IS S_NUM 2 S_MUL S_ID polomer ... S_END // pro uložení výstupů // použit výčtový typ Tsymbol = record typ: TtypSymbolu; attr: string; end;

7 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, ...

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

9 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

10 Konečné automaty S S_ID S : A < S S S_LT > = = S_IS S_NE S_LE
písmeno číslo číslo písmeno číslo S S_ID S S_NUM Konečný automat pro S_ID Konečný automat pro S_NUM : A < S S S_LT > = = S_IS S_NE S_LE Konečný automat pro S_IS Konečný automat pro relační operace

11 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

12 Činnost konečného automatu
v každém stavu se načte jeden další znak podle něho se rozhodne, kterou větví dále v koncovém stavu ještě následující znak pro kontrolu správného ukončení symbolu 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) hlášení chyby není-li v koncovém stavu a není kam pokračovat

13 Zápis vystupujících symbolů
prostý 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

14 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 jako nekonečné jazyky → vše je identifikátor konečné jazyky → není identifikátor klíčové slovo?

15 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;

16 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;

17 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

18 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?

19 Příklad: stavové programování (1)

20 Příklad: stavové programování (2)

21 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

22 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

23 Uplatnění metod výběr metody podle typů symbolů
přímé stavové programování je-li načtený symbol identifikátorem, je potřeba zjistit, zda to není klíčové slovo → tabulka přechodů → stav reprezentován proměnnou nevhodné je prosté porovnání řetězců řetězec se porovnává tolikrát, kolik je klíčových slov další dvě metody mají větší prostorovou složitost tj. větší nároky na paměť

24 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

25 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

26 Reprezentace dat (1) některé jazyky nestanovují pevně (C)
→ problémy s přenositelností, → sizeof() celé číslo se znaménkem (integer) 2 bajty, nejvyšší bit je znaménko, celé číslo bez znaménka (word) 2 bajty, celé číslo se znaménkem (short) 1 bajt, celé číslo bez znaménka (byte, char)

27 Reprezentace dat (2) dlouhé celé číslo (long) 32 bitů (+-2 miliardy)
velmi dlouhé číslo (long long) 64 bitů ( ) racionální číslo (float) 32 bitů, -5,0...5,0 racionální s dvojitou přesností (double) 64 bitů, -5,0...5,0 velmi dlouhé racionální číslo (long double) 80 bitů, -5,0...5,0

28 Ř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 "Ahoj"+" "+"světe" nicméně lze v primitivních případech

29 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


Stáhnout ppt "Překladače 4. Lexikální analýza"

Podobné prezentace


Reklamy Google