Ambiguity, Precedence, Associativity & Top-Down Parsing. Lecture 9-10

Similar documents
Ambiguity. Grammar E E + E E * E ( E ) int. The string int * int + int has two parse trees. * int

Administrativia. WA1 due on Thu PA2 in a week. Building a Parser III. Slides on the web site. CS164 3:30-5:00 TT 10 Evans.

Building a Parser III. CS164 3:30-5:00 TT 10 Evans. Prof. Bodik CS 164 Lecture 6 1

CS1622. Today. A Recursive Descent Parser. Preliminaries. Lecture 9 Parsing (4)

Grammars and ambiguity. CS164 3:30-5:00 TT 10 Evans. Prof. Bodik CS 164 Lecture 8 1

Parsing: Derivations, Ambiguity, Precedence, Associativity. Lecture 8. Professor Alex Aiken Lecture #5 (Modified by Professor Vijay Ganesh)

Abstract Syntax Trees & Top-Down Parsing

E E+E E E (E) id. id + id E E+E. id E + E id id + E id id + id. Overview. derivations and parse trees. Grammars and ambiguity. ambiguous grammars

Abstract Syntax Trees & Top-Down Parsing

Abstract Syntax Trees & Top-Down Parsing

Top-Down Parsing and Intro to Bottom-Up Parsing. Lecture 7

Extra Credit Question

Top-Down Parsing and Intro to Bottom-Up Parsing. Lecture 7

Outline. Regular languages revisited. Introduction to Parsing. Parser overview. Context-free grammars (CFG s) Lecture 5. Derivations.

Introduction to Parsing. Lecture 5. Professor Alex Aiken Lecture #5 (Modified by Professor Vijay Ganesh)

( ) i 0. Outline. Regular languages revisited. Introduction to Parsing. Parser overview. Context-free grammars (CFG s) Lecture 5.

Introduction to Parsing Ambiguity and Syntax Errors

Top down vs. bottom up parsing

Ambiguity. Lecture 8. CS 536 Spring

Compilers. Predictive Parsing. Alex Aiken

Introduction to Parsing. Lecture 5

Introduction to Parsing Ambiguity and Syntax Errors

8 Parsing. Parsing. Top Down Parsing Methods. Parsing complexity. Top down vs. bottom up parsing. Top down vs. bottom up parsing

LL Parsing: A piece of cake after LR

Introduction to Parsing. Lecture 5

Types of parsing. CMSC 430 Lecture 4, Page 1

Parsing. Roadmap. > Context-free grammars > Derivations and precedence > Top-down parsing > Left-recursion > Look-ahead > Table-driven parsing

3. Parsing. Oscar Nierstrasz

More Bottom-Up Parsing

CS502: Compilers & Programming Systems

Outline. Parser overview Context-free grammars (CFG s) Derivations Syntax-Directed Translation

Note that for recursive descent to work, if A ::= B1 B2 is a grammar rule we need First k (B1) disjoint from First k (B2).

Intro To Parsing. Step By Step

CS 314 Principles of Programming Languages

Introduction to Parsing. Lecture 8

CS 321 Programming Languages and Compilers. VI. Parsing

Outline. Limitations of regular languages. Introduction to Parsing. Parser overview. Context-free grammars (CFG s)

Formal Languages and Compilers Lecture V: Parse Trees and Ambiguous Gr

4 (c) parsing. Parsing. Top down vs. bo5om up parsing

Administrativia. PA2 assigned today. WA1 assigned today. Building a Parser II. CS164 3:30-5:00 TT 10 Evans. First midterm. Grammars.

Lexical and Syntax Analysis. Top-Down Parsing

Bottom-Up Parsing. Lecture 11-12

Parsing Part II. (Ambiguity, Top-down parsing, Left-recursion Removal)

CSCI312 Principles of Programming Languages

