Fall Compiler Principles Lecture 4: Parsing part 3

Slides:



Advertisements
Similar presentations
A question from last class: construct the predictive parsing table for this grammar: S->i E t S e S | i E t S | a E -> B.
Advertisements

Lesson 8 CDT301 – Compiler Theory, Spring 2011 Teacher: Linus Källberg.
Compiler construction in4020 – lecture 4 Koen Langendoen Delft University of Technology The Netherlands.
Compilation (Semester A, 2013/14) Lecture 6a: Syntax (Bottom–up parsing) Noam Rinetzky 1 Slides credit: Roman Manevich, Mooly Sagiv, Eran Yahav.
Compiler Principles Fall Compiler Principles Lecture 4: Parsing part 3 Roman Manevich Ben-Gurion University.
Joey Paquet, 2000, 2002, 2008, Lecture 7 Bottom-Up Parsing II.
Mooly Sagiv and Roman Manevich School of Computer Science
Bhaskar Bagchi (11CS10058) Lecture Slides( 9 th Sept. 2013)
Theory of Compilation Erez Petrank Lecture 3: Syntax Analysis: Bottom-up Parsing 1.
Predictive Parsing l Find derivation for an input string, l Build a abstract syntax tree (AST) –a representation of the parsed program l Build a symbol.
6/12/2015Prof. Hilfinger CS164 Lecture 111 Bottom-Up Parsing Lecture (From slides by G. Necula & R. Bodik)
Lecture #8, Feb. 7, 2007 Shift-reduce parsing,
Chapter 4-2 Chang Chi-Chung Bottom-Up Parsing LR methods (Left-to-right, Rightmost derivation)  LR(0), SLR, Canonical LR = LR(1), LALR Other.
1 LR parsing techniques SLR (not in the book) –Simple LR parsing –Easy to implement, not strong enough –Uses LR(0) items Canonical LR –Larger parser but.
Table-driven parsing Parsing performed by a finite state machine. Parsing algorithm is language-independent. FSM driven by table (s) generated automatically.
Bottom-up parsing Goal of parser : build a derivation
Syntax and Semantics Structure of programming languages.
410/510 1 of 21 Week 2 – Lecture 1 Bottom Up (Shift reduce, LR parsing) SLR, LR(0) parsing SLR parsing table Compiler Construction.
CS 321 Programming Languages and Compilers Bottom Up Parsing.
CMSC 331, Some material © 1998 by Addison Wesley Longman, Inc. 1 Chapter 4 Chapter 4 Bottom Up Parsing.
Syntactic Analysis Natawut Nupairoj, Ph.D. Department of Computer Engineering Chulalongkorn University.
11 Outline  6.0 Introduction  6.1 Shift-Reduce Parsers  6.2 LR Parsers  6.3 LR(1) Parsing  6.4 SLR(1)Parsing  6.5 LALR(1)  6.6 Calling Semantic.
Chapter 3-3 Chang Chi-Chung Bottom-Up Parsing LR methods (Left-to-right, Rightmost derivation)  LR(0), SLR, Canonical LR = LR(1), LALR 
Syntax and Semantics Structure of programming languages.
Compilation /15a Lecture 5 1 * Syntax Analysis: Bottom-Up parsing Noam Rinetzky.
1 Syntax Analysis Part II Chapter 4 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2005.
Compiler Principles Winter Compiler Principles Syntax Analysis (Parsing) – Part 3 Mayer Goldberg and Roman Manevich Ben-Gurion University.
Compiler Principles Fall Compiler Principles Lecture 5: Parsing part 4 Roman Manevich Ben-Gurion University.
Bernd Fischer RW713: Compiler and Software Language Engineering.
Bottom Up Parsing CS 671 January 31, CS 671 – Spring Where Are We? Finished Top-Down Parsing Starting Bottom-Up Parsing Lexical Analysis.
Bottom-Up Parsing Algorithms LR(k) parsing L: scan input Left to right R: produce Rightmost derivation k tokens of lookahead LR(0) zero tokens of look-ahead.
1 Syntax Analysis Part II Chapter 4 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2007.
Lecture 5: LR Parsing CS 540 George Mason University.
Compilers: Bottom-up/6 1 Compiler Structures Objective – –describe bottom-up (LR) parsing using shift- reduce and parse tables – –explain how LR.
Bottom-up parsing. Bottom-up parsing builds a parse tree from the leaves (terminals) to the start symbol int E T * TE+ T (4) (2) (3) (5) (1) int*+ E 
1 Chapter 6 Bottom-Up Parsing. 2 Bottom-up Parsing A bottom-up parsing corresponds to the construction of a parse tree for an input tokens beginning at.
Conflicts in Simple LR parsers A SLR Parser does not use any lookahead The SLR parsing method fails if knowing the stack’s top state and next input token.
Chapter 8. LR Syntactic Analysis Sung-Dong Kim, Dept. of Computer Engineering, Hansung University.
Syntax and Semantics Structure of programming languages.
Compiler Principles Fall Compiler Principles Lecture 5: Parsing part 4 Roman Manevich Ben-Gurion University.
Programming Languages Translator
Compiler design Bottom-up parsing Concepts
Bottom-Up Parsing.
Unit-3 Bottom-Up-Parsing.
UNIT - 3 SYNTAX ANALYSIS - II
Table-driven parsing Parsing performed by a finite state machine.
Compiler Construction
Compiler design Bottom-up parsing: Canonical LR and LALR
Bottom-Up Syntax Analysis
Syntax Analysis Part II
Fall Compiler Principles Lecture 4: Parsing part 3
Subject Name:COMPILER DESIGN Subject Code:10CS63
LR Parsing – The Tables Lecture 11 Wed, Feb 16, 2005.
4d Bottom Up Parsing.
Parsing #2 Leonidas Fegaras.
Lecture 4: Syntax Analysis: Botom-Up Parsing Noam Rinetzky
Lecture 8 Bottom Up Parsing
Compilers Principles, Techniques, & Tools Taught by Jing Zhang
Compiler Design 7. Top-Down Table-Driven Parsing
Bottom Up Parsing.
Parsing #2 Leonidas Fegaras.
Fall Compiler Principles Lecture 4: Parsing part 3
Kanat Bolazar February 16, 2010
Announcements HW2 due on Tuesday Fall 18 CSCI 4430, A Milanova.
Parsing Bottom-Up LR Table Construction.
Parsing Bottom-Up LR Table Construction.
Chap. 3 BOTTOM-UP PARSING
4d Bottom Up Parsing.
Compiler design Bottom-up parsing: Canonical LR and LALR
Presentation transcript:

