Presentation is loading. Please wait.

Presentation is loading. Please wait.

Parsing V LR(1) Parsers. LR(1) Parsers LR(1) parsers are table-driven, shift-reduce parsers that use a limited right context (1 token) for handle recognition.

Similar presentations


Presentation on theme: "Parsing V LR(1) Parsers. LR(1) Parsers LR(1) parsers are table-driven, shift-reduce parsers that use a limited right context (1 token) for handle recognition."— Presentation transcript:

1 Parsing V LR(1) Parsers

2 LR(1) Parsers LR(1) parsers are table-driven, shift-reduce parsers that use a limited right context (1 token) for handle recognition LR(1) parsers recognize languages that have an LR(1 ) grammar Informal definition: A grammar is LR(1) if, given a rightmost derivation S   0   1   2  …   n–1   n  sentence We can 1. isolate the handle of each right-sentential form  i, and 2. determine the production by which to reduce, by scanning  i from left-to-right, going at most 1 symbol beyond the right end of the handle of  i

3 LR(1) Parsers A table-driven LR(1) parser looks like Tables can be built by hand However, this is a perfect task to automate Scanner Table-driven Parser A CTION & G OTO Tables Parser Generator source code grammar IR

4 LR(1) Skeleton Parser stack.push( INVALID ); stack.push(s 0 ); not_found = true; token = scanner.next_token(); do while (not_found) { s = stack.top(); if ( ACTION[s,token] == “reduce A  ” ) then { stack.popnum(2*|  |); // pop 2*|  | symbols s = stack.top(); stack.push(A); stack.push(GOTO[s,A]); } else if ( ACTION[s,token] == “shift s i ” ) then { stack.push(token); stack.push(s i ); token  scanner.next_token(); } else if ( ACTION[s,token] == “accept” & token == EOF ) ‏ then not_found = false; else report a syntax error and recover; } report success; The skeleton parser uses ACTION & GOTO tables does |words| shifts does |derivation| reductions does 1 accept detects errors by failure of 3 other cases

5 To make a parser for L(G), need a set of tables The grammar The tables LR(1) Parsers (parse tables) ‏ Remember, this is the left-recursive SheepNoise; EaC shows the right- recursive version.

6 Example Parse 1 The string “baa”

7 Example Parse 1 The string “baa”

8 Example Parse 1 The string “baa”

9 Example Parse 1 The string “baa”

10 Example Parse 2 The string “baa baa ”

11 Example Parse 2 The string “baa baa ”

12 Example Parse 2 The string “baa baa ”

13 Example Parse 2 The string “baa baa ”

14 LR(1) Parsers How does this LR(1) stuff work? Unambiguous grammar  unique rightmost derivation Keep upper fringe on a stack  All active handles include top of stack (TOS) ‏  Shift inputs until TOS is right end of a handle Language of handles is regular (finite) ‏  Build a handle-recognizing DFA  A CTION & G OTO tables encode the DFA To match subterm, invoke subterm DFA & leave old DFA ’s state on stack Final state in DFA  a reduce action  New state is G OTO[state at TOS (after pop), lhs]  For SN, this takes the DFA to s 1 S0S0 S3S3 S2S2 S1S1 baa SN Control DFA for SN Reduce action

15 Building LR(1) Parsers How do we generate the A CTION and G OTO tables? Use the grammar to build a model of the DFA Use the model to build A CTION & G OTO tables If construction succeeds, the grammar is LR(1) ‏ The Big Picture Model the state of the parser Use two functions goto( s, X ) and closure( s ) ‏  goto() is analogous to Delta() in the subset construction  closure() adds information to round out a state Build up the states and transition functions of the DFA Use this information to fill in the A CTION and G OTO tables Terminal or non-terminal

16 LR(k) items The LR(1) table construction algorithm uses LR(1) items to represent valid configurations of an LR(1) parser An LR(k) item is a pair [ P,  ], where P is a production A  with a at some position in the rhs  is a lookahead string of length ≤ k (words or EOF ) ‏ The in an item indicates the position of the top of the stack [ A  ,a] means that the input seen so far is consistent with the use of A  immediately after the symbol on top of the stack, i.e., this item is a “possibility” [A  ,a] means that the input sees so far is consistent with the use of A  at this point in the parse, and that the parser has already recognized , i.e., this item is “partially complete” [A ,a] means that the parser has seen , and that a lookahead symbol of a is consistent with reducing to A, i.e., this item is “complete”

17 LR(1) Items The production A  , where  = B 1 B 1 B 1 with lookahead a, can give rise to 4 items [A B 1 B 2 B 3,a], [A  B 1B 2 B 3,a], [A  B 1 B 2B 3,a], & [A  B 1 B 2 B 3,a] The set of LR(1) items for a grammar is finite What’s the point of all these lookahead symbols? Carry them along to choose the correct reduction, if there is a choice Lookaheads are bookkeeping, unless item has at right end  Has no direct use in [A   ,a]  In [A  ,a], a lookahead of a implies a reduction by A    For { [A  ,a],[B   ,b] }, a  reduce to A; F IRST (  )  shift  Limited right context is enough to pick the actions

18 High-level overview  Build the canonical collection of sets of LR(1) Items, I aBegin in an appropriate state, s 0  [S’  S, EOF ], along with any equivalent items  Derive equivalent items as closure( s 0 ) ‏ bRepeatedly compute, for each s k, and each X, goto(s k,X) ‏  If the set is not already in the collection, add it  Record all the transitions created by goto( ) ‏ This eventually reaches a fixed point 2Fill in the table from the collection of sets of LR(1) items The canonical collection completely encodes the transition diagram for the handle-finding DFA LR(1) Table Construction

19 Back to Finding Handles Revisiting an issue from last class Parser in a state where the stack (the fringe) was Expr – Term With lookahead of * How did it choose to expand Term rather than reduce to Expr? Lookahead symbol is the key With lookahead of + or –, parser should reduce to Expr With lookahead of * or /, parser should shift Parser uses lookahead to decide All this context from the grammar is encoded in the handle recognizing mechanism

20 Back to x – 2 * y 1. Shift until TOS is the right end of a handle 2. Find the left end of the handle & reduce Remember this slide from last lecture? shift here reduce here

21 Computing F IRST Sets Define F IRST as If   * a , a  T,   (T  NT)*, then a  F IRST (  ) ‏ If   * , then   F IRST (  ) ‏ Note: if  = X , F IRST (  ) = F IRST ( X) ‏ To compute F IRST Use a fixed-point method F IRST (A)  2 (T   ) ‏ Loop is monotonic  Algorithm halts

22 Computing Closures Closure(s) adds all the items implied by items already in s Any item [A   B ,a] implies [B  ,x] for each production with B on the lhs, and each x  F IRST (  a) ‏ Since  B  is valid, any way to derive  B  is valid, too The algorithm Closure( s ) ‏ while ( s is still changing ) ‏  items [A  B ,a]  s  productions B    P  b  F IRST (  a) //  might be  if [B  ,b]  s then add [B  ,b] to s  Classic fixed-point method  Halts because s  I TEMS  Worklist version is faster Closure “fills out” a state

23 Example From SheepNoise Initial step builds the item [Goal  SheepNoise, EOF ] and takes its closure( ) ‏ Closure( [Goal  SheepNoise, EOF ] ) ‏ So, S 0 is { [Goal  SheepNoise,EOF], [SheepNoise  SheepNoise baa,EOF], [SheepNoise  baa,EOF], [SheepNoise  SheepNoise baa,baa], [SheepNoise  baa,baa] }

24 Computing Gotos Goto(s,x) computes the state that the parser would reach if it recognized an x while in state s Goto( { [A   X ,a] }, X ) produces [A   X ,a] (obviously) ‏ It also includes closure( [A   X ,a] ) to fill out the state The algorithm Goto( s, X ) ‏ new  Ø  items [A X ,a]  s new  new  [A  X ,a] return closure(new) ‏  Straightforward computation  Uses closure ( ) ‏ Goto() moves forward

25 Example from SheepNoise S 0 is { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  baa, EOF ], [SheepNoise  SheepNoise baa,baa], [SheepNoise  baa,baa] } Goto( S 0, baa ) ‏ Loop produces Closure adds nothing since is at end of rhs in each item In the construction, this produces s 2 { [SheepNoise  baa, { EOF,baa}]} New, but obvious, notation for two distinct items [SheepNoise  baa, EOF] & [SheepNoise  baa, baa]

26 Example from SheepNoise S 0 : { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  baa, EOF ], [SheepNoise  SheepNoise baa, baa], [SheepNoise  baa, baa] } S 1 = Goto(S 0, SheepNoise ) = { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] } S 2 = Goto(S 0, baa ) = { [SheepNoise  baa, EOF ], [SheepNoise  baa, baa] } S 3 = Goto(S 1, baa ) = { [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] }

