250 likes | 381 Vues
Definitie LL(1). Een grammatica is LL(1) Als je op grond van het eerstvolgende input-symbool kunt kiezen uit alternatieven. Formeel: Als de lookahead-sets van de alternatieven van elke nonterminal onderling disjunct zijn. S. N. . . x .
E N D
Definitie LL(1) Een grammatica is LL(1) • Als je op grond van het eerstvolgendeinput-symbool kunt kiezen uit alternatieven Formeel: • Als de lookahead-sets van dealternatieven van elke nonterminalonderling disjunct zijn
S N x Definitie Lookaheadset van alternatief N Lah(Nx) = {x} Lah(NP) = …… { x | S* N * x }
S N N x x Eigenschappen vanNonterminals … nodig om Lookahead-sets te bepalen • Empty(N) • First(N) • Follow(N) N*
Mag ambigu zijn • Hoofdstuk 10: LL1 Parsers type Parser ab = [a] (b, [a]) Eén oplossing LL1 ontleden • Hoofdstuk 3: Parser Combinators type Parser ab = [a][ (b, [a]) ]
Hoofdstuk 10: LL1 Parsers parse :: Gram s Parser s(Booms) Universele functie Universeel boomtype LL1 ontleden • Hoofdstuk 3: Parser Combinators symbol :: a Parser aa ( <|> ) :: Parser ab Parser ab Parser ab parseHaakjes :: Parser CharHaakjes parseExpr :: Parser CharExpr parseHaskTp :: Parser CharHaskTp
[ s ] [ ] Universeel ontleden parse :: Gram s Parser s(Booms) Wat hebben we nodig? • type Gram • type Boom • Functies op Gram terms nonterms startsym prods lookahead empty first follow • Gegeneraliseerde ontleedfunctie gen :: Gram s Parser s(Booms) s startsymbool
( ‘S’ , ) Type voor Grammatica’s type Prod s = (s, [s]) type Gram s = ( s, [Prod s] ) S A a S | B | C B A S C | B A| b C D D d S A a S S B S C B A S C A B A B b C D D d [ ( ‘S’, “A a S”) , ( ‘S’, “B” ) , ( ‘S’, “C B” ) , ( ‘A’, “S C” ) , ( ‘A’, “” ) , ( ‘B’, “A” ) , ( ‘B’, “b” ) , ( ‘C’, “D” ) , ( ‘D’, “d” ) ]
Binaire bomen data Tree a = Bin (Tree a) (Tree a) | Leafa • Gelabelde Binaire bomen data Tree a = Bina(Tree a) (Tree a) | Leafa • Gelabelde Multi-splitsende bomen data Tree a = Nodea [ Tree a ] | Leafa Type voor Ontleedbomen
Functies op grammatica’s ( ‘S’ , [ ( ‘S’, “A a S”) , ( ‘S’, “B” ) , ( ‘S’, “C B” ) , ( ‘A’, “S C” ) , ( ‘A’, “” ) , ( ‘B’, “A” ) , ( ‘B’, “b” ) , ( ‘C’, “D” ) , ( ‘D’, “d” ) ] ) start :: Gram s s start = fst prods :: Gram s [Prod s] prods = snd nonts :: Gram s [s] nonts = nub . map fst . prods terms :: Gram s [s] terms = nub . filter isT . concat . map snd . prods
Kan een NT epsilon genereren? empty :: Gram s s Bool • Waar kan een zin mee beginnen? N firsts :: Gram s s [s] firstsTab :: Gram s [(s , [s])] x Functies voor eigenschappen van een grammatica • Is de grammatica LL1 ? isLL1 :: Gram s Bool
S N x Functies voor eigenschappen van een grammatica • Wat zijn de lookahead-setsvan de producties ? lahP :: Gram s Prod s [s]
S De ontleed-functie parse gram = ( , )
[ , , , ] A B A x A B A [ , , , ] x De ontleed-functie genParse gram = ( , ) parse gram input | isLL1 gram = (t, rest) where ([t],rest) = genParse gram [start gram] input | otherwise = error
[ , , , ] A B A x A B A [ , , , ] x De ontleed-functie genParse gram = ( , ) genParse gram [ ] in = ( [ ], in ) genParse gram (a:as) in@(x:xs) | isT a && a==x = (t:ts, uit) where t = Node a [ ] (ts,uit) = genParse gram as xs
[ , , , ] A B A x A B A A [ , , , ] x rs De ontleed-functie genParse gram = ( , ) genParse gram (a:as) in@(x:xs) | isN a = (t:ts, uit) where t = Node a ks (ks,door) = genParse gram rs in (ts,uit) = genParse gram as door rs
Welke productie kiezen? genParse gram (a:as) in@(x:xs) | isN a = (t:ts, uit) where t = Node a ks (ks,door) = genParse gram rs in (ts,uit) = genParse gram as door rs where rs = snd ( hd ( filter ok (prods gram))) • ok p@(n,_) = n==a • && x lahP gram p
Bepalen van lookahead-setvan een productie empty A • lahP (SAaS) = firsts A {a} S A a S S B S C B A S C A B A B b C D D d empty S • lahP (ASC) = firsts S firsts C • lahP (BA) = firsts A follow B • lahP (CD) = firsts D • lahP (Dd) = {d}
Bepalen van lookahead-setvan een productie • Lookahead-set van een productie: • Verenig de firsts van de rechterkant… • …en ga door zolang ze empty kunnen zijn • Bereik je het eind:neem dan ook de follow van jezelf • lahP (SABCDE) = firsts A firsts B firsts C firsts D firsts E follow S
Bepalen van lookahead-setvan een productie • Lookahead-set van een productie: • Verenig de firsts van de rechterkant… • …en ga door zolang ze empty kunnen zijn • Bereik je het eind:neem dan ook de follow van jezelf • lahP (n,ys) = foldr f eind ys • where f y r = • eind = firsts y if empty y then r else [ ] follow n
In 0 stappen: • In 1 stap: • In 2 stappen: • In 3 stappen: • In 4 stappen: A A B A B S A B S Empty: kan een nonterminalepsilon genereren? S A a S S B S C B A S C A B A B b C D D d • Verandert niet meer, stop met zoeken
Herhaal zolang er iets verandert fixed f xs | xs==ys = xs | otherwise = fixed f ys where ys = f xs • Begin met lege set empty gram = fixed (stap gram) [ ] Empty: kan een nonterminalepsilon genereren? S A a SS B S C B A S C A B A B b C D D d stap gram xs = (prods gram))) nub (map fst (filter (\(n,rs) all (xs) rs)
In 0 stap: In 1 stap: In 0/1 stap: In 1/2 stap: In 0/1/2 stap: S A B C D a b d ABC S Ab D d SABC AS BAb CD Dd a b d SABCDb SABC SAb Dd d SABCDb SABC SABb CDd Dd a b d N x Firsts: wat kan een symboollinksonder genereren? • Herhaal zolang er iets verandert! S A a S S B S C B A S C A B A B b C D D d S A B C D a b d
Firsts: wat kan een symboollinksonder genereren? • Herhaal zolang er iets verandert firsts gram = fixed (stap gram) (single gram) single gram = (symbols gram) map (\x (x,[x])) stap gram ben = combine (single gram) (compose (first1 gram) ben ) first1 = …; compose = …; combine = …;
S N N x x Eigenschappen vanNonterminals … nodig om Lookahead-sets te bepalen • Empty(N) • First(N) • Follow(N) N*
Kan eindigen met non terminal Kan beginnen met terminal - ADC DC SABCD dba a dba d Follow: wat kan er volgenop een nonterminal? S A a S S B S C B A S C A B A B b C D D d S A a S S C B A S C A a A C S S a S B C