Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Překladače Syntaktická analýza
© Milan Keršláger
2
Syntaktická analýza druhá fáze zpracování zdrojového kódu
vstup: posloupnost symbolů dodává lexikální analyzátor výstup: derivační strom postihuje strukturu programu syntaktické chyby nesprávná posloupnost symbolů 13:=celkem nebo if a=1 else y:=x then y=a+1
3
Derivační strom derivační strom derivace v gramatice G
je orientovaný acyklický graf s jediným kořenem do všech všech uzlů vstupuje 1 hrana (kromě kořene) kořen je ohodnocen startovacím symbolem gramatiky koncové uzly stromu → terminální symbol nebo ε ε – prázdný řetězec ostatní uzly ohodnoceny neterminálními symboly koncové uzly čtené zleva doprava tvoří větnou formu v gramatice G derivační strom tvoříme zleva doprava a shora dolů, proto není potřeba značit orientaci hran
4
Příklad Máme bezkontextovou gramatiku G s pravidly P:
G = ({S},{n,i,+,*},P,S) P = S→S+S | S*S | n | i Odvodíme větu n+n*i třemi různými derivacemi: D1: S → S*S → S+S*S → n+S*S → n+n*S → n+n*i D2: S → S*S → S+S*S → n+S*S → S+n*i → n+n*i D3: S → S*S → S+S*S → n+S*S → n+n*S → n+n*i
5
Derivační stromy (z příkladu výše)
* S S + S S + S i n S * S n n n i Derivace D1 a D2 Derivace D3
6
Determinismus pro tutéž větu může existovat více der. stromů
viz výše D1 a D3 různé derivace mohou mít stejný der. strom viz výše D1 a D2 → nedeterministický postup naprosto nevhodné pro programování algoritmus musí být deterministický determinismus → jednoznačnost gramatiky programovací jazyky bohužel takové nejsou gramatiky pro ně jsou víceznačné
7
Víceznačnost gramatiky
jednoznačná pro každý terminální řetězec generovaný gramatikou existuje jeden derivační strom špatně se hledají víceznačná gramatika existuje terminální řetězec patřící do jazyka gramatiky, ke kterému lze sestrojit více der. stromů jednoznačnost dosáhneme stanovením dodatečných podmínek pro vytvoření derivace levá derivace → v řetězci přepisujeme nejlevější neterminál pravá derivace → přepisujeme terminál nejvíce vpravo
8
Metody syntaktické analýzy
metodu syntaktické analýzy definujeme podle postupu konstrukce derivačního stromu: metoda shora dolů (Top-Down) konstruujeme od kořene k listům a zleva doprava metoda zdola nahoru (Bottom-Up) postupujeme od listů ke kořeni a zleva doprava
9
Příklad S → AB 1 A → aAb | ab 2, 3 B → cB | c 4, 5
přepisovací pravidla čísla pravidel S → AB 1 A → aAb | ab 2, 3 B → cB | c 4, 5 pro obě metody odvodíme aabbcc stačí ukládat čísla použitých pravidel zjednodušení výstupu syntaktické analýzy není nutné mít v paměti celý strom volbou použité metody definujeme LP derivaci → posloupnost je jednoznačná
10
Metoda shora dolů pravidla: S → AB 1 A → aAb | ab 2, 3 B → cB | c 4, 5
S → AB → aAbB → aabbB → aabbcB → aabbcc levý rozklad: 1, 2, 3, 4, 5 (použita levá derivace) derivační strom na následujícím obrázku
12
Metoda zdola nahoru pravidla: S → AB 1 A → aAb | ab 2, 3
B → cB | c 4, 5 S → AB → AcB → Acc → aAbcc → aabbcc pravý rozklad je obrácená posloupnost pravidel protože zprava doleva, ale automat čte zleva doprava automat tedy postup obrací (než je potřeba ke generování věty) pravý rozklad: 3, 2, 5, 4, 1 (použita pravá derivace) derivační strom na následujícím obrázku
13
S → AB → AcB → Acc → aAbcc → aabbcc
14
Otázka jednoznačnosti
při analýze programu však postupujeme opačně máme větnou formu a hledáme pravidla program musí být deterministický existují však pravidla se stejnou levou stranou máme dvě možnosti analýza s návratem vyzkoušíme jedno z pravidel a když problém, vrátíme se příliš pomalé deterministická analýza nahlížení na další znak, kontrola (celého) zásobníku používá se běžně
15
Pomocné množiny FIRST(α)
α je libovolná větná forma generovaná gramatikou G FIRST je množina terminálních symbolů, jimiž začínají řetězce derivované z α (terminály i neterminály) pokud existuje pravidlo α → *ε, pak ε patří do FIRST FOLLOW(A) A je neterminál gramatiky G FOLLOW je množina terminálních symbolů a, které se mohou vyskytovat bezprostředně vpravo od A existuje tedy derivace S → *βAaγ pokud je A ukončující, do FOLLOW též $ (konec vstupu) určuje se vždy pro všechny neterminály (mny. jsou vzájemně závislé)
16
FIRSTK a FOLLOWK pro složitější gramatiky
k určuje délku terminálních řetězců řazených do hledané množiny bez indexu uvažujeme k=1 u vyšších čísel nese množina více informací FIRST(Ba) – začínající na c nebo a FIRST2(BA) – umí například omezit začínající na c tak, že víme, že to může být cc nebo ca, ale ne však cb
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.