1 Introduction. 2 Recursive descent parsing. Predicative parsing. Computer Language Implementation Lecture Note 3 February 4, 2004

Lexical and Syntax Analysis

CA Compiler Construction

Syntactic Analysis. Top-Down Parsing

Outline. Limitations of regular languages Parser overview Context-free grammars (CFG s) Derivations Syntax-Directed Translation

Sometimes an ambiguous grammar can be rewritten to eliminate the ambiguity.

Lecture 8: Deterministic Bottom-Up Parsing

LL(k) Parsing. Predictive Parsers. LL(k) Parser Structure. Sample Parse Table. LL(1) Parsing Algorithm. Push RHS in Reverse Order 10/17/2012

CS2210: Compiler Construction Syntax Analysis Syntax Analysis

Lecture 7: Deterministic Bottom-Up Parsing

Table-Driven Parsing

Bottom-Up Parsing. Lecture 11-12

Compiler Design 1. Top-Down Parsing. Goutam Biswas. Lect 5

Compilerconstructie. najaar Rudy van Vliet kamer 140 Snellius, tel rvvliet(at)liacs(dot)nl. college 3, vrijdag 22 september 2017

Parsing. Lecture 11: Parsing. Recursive Descent Parser. Arithmetic grammar. - drops irrelevant details from parse tree

Compilers: CS31003 Computer Sc & Engg: IIT Kharagpur 1. Top-Down Parsing. Lect 5. Goutam Biswas

Parsing. Handle, viable prefix, items, closures, goto s LR(k): SLR(1), LR(1), LALR(1)

Parsing III. CS434 Lecture 8 Spring 2005 Department of Computer Science University of Alabama Joel Jones

Syntax Analysis. Martin Sulzmann. Martin Sulzmann Syntax Analysis 1 / 38

CS Parsing 1

