Definitie LL(1) Een grammatica is LL(1) nAls je op grond van het eerstvolgende input-symbool kunt kiezen uit alternatieven Formeel: nAls de lookahead-sets van de alternatieven van elke nonterminal onderling disjunct zijn
Definitie Lookaheadset van alternatief N S x N { x | S * N * x } Lah(N x ) = {x} Lah(N P ) = ……
Eigenschappen van Nonterminals … nodig om Lookahead-sets te bepalen nEmpty(N) nFirst(N) nFollow(N) N * S x N N
LL1 ontleden nHoofdstuk 3: Parser Combinators type Parser a b = [a] [ (b, [a]) ] nHoofdstuk 10: LL1 Parsers type Parser a b = [a] (b, [a]) Mag ambigu zijn Eén oplossing
LL1 ontleden nHoofdstuk 3: Parser Combinators parseHaakjes:: Parser Char Haakjes parseExpr:: Parser Char Expr parseHaskTp:: Parser Char HaskTp symbol :: a Parser a a ( ) :: Parser a b Parser a b Parser a b nHoofdstuk 10: LL1 Parsers parse:: Gram s Parser s (Boom s) Universele functie Universeel boomtype
Universeel ontleden Wat hebben we nodig? ntype Gram ntype Boom nFuncties op Gram parse:: Gram s Parser s (Boom s) gen:: Gram s Parser s (Boom s) s nGegeneraliseerde ontleedfunctie terms nonterms startsym prods lookahead empty first follow [ s ][] startsymbool
Type voor Grammatica’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” ) ] ( ‘S’, ) type Prod s = (s, [s]) type Gram s = ( s, [Prod s] )
Type voor Ontleedbomen nBinaire bomen data Tree a = Bin (Tree a) (Tree a) | Leaf a nGelabelde Binaire bomen data Tree a = Bin a (Tree a) (Tree a) | Leaf a nGelabelde Multi-splitsende bomen data Tree a = Node a [ Tree a ] | Leaf a
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
Functies voor eigenschappen van een grammatica nIs de grammatica LL1 ? isLL1 :: Gram s Bool nKan een NT epsilon genereren? empty :: Gram s s Bool x N nWaar kan een zin mee beginnen? firsts :: Gram s s [s] firstsTab :: Gram s [(s, [s])]
Functies voor eigenschappen van een grammatica nWat zijn de lookahead-sets van de producties ? lahP :: Gram s Prod s [s] S x N
De ontleed-functie S parse gram = (, )
De ontleed-functie [,,, ] A B x A x ABA genParse gram = (, ) parse gram input | isLL1 gram = (t, rest) where ([t],rest) = genParse gram [start gram] input | otherwise = error
De ontleed-functie [,,, ] A B x A x ABA genParse gram = (, ) genParse gram [ ] in = ( [ ], in ) genParse gram (a:as) | isT a && a==x= (t:ts, uit) wheret= Node a [ ] (ts,uit)= genParse gram as xs
De ontleed-functie [,,, ] A B x A x ABA genParse gram = (, ) genParse gram (a:as) | isN a = (t:ts, uit) wheret= Node a ks (ks,door)= genParse gram rs in (ts,uit)= genParse gram as door rs A
Welke productie kiezen? where rs = snd ( hd ( filter ok (prods gram))) genParse gram (a:as) | isN a = (t:ts, uit) wheret= Node a ks (ks,door)= genParse gram rs in (ts,uit)= genParse gram as door rs ok = n==a && x lahP gram p
Bepalen van lookahead-set van een productie S A a S S B S C B A S C A B A B b C D D d lahP (D d) = {d} lahP (C D) = firsts D lahP (S AaS) = firsts A {a} {a} lahP (A SC) = firsts S firsts C lahP (B A) = firsts A follow B empty A empty S
Bepalen van lookahead-set van een productie nLookahead-set van een productie: uVerenig de firsts van de rechterkant… u…en ga door zolang ze empty kunnen zijn uBereik je het eind: neem dan ook de follow van jezelf lahP (S ABCDE) = firsts A firsts B firsts C firsts D firsts E follow S
Bepalen van lookahead-set van een productie nLookahead-set van een productie: uVerenig de firsts van de rechterkant… u…en ga door zolang ze empty kunnen zijn uBereik je het eind: neem dan ook de follow van jezelf lahP (n,ys) = foldr f eind ys wheref y r = eind = firsts y follow n if empty y then r else [ ]
Empty: kan een nonterminal epsilon genereren? S A a S S B S C B A S C A B A B b C D D d nIn 0 stappen: A nIn 1 stap: A B nIn 2 stappen: A B S nIn 3 stappen: A B S nIn 4 stappen: nVerandert niet meer, stop met zoeken
Empty: kan een nonterminal epsilon genereren? S A a S S B S C B A S C A B A B b C D D d nHerhaal zolang er iets verandert fixed f xs| xs==ys= xs | otherwise= fixed f ys where ys = f xs nBegin met lege set empty gram = fixed (stap gram) [ ] stap gram xs = (prods gram))) (filter (\(n,rs) all ( xs) rs) (map fstnub
Firsts: wat kan een symbool linksonder genereren? S A a S S B S C B A S C A B A B b C D D d x N In 0 stap: SABCDabdSABCDabd ABC S Ab D d In 1 stap: SABC AS BAb CD Dd a b d In 0/1 stap: SABCDb SABC SAb Dd d In 1/2 stap: SABCDabdSABCDabd SABCDb SABC SABb CDd Dd a b d In 0/1/2 stap: nHerhaal zolang er iets verandert!
Firsts: wat kan een symbool linksonder genereren? nHerhaal zolang er iets verandert firsts gram = fixed (stap gram) (single gram) stap gram ben = single gram = (symbols gram) map (\x (x,[x])) (first1 gram)(composeben ) (single gram) combine first1 = …; compose = …; combine = …;
Eigenschappen van Nonterminals … nodig om Lookahead-sets te bepalen nEmpty(N) nFirst(N) nFollow(N) N * S x N N
Follow: wat kan er volgen op 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 a S B C Kan beginnen met terminal dba a dba d Kan eindigen met non terminal - ADC DC SABCD