27 Building the Canonical Collection Start from s 0 = closure( [S’  S, EOF ] ) ‏ Repeatedly construct new states, until all are found The algorithm s 0  closure ( [S’  S,EOF] ) ‏ S  { s 0 } k  1 while ( S is still changing ) ‏  s j  S and  x  ( T  NT ) ‏ s k  goto(s j,x) ‏ record s j  s k on x if s k  S then S  S  s k k  k + 1  Fixed-point computation  Loop adds to S  S  2 ITEMS, so S is finite Worklist version is faster

28 Example from SheepNoise Starts with S 0 S 0 : { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  baa, EOF ], [SheepNoise  SheepNoise baa, baa], [SheepNoise  baa, baa] }

29 Example from SheepNoise Starts with S 0 S 0 : { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  baa, EOF ], [SheepNoise  SheepNoise baa, baa], [SheepNoise  baa, baa] } Iteration 1 computes S 1 = Goto(S 0, SheepNoise ) = { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] } S 2 = Goto(S 0, baa ) = { [SheepNoise  baa, EOF ], [SheepNoise  baa, baa] }

30 Example from SheepNoise Starts with S 0 S 0 : { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  baa, EOF ], [SheepNoise  SheepNoise baa, baa], [SheepNoise  baa, baa] } Iteration 1 computes S 1 = Goto(S 0, SheepNoise ) = { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] } S 2 = Goto(S 0, baa ) = { [SheepNoise  baa, EOF ], [SheepNoise  baa, baa] } Iteration 2 computes S 3 = Goto(S 1, baa ) = { [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] }

31 Example from SheepNoise Starts with S 0 S 0 : { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  baa, EOF ], [SheepNoise  SheepNoise baa, baa], [SheepNoise  baa, baa] } Iteration 1 computes S 1 = Goto(S 0, SheepNoise ) = { [Goal  SheepNoise, EOF ], [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] } S 2 = Goto(S 0, baa ) = { [SheepNoise  baa, EOF ], [SheepNoise  baa, baa] } Iteration 2 computes S 3 = Goto(S 1, baa ) = { [SheepNoise  SheepNoise baa, EOF ], [SheepNoise  SheepNoise baa, baa] } Nothing more to compute, since is at the end of every item in S 3.


Download ppt "Parsing V LR(1) Parsers. LR(1) Parsers LR(1) parsers are table-driven, shift-reduce parsers that use a limited right context (1 token) for handle recognition."

Similar presentations


Ads by Google