Compilers. Yannis Smaragdakis, U. Athens (original slides by Sam

Introduction to Bottom-Up Parsing

Syntax-Directed Translation. Lecture 14

Fall Compiler Principles Lecture 2: LL parsing. Roman Manevich Ben-Gurion University of the Negev

Parsing #1. Leonidas Fegaras. CSE 5317/4305 L3: Parsing #1 1

Prelude COMP 181 Tufts University Computer Science Last time Grammar issues Key structure meaning Tufts University Computer Science

Parsing Part II (Top-down parsing, left-recursion removal)

CS415 Compilers. Syntax Analysis. These slides are based on slides copyrighted by Keith Cooper, Ken Kennedy & Linda Torczon at Rice University

CS 406/534 Compiler Construction Parsing Part I

Compilers Course Lecture 4: Context Free Grammars

Syntax Analysis. COMP 524: Programming Language Concepts Björn B. Brandenburg. The University of North Carolina at Chapel Hill

Building a Parser II. CS164 3:30-5:00 TT 10 Evans. Prof. Bodik CS 164 Lecture 6 1

Syntax Analysis. The Big Picture. The Big Picture. COMP 524: Programming Languages Srinivas Krishnan January 25, 2011

Syntax Analysis Check syntax and construct abstract syntax tree

Outline. The strategy: shift-reduce parsing. Introduction to Bottom-Up Parsing. A key concept: handles


Chapter 3. Parsing #1

Parsing. Note by Baris Aktemur: Our slides are adapted from Cooper and Torczon s slides that they prepared for COMP 412 at Rice.

Context-Free Grammars

Syntax Analysis. Prof. James L. Frankel Harvard University. Version of 6:43 PM 6-Feb-2018 Copyright 2018, 2015 James L. Frankel. All rights reserved.

Monday, September 13, Parsers

Wednesday, September 9, 15. Parsers

Parsers. What is a parser. Languages. Agenda. Terminology. Languages. A parser has two jobs:

Compilation Lecture 3: Syntax Analysis: Top-Down parsing. Noam Rinetzky

COP4020 Programming Languages. Syntax Prof. Robert van Engelen

Parsers. Xiaokang Qiu Purdue University. August 31, 2018 ECE 468

Bottom-Up Parsing II (Different types of Shift-Reduce Conflicts) Lecture 10. Prof. Aiken (Modified by Professor Vijay Ganesh.

Review: Shift-Reduce Parsing. Bottom-up parsing uses two actions: Bottom-Up Parsing II. Shift ABC xyz ABCx yz. Lecture 8. Reduce Cbxy ijk CbA ijk

Error Handling Syntax-Directed Translation Recursive Descent Parsing

Parsing III. (Top-down parsing: recursive descent & LL(1) )

LL(1) predictive parsing

Error Handling Syntax-Directed Translation Recursive Descent Parsing

Ambiguity and Errors Syntax-Directed Translation

Table-driven using an explicit stack (no recursion!). Stack can be viewed as containing both terminals and non-terminals.

Fall Compiler Principles Lecture 3: Parsing part 2. Roman Manevich Ben-Gurion University

Syntax Analysis Part I

Transcription:

Ambiguity, Precedence, Associativity & Top-Down Parsing Lecture 9-10 (From slides by G. Necula & R. Bodik) 9/18/06 Prof. Hilfinger CS164 Lecture 9 1

Administrivia Please let me know if there are continued problems with being able to see other people s stuff. Preliminary run of test data against any projects handed in by midnight Wednesday. Not final data sets, but may give you an indication. You can submit early and often! Will not test again until midnight Friday. 9/18/06 Prof. Hilfinger CS164 Lecture 9 2

Remaining Issues How do we find a derivation of s? Ambiguity: what if there is more than one parse tree (erpretation) for some string s? rrors: what if there is no parse tree for some string s? Given a derivation, how do we construct an abstract syntax tree from it? Today, we ll look at the first two. 9/18/06 Prof. Hilfinger CS164 Lecture 9 3

Ambiguity Grammar + * ( ) Strings + + * + 9/18/06 Prof. Hilfinger CS164 Lecture 9 4

Ambiguity. xample The string + + has two parse trees + + + + + is left-associative 9/18/06 Prof. Hilfinger CS164 Lecture 9 5

Ambiguity. xample The string * + has two parse trees + * * + * has higher precedence than + 9/18/06 Prof. Hilfinger CS164 Lecture 9 6

Ambiguity (Cont.) A grammar is ambiguous if it has more than one parse tree for some string quivalently, there is more than one rightmost or leftmost derivation for some string Ambiguity is bad Leaves meaning of some programs ill-defined Ambiguity is common in programming languages Arithmetic expressions IF-THN-LS 9/18/06 Prof. Hilfinger CS164 Lecture 9 7

Dealing with Ambiguity There are several ways to handle ambiguity Most direct method is to rewrite the grammar unambiguously + T T T T * ( ) nforces precedence of * over + nforces left-associativity of + and * 9/18/06 Prof. Hilfinger CS164 Lecture 9 8

Ambiguity. xample The * + has only one parse tree now + T * T + T * 9/18/06 Prof. Hilfinger CS164 Lecture 9 9

Ambiguity: The Dangling lse Consider the grammar if then if then else OTHR This grammar is also ambiguous 9/18/06 Prof. Hilfinger CS164 Lecture 9 10

The Dangling lse: xample The expression if 1 then if 2 then 3 else 4 has two parse trees if if 1 if 4 1 if 2 3 2 3 4 Typically we want the second form 9/18/06 Prof. Hilfinger CS164 Lecture 9 11

The Dangling lse: A Fix else matches the closest unmatched then We can describe this in the grammar (distinguish between matched and unmatched then ) MIF /* all then are matched */ UIF /* some then are unmatched */ MIF if then MIF else MIF OTHR UIF if then if then MIF else UIF Describes the same set of strings 9/18/06 Prof. Hilfinger CS164 Lecture 9 12

The Dangling lse: xample Revisited The expression if 1 then if 2 then 3 else 4 if if 1 if 1 if 4 2 3 4 2 3 A valid parse tree (for a UIF) Not valid because the then expression is not a MIF 9/18/06 Prof. Hilfinger CS164 Lecture 9 13

Ambiguity Impossible to convert automatically an ambiguous grammar to an unambiguous one Used with care, ambiguity can simplify the grammar Sometimes allows more natural definitions But we need disambiguation mechanisms Instead of rewriting the grammar Use the more natural (ambiguous) grammar Along with disambiguating declarations Most tools allow precedence and associativity declarations to disambiguate grammars xamples 9/18/06 Prof. Hilfinger CS164 Lecture 9 14

Associativity Declarations Consider the grammar + Ambiguous: two parse trees of + + + + + + Left-associativity declaration: %left + 9/18/06 Prof. Hilfinger CS164 Lecture 9 15

Precedence Declarations Consider the grammar + * And the string + * * + + * 9/18/06 Prof. Hilfinger CS164 Lecture 9 16 Precedence declarations: %left + %left *

How It s Done I: Intro to Top-Down Parsing Terminals are seen in order of appearance in the token stream: t 1 A B t 4 t 1 t 2 t 3 t 4 t 5 The parse tree is constructed C D From the top From left to right t 2 t 3 t 4 As for leftmost derivation 9/18/06 Prof. Hilfinger CS164 Lecture 9 17

Top-down Depth-First Parsing Consider the grammar T + T T ( ) * T Token stream is: * Start with top-level non-terminal Try the rules for in order 9/18/06 Prof. Hilfinger CS164 Lecture 9 18

Depth-First Parsing. xample * Start with start symbol Try T + T + Then try a rule for T ( ) () + But ( input ; backtrack to T + Try T. Token matches. + But + input *; back to T + Try T * T *T+ But (skipping some steps) + can t be matched Must backtrack to 9/18/06 Prof. Hilfinger CS164 Lecture 9 19

Depth-First Parsing. xample * Try T Follow same steps as before for T And succeed with T * T and T With the following parse tree T * T 9/18/06 Prof. Hilfinger CS164 Lecture 9 20

Depth-First Parsing Parsing: given a string of tokens t 1 t 2... t n, find a leftmost derivation (and thus, parse tree) Depth-first parsing: Beginning with start symbol, try each production exhaustively on leftmost non-terminal in current sentential form and recurse. 9/18/06 Prof. Hilfinger CS164 Lecture 9 21

Depth-First Parsing of t 1 t 2 t n At a given moment, have sentential form that looks like this: t 1 t 2 t k A, 0 k n Initially, k=0 and A is just start symbol Try a production for A: if A BC is a production, the new form is t 1 t 2 t k B C Backtrack when leading terminals aren t prefix of t 1 t 2 t n and try another production Stop when no more non-terminals and terminals all matched (accept) or no more productions left (reject) 9/18/06 Prof. Hilfinger CS164 Lecture 9 22

When Depth-First Doesn t Work Well Consider productions S S a a: In the process of parsing S we try the above rules Applied consistently in this order, get infinite loop Could re-order productions, but search will have lots of backtracking and general rule for ordering is complex Problem here is left-recursive grammar: one that has a non-terminal S S + Sα for some α 9/18/06 Prof. Hilfinger CS164 Lecture 9 23

limination of Left Recursion Consider the left-recursive grammar S S α β S generates all strings starting with a β and followed by a number of α Can rewrite using right-recursion S β S S α S ε 9/18/06 Prof. Hilfinger CS164 Lecture 9 24

limination of left Recursion. xample Consider the grammar S 1 S 0 ( β = 1 and α = 0 ) can be rewritten as S 1 S S 0 S ε 9/18/06 Prof. Hilfinger CS164 Lecture 9 25

More limination of Left Recursion In general S S α 1 S α n β 1 β m All strings derived from S start with one of β 1,,β m and continue with several instances of α 1,,α n Rewrite as S β 1 S β m S S α 1 S α n S ε 9/18/06 Prof. Hilfinger CS164 Lecture 9 26

General Left Recursion The grammar S A α δ (1) A S β (2) is also left-recursive because S + S β α This left recursion can also be eliminated by first substituting (2) o (1) There is a general algorithm (e.g. Aho, Sethi, Ullman 4.3) But personally, I d just do this by hand. 9/18/06 Prof. Hilfinger CS164 Lecture 9 27

An Alternative Approach Instead of reordering or rewriting grammar, can use top-down breadth-first search. S S a a String: aaa S S a a (string not all matched) S a a a a S a a a a a a 9/18/06 Prof. Hilfinger CS164 Lecture 9 28

Summary of Top-Down Parsing So Far Simple and general parsing strategy Left recursion must be eliminated first but that can be done automatically Or can use breadth-first search But backtracking (depth-first) or maaining list of possible sentential forms (breadthfirst) can make it slow Often, though, we can avoid both 9/18/06 Prof. Hilfinger CS164 Lecture 9 29

Predictive Parsers Modification of depth-first parsing in which parser predicts which production to use By looking at the next few tokens No backtracking Predictive parsers accept LL(k) grammars L means left-to-right scan of input L means leftmost derivation k means predict based on k tokens of lookahead In practice, LL(1) is used 9/18/06 Prof. Hilfinger CS164 Lecture 9 30

LL(1) Languages Previously, for each non-terminal and input token there may be a choice of production LL(k) means that for each non-terminal and k tokens, there is only one production that could lead to success 9/18/06 Prof. Hilfinger CS164 Lecture 9 31

Recursive Descent: Grammar as Program In recursive descent, we think of a grammar as a program. ach non-terminal is turned o a procedure ach right-hand side transliterated o part of the procedure body for its non-terminal First, define next() current token of input scan(t) check that next()=t (else RROR), and then read new token. 9/18/06 Prof. Hilfinger CS164 Lecture 9 32

Recursive Descent: xample P S $ S T S S + S ε T ( S ) ($ = end marker) def P (): S(); scan($) def S(): T(); S () def S (): But where do tests if next() == + : scan( + ); S() come from? elif next() in [ ), $]: pass else: RROR def T(): if next () == : scan() elif next() == ( : scan( ( ); S(); scan ( ) ) else: RROR 9/18/06 Prof. Hilfinger CS164 Lecture 9 33

Predicting Right-hand Sides The if-tests are conditions by which parser predicts which right-hand side to use. In our example, used only next symbol (LL(1)); but could use more. Can be specified as a 2D table One dimension for current non-terminal to expand One dimension for next token A table entry contains one production 9/18/06 Prof. Hilfinger CS164 Lecture 9 34

But First: Left Factoring With the grammar T + T T * T ( ) Impossible to predict because For T two productions start with For it is not clear how to predict A grammar must be left-factored before use for predictive parsing 9/18/06 Prof. Hilfinger CS164 Lecture 9 35

Left-Factoring xample Starting with the grammar T + T T * T ( ) Factor out common prefixes of productions T X X + ε T ( ) Y Y * T ε 9/18/06 Prof. Hilfinger CS164 Lecture 9 36

LL(1) Parsing Table xample Left-factored grammar T X T ( ) Y X + ε Y * T ε The LL(1) parsing table ($ is a special end marker): * + ( ) $ T Y ( ) T X T X X + ε ε Y * T ε ε ε 9/18/06 Prof. Hilfinger CS164 Lecture 9 37

LL(1) Parsing Table xample (Cont.) Consider the [, ] entry When current non-terminal is and next input is, use production T X This production can generate an in the first place Consider the [Y,+] entry When current non-terminal is Y and current token is +, get rid of Y We ll see later why this is so 9/18/06 Prof. Hilfinger CS164 Lecture 9 38

LL(1) Parsing Tables. rrors Blank entries indicate error situations Consider the [,*] entry There is no way to derive a string starting with * from non-terminal 9/18/06 Prof. Hilfinger CS164 Lecture 9 39

Using Parsing Tables Method similar to recursive descent, except For first non-terminal S We look at the next token a And choose the production shown at [S,a] We use a stack to keep track of pending nonterminals We reject when we encounter an error state We accept when we encounter end-of-input 9/18/06 Prof. Hilfinger CS164 Lecture 9 40

LL(1) Parsing Algorithm initialize stack = <S,$> repeat case stack of <X, rest> : if T[X,next()] == Y 1 Y n : stack <Y 1 Y n rest>; else: error (); <t, rest> : scan (t); stack <rest>; until stack == < > 9/18/06 Prof. Hilfinger CS164 Lecture 9 41

LL(1) Parsing xample Stack Input Action $ * $ T X T X $ * $ Y Y X $ * $ terminal Y X $ * $ * T * T X $ * $ terminal T X $ $ Y Y X $ $ terminal Y X $ $ ε X $ $ ε $ $ ACCPT 9/18/06 Prof. Hilfinger CS164 Lecture 9 42

Constructing Parsing Tables LL(1) languages are those definable by a parsing table for the LL(1) algorithm No table entry can be multiply defined Once we have the table Can create table-driver or recursive-descent parser The parsing algorithms are simple and fast No backtracking is necessary We want to generate parsing tables from CFG 9/18/06 Prof. Hilfinger CS164 Lecture 9 43

Top-Down Parsing. Review Top-down parsing expands a parse tree from the start symbol to the leaves Always expand the leftmost non-terminal T + * + 9/18/06 Prof. Hilfinger CS164 Lecture 9 44

Top-Down Parsing. Review Top-down parsing expands a parse tree from the start symbol to the leaves Always expand the leftmost non-terminal T * * T + + The leaves at any po form a string βaγ β contains only terminals The input string is βbδ The prefix β matches The next token is b 9/18/06 Prof. Hilfinger CS164 Lecture 9 45

Top-Down Parsing. Review Top-down parsing expands a parse tree from the start symbol to the leaves Always expand the leftmost non-terminal T * * T + T + The leaves at any po form a string βaγ β contains only terminals The input string is βbδ The prefix β matches The next token is b 9/18/06 Prof. Hilfinger CS164 Lecture 9 46

Top-Down Parsing. Review Top-down parsing expands a parse tree from the start symbol to the leaves Always expand the leftmost non-terminal T * T + T The leaves at any po form a string βaγ β contains only terminals The input string is βbδ The prefix β matches The next token is b * + 9/18/06 Prof. Hilfinger CS164 Lecture 9 47

Constructing Predictive Parsing Tables Consider the state S * βaγ With b the next token Trying to match βbδ There are two possibilities: 1. b belongs to an expansion of A Or Any A α can be used if b can start a string derived from α In this case we say that b First(α) 9/18/06 Prof. Hilfinger CS164 Lecture 9 48

Constructing Predictive Parsing Tables (Cont.) 2. b does not belong to an expansion of A The expansion of A is empty and b belongs to an expansion of γ (e.g., bω) Means that b can appear after A in a derivation of the form S * βabω We say that b Follow(A) in this case What productions can we use in this case? Any A α can be used if α can expand to ε We say that ε First(A) in this case 9/18/06 Prof. Hilfinger CS164 Lecture 9 49

Summary of Definitions For b T, the set of terminals; α a sequence of terminal & non-terminal symbols, S the start symbol, A N, the set of non-terminals: FIRST(α) T { ε } b FIRST(α) iff α * b ε FIRST(α) iff α * ε FOLLOW(A) T b FOLLOW(A) iff S * A b 9/18/06 Prof. Hilfinger CS164 Lecture 9 50

Computing First Sets Definition First(X) = { b X * bα} {ε X * ε}, X any grammar symbol. 1. First(b) = { b } 2. For all productions X A 1 A n Add First(A 1 ) {ε} to First(X). Stop if ε First(A 1 ) Add First(A 2 ) {ε} to First(X). Stop if ε First(A 2 ) Add First(A n ) {ε} to First(X). Stop if ε First(A n ) Add ε to First(X) 9/18/06 Prof. Hilfinger CS164 Lecture 9 51

Computing First Sets, Contd. That takes care of single-symbol case. In general: FIRST(X 1 X 2 X k ) = FIRST(X 1 ) FIRST(X 2 ) if ε FIRST(X 1 ) FIRST(X 2 ) if ε FIRST(X 1 X 2 X k-1 ) - { ε } unless ε FIRST(X i ) i 9/18/06 Prof. Hilfinger CS164 Lecture 9 52

First Sets. xample For the grammar T X T ( ) Y X + ε Y * T ε First sets First( ( ) = { ( } First( T ) = {, ( } First( ) ) = { ) } First( ) = {, ( } First( ) = { } First( X ) = {+, ε } First( + ) = { + } First( Y ) = {*, ε } First( * ) = { * } 9/18/06 Prof. Hilfinger CS164 Lecture 9 53

Computing Follow Sets Definition Follow(X) = { b S * β X b ω } 1. Compute the First sets for all non-terminals first 2. Add $ to Follow(S) (if S is the start non-terminal) 3. For all productions Y X A 1 A n Add First(A 1 ) {ε} to Follow(X). Stop if ε First(A 1 ) Add First(A 2 ) {ε} to Follow(X). Stop if ε First(A 2 ) Add First(A n ) {ε} to Follow(X). Stop if ε First(A n ) Add Follow(Y) to Follow(X) 9/18/06 Prof. Hilfinger CS164 Lecture 9 54

Follow Sets. xample For the grammar T X T ( ) Y Follow sets Follow( ) = {), $} Follow( X ) = {$, ) } Follow( Y ) = {+, ), $} Follow( T ) = {+, ), $} X + ε Y * T ε 9/18/06 Prof. Hilfinger CS164 Lecture 9 55

Constructing LL(1) Parsing Tables Construct a parsing table T for CFG G For each production A α in G do: For each terminal b First(α) do T[A, b] = α If α * ε, for each b Follow(A) do T[A, b] = α 9/18/06 Prof. Hilfinger CS164 Lecture 9 56

Constructing LL(1) Tables. xample For the grammar T X T ( ) Y X + ε Y * T ε Where in the line of Y do we put Y * T? In the lines of First( *T) = { * } Where in the line of Y do we put Y ε? In the lines of Follow(Y) = { $, +, ) } 9/18/06 Prof. Hilfinger CS164 Lecture 9 57

Notes on LL(1) Parsing Tables If any entry is multiply defined then G is not LL(1) If G is ambiguous If G is left recursive If G is not left-factored And in other cases as well Most programming language grammars are not LL(1) There are tools that build LL(1) tables 9/18/06 Prof. Hilfinger CS164 Lecture 9 58

Recursive Descent for Real So far, have presented a purist view. In fact, use of recursive descent makes life simpler in many ways if we cheat a bit. Here s how you really handle left recursion in recursive descent, for S S A R: def S(): R () while next() FIRST(A): A() It s a program: all kinds of shortcuts possible. 9/18/06 Prof. Hilfinger CS164 Lecture 9 59

Review For some grammars there is a simple parsing strategy Predictive parsing (LL(1)) Once you build the LL(1) table, you can write the parser by hand Next: a more powerful parsing strategy for grammars that are not LL(1) 9/18/06 Prof. Hilfinger CS164 Lecture 9 60