Fall 2015-2016 Compiler Principles Lecture 4: Parsing part 3 Roman Manevich Ben-Gurion University

Tentative syllabus Front End Intermediate Representation Optimizations Scanning Top-down Parsing (LL) Bottom-up Parsing (LR) Intermediate Representation Operational Semantics Lowering Optimizations Dataflow Analysis Loop Optimizations Code Generation Register Allocation Instruction Selection

Previously Top-down parsing Recursive descent Handling conflicts LL(k) via pushdown automata

Agenda Shift-reduce (LR) parsing model Building the LR parsing table Types of conflicts

Shift-reduce parsing

Some terminology The opposite of derivation is called reduction Let A  α be a production rule Let βAµ be a sentential form A reduction replaces α with A: βαµ  βAµ A handle is a substring of a sentential form that is reduced during a series of steps in a rightmost derivation

Using shift and reduce to parse E  E + (E) E  i action Input Stack shift 1 + (2) + (3) reduce + (2) + (3) 1 E (2) + (3) E + 2) + (3) E + ( ) + (3) E + (2 E + (E + (3) E + (E) (3) 3) ) E + (3 accept On each step we either: - shift a symbol from the input to the stack, or - reduce symbols on the stack

How will the parser know what to do? A state will keep the info gathered so far A stack will maintain formerly reduced handles and partially reduced handles A table will tell it “what to do” based on Current state, Symbol on top of stack, and k-next tokens (k≥0)

Model of an LR parser Input Parser table Stack Output $ id + LR Parsing program State Output Parser table

States and LR(0) items E  E * B | E + B | B B  0 | 1 The state will “remember” the potential derivation rules given the part that was already identified For example, if we have already identified E then the state will remember the two alternatives: (1) E  E * B, (2) E  E + B Actually, we will also remember where we are in each of them: (1) E  E ● * B, (2) E  E ● + B A derivation rule with a location marker is called an LR(0) item The state is actually a set of LR(0) items For example: q13 = { E  E ● * B , E  E ● + B}

Intuition We gather the input token by token until we find a right-hand side of a rule and then we replace it with the nonterminal on the left side Going over a token and remembering it in the stack is a shift Each shift moves to a state that remembers what we’ve seen so far A reduce replaces a string in the stack with the nonterminal that derives it

Why do we need the stack? E  E + (E) E  i action Input Stack shift 1 + (2) + (3) reduce + (2) + (3) 1 E (2) + (3) E + 2) + (3) E + ( ) + (3) E + (2 E + (E + (3) E + (E) (3) 3) ) E + (3 accept Suppose so far we have discovered E  1 and gather information on “E +” In the given grammar this can only mean E  E + ● (E) Suppose state q represents this possibility Now, the next token is (, and we need to ignore q for a minute, and work on E  2 to obtain E+(E) Therefore, we push q to the stack, and after identifying E, we pop it to continue

LR parser stack Input Stack Output $ id + LR Parsing program 5 T 2 + 7 State state 5 T 2 + 7 id Output symbol goto action

LR parsing table State 0 is the initial state state terminals non-terminals rk gm 1 . . . acc shift/reduce actions goto part sn error shift state n reduce by rule k goto state m accept

LR(0) parser table example goto action STATE T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Always entire row of rk Always entire row of shift and gotos (possibly accept)

LR parser moves

Shift move If action[q, t] = sn then push t, push n Input Stack Output $ … t Stack LR Parsing program current state q . . . Output goto action n is the next state If action[q, t] = sn then push t, push n

Result of shift If action[q, t] = sn then push t, push n Input Stack $ … t Stack LR Parsing program n t q . . . Output goto action If action[q, t] = sn then push t, push n

Reduce move If action[qn, t] = rk Production: (k) A  σ1… σn Input $ … t Stack LR Parsing program qn … q Output 2*n goto action Rule k If action[qn, t] = rk Production: (k) A  σ1… σn Top of stack looks like q1 σ1… qn σn Pop qn σn… q1 σ1 If goto[q, A] = q’ then push A, push q’

Result of reduce move If action[qn, t] = rk Production: (k) A  σ1… σn Input $ … t Stack LR Parsing program Output q’ A q … goto action If action[qn, t] = rk Production: (k) A  σ1… σn Top of stack looks like q1 σ1… qn σn Pop qn σn… q1 σ1 If goto[q, A] = q’ then push A, push q’

Accept move If action[q, t] = accept parsing completed Input Stack $ t … Stack LR Parsing program q . . . Output goto action If action[q, t] = accept parsing completed

Error move If action[q, t] = error Input $ … t Stack LR Parsing program q . . . Output goto action If action[q, t] = error parsing discovered a syntactic error

Example of Shift-reduce parser run

Parsing id+id$ Initialize with state 0 Stack Input Action id + id $ ? (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ ? goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9 Initialize with state 0

Parsing id+id$ Stack Input Action id + id $ s5 (1) S  E $ (2) E  T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ pop id 5 Stack Input Action id + id $ s5 0 id 5 + id $ (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9 pop id 5

Parsing id+id$ push T 6 Stack Input Action id + id $ s5 0 id 5 + id $ (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9 push T 6

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 0 E 1 s3 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 0 E 1 s3 0 E 1 + 3 id $ goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 0 E 1 s3 0 E 1 + 3 id $ 0 E 1 + 3 id 5 $ goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 0 E 1 s3 0 E 1 + 3 id $ 0 E 1 + 3 id 5 $ 0 E 1 + 3 T 4 r3 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 0 E 1 s3 0 E 1 + 3 id $ 0 E 1 + 3 id 5 $ 0 E 1 + 3 T 4 r3 s2 goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Parsing id+id$ Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) Stack Input Action id + id $ s5 0 id 5 + id $ r4 0 T 6 r2 0 E 1 s3 0 E 1 + 3 id $ 0 E 1 + 3 id 5 $ 0 E 1 + 3 T 4 r3 s2 0 E 1 $ 2 acc goto action S T E $ ) ( + id g6 g1 s7 s5 s2 s3 1 acc 2 g4 3 r3 4 r4 5 r2 6 g8 7 s9 8 r5 9

Constructing an LR(0) parsing table

Overall process Construct a (determinized) transition diagram from LR(0) items If there are conflicts – stop Grammar is not LR(0) Otherwise, fill table entries from diagram

N  αβ LR(0) item Already matched To be matched Input Hypothesis about αβ being a possible handle, so far we’ve matched α, expecting to see β

LR(0) items N  αβ Shift Item N  αβ Reduce Item

LR(0) items enumeration example All items can be obtained by placing a dot at every position for every production: LR(0) items 1: S  E$ 2: S  E  $ 3: S  E $  4: E   T 5: E  T  6: E   E + T 7: E  E  + T 8: E  E +  T 9: E  E + T  10: T   id 11: T  id  12: T   (E) 13: T  ( E) 14: T  (E ) 15: T  (E)  Grammar (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E )

Operations for transition diagram construction Initial = {S’S$} For an item set I solve: Closure(I) = Closure(I  {Xµ is in grammar| NαXβ in I}) Goto(I, σ) = { Nασβ | Nασβ in I} σ is either a terminal or nonterminal

Initial example Initial = {S  E $} Grammar (1) S  E $ (2) E  T (4) T  id (5) T  ( E )

Closure example Initial = {S  E $} Closure({S  E $}) = S  E $ E  T E  E + T T  id T  ( E ) Grammar (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E )

Goto example Initial = {S  E $} Closure({S  E $}) = S  E $ E  T E  E + T T  id T  ( E ) Goto({S  E $ , E  E + T, T  id}, E) = {S  E $, E  E + T} Grammar (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E )

Constructing the transition diagram Start with state 0 containing item Closure({S  E $}) Repeat until no new states are discovered For every state p containing item set Ip, and symbol N, compute state q containing item set Iq = Closure(Goto(Ip, N)) Why does it terminate?

LR(0) automaton example (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) q6 E  T q0 T q7 T S  E$ E  T E  E + T T  id T  (E) T  (E) E  T E  E + T T  id T  (E) ( q5 id T  id id E ( E ( i q1 q8 q3 S  E$ E  E+ T E  E+T T  id T  (E) T  (E) E  E+T + + $ ) q2 q9 S  E$ T  (E)  T q4 E  E + T

LR(0) automaton construction example (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) q0 S  E$ Initialize

LR(0) automaton construction example (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) q0 S  E$ E  T E  E + T T  id T  (E) apply Closure

LR(0) automaton construction example (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) E  T q6 T q0 S  E$ E  T E  E + T T  id T  (E) T  (E) E  T E  E + T T  id T  (E) ( T  id q5 id S  E$ E  E+ T q1 E

LR(0) automaton construction example (1) S  E $ (2) E  T (3) E  E + T (4) T  id (5) T  ( E ) q6 E  T q0 T q7 T S  E$ E  T E  E + T T  id T  (E) T  (E) E  T E  E + T T  id T  (E) non-terminal transition corresponds to goto action in parse table ( q5 id T  id id E ( E ( i q1 q8 q3 S  E$ E  E+ T terminal transition corresponds to shift action in parse table E  E+T T  id T  (E) T  (E) E  E+T + + $ ) q2 q9 S  E$ T  (E)  T q4 E  E + T a single reduce item corresponds to reduce action

LR(0) conflicts

Conflicts Can construct a diagram for every grammar but some may introduce conflicts shift-reduce conflict: an item set contains at least one shift item and one reduce item reduce-reduce conflict: an item set contains two reduce items What about shift-shift conflicts?

Shift-reduce conflict example … T q0 S  E$ E  T E  E + T T  id T  (E) T  id[E] ( … q5 id T  id T  id[E] E Shift/reduce conflict … S  E $ E  T E  E + T T  id T  ( E ) T  id[E]

Reduce-reduce conflict example q0 … T S  E$ E  T E  V E  E + T T  id V  id T  (E) T  i[E] ( … q5 id T  id V  id E … reduce/reduce conflict S  E $ E  T E  V E  E + T T  id V  id T  ( E )

LR(0) conflicts Any grammar with an -rule cannot be LR(0) Inherent shift/reduce conflict A  – reduce item P αAβ – shift item A  can always be predicted from P αAβ Similar to FIRST-FOLLOW conflicts in LL(1) parsing Similar solution

LR parsing variants

LR variants LR(0) – what we’ve seen so far SLR(0) LR(1) LALR(1) Removes infeasible reduce actions via FOLLOW set reasoning LR(1) LR(0) with one lookahead token in items LALR(1) LR(1) with merging of states with same LR(0) component

SLR parsing

SRL parsing A handle should not be reduced to a non-terminal N if the lookahead is a token that cannot follow N A reduce item N  α is applicable only when the lookahead is in FOLLOW(N) If b is not in FOLLOW(N) we just proved there is no terminating derivation S * βNb and thus it is safe to remove the reduce item from the conflicted state Differs from LR(0) only on the ACTION table Now a row in the parsing table may contain both shift actions and reduce actions and we need to consult the current token to decide which one to take

Lookahead token from the input SLR action table Lookahead token from the input State id + ( ) [ ] $ shift 1 2 accept 3 4 EE+T 5 Tid r5, s6 6 ET 7 8 9 T(E) state action q0 shift q1 q2 q3 q4 EE+T q5 Tid q6 ET q7 q8 q9 TE vs. SLR – use 1 token look-ahead LR(0) – no look-ahead [ is not in FOLLOW(T) … as before… T  id T  id[E]

Next lecture: SLR/LR(1)/LALR(1)/Parser generation