+ All Categories
Home > Technology > Top down and botttom up Parsing

Top down and botttom up Parsing

Date post: 01-Dec-2014
Category:
Upload: gerwin-ocsena
View: 11,817 times
Download: 0 times
Share this document with a friend
Description:
:)
23
Top-Down and Bottom- Up Parsing
Transcript
Page 1: Top down     and botttom up Parsing

Top-Down and Bottom-Up Parsing

Page 2: Top down     and botttom up Parsing

Top Down Parsing

Bottom Up Parsing

Page 3: Top down     and botttom up Parsing

Things to know:Top down parsing is constructing a parse tree for the input starting from

the root and create nodes of the parse tree in preorder(depth first).A general form of top down parsing is the recursive descent parsing.A recursive descent parsing is a top down parsing technique that execute

a set of recursive procedures to process the input, that involves backtracking(means scanning the input repeatedly).

Backtracking is time consuming and therefore, inefficient. That’s why a special case of top down parsing was developed, called predictive parsing, where no backtracking is required.

A dilemma can occur if there is a left recursive grammar. Even with backtracking, you can find the parser to go into an infinite loop.

There are two types of recursion, left recursive and right recursive, based on it’s name, a left recursive grammar build trees that grows down to the left, while right recursive is vice versa.

Top Down Parsing

Page 4: Top down     and botttom up Parsing

Top-down Parse tree of Grammar G(Where input=id):G= E -> T E’

E’-> +T E’ | εT-> F T’T’-> *F T’ | εF-> (E) | id

An example of a simple production with left recursive grammar

Consider the grammar: expr -> expr + termThis is an example of a left recursive grammar.

Whenever we call expr, the same procedure is called out, and the parser will loop forever.

By carefully writing a grammar, one can eliminate left recursion from it.

expr -> expr + term, can be written as

expr -> expr + term | term

After obtaining a grammar that needs no backtracking, we can use the

PREDICTIVE PARSER

E E

T E’

E

T E’

F T’

E

T E’

F T’

id

Page 5: Top down     and botttom up Parsing

Top Down Parsing Techniques

Recursive-Descent Parsing

Predictive Parsing

Page 6: Top down     and botttom up Parsing

Recursive-Descent Parsing

A recursive-descent parsing program consists of a set of procedures, one for each nonterminal. Execution begins with the procedure for the start symbol, which halts and announces success if its procedure body scans the entire input string.

General recursive-descent may require backtracking; that is, it may require repeated scans over the input.

Consider the grammar with input string “cad”:S -> c A dA -> a b | a

S SS

c ccA AA dd d

a ab

c a d

Back

Recursive-Descent Parsing

Page 7: Top down     and botttom up Parsing

Predictive Parsing-a parsing technique that uses a lookahead symbol to determine if the current input arguments matches the lookahead symbol.

First and Follow

Construction of Predictive

Parsing Tables

LL(1) Grammars

Error Recovery

Page 8: Top down     and botttom up Parsing

First and Follow aids the construction of a predictive parser. They allow us to fill in the entries of a predictive parsing table.

a is any string of terminals , then First(a) is the set of terminals that begin the strings derived from a. If a is an empty string(ɛ), then ɛ is also in First(a).

Follow (A), for a nonterminal A, to be the set of terminals a that can appear immediately to the right of A in a sentential form.

First and Follow

Page 9: Top down     and botttom up Parsing

Rules in computing FIRST (X) where X can be a terminal or nonterminal, or even ε(empty string).

1) If X is a terminal, then FIRST(X)= X.2) If X is ε, then FIRST (X) = ε.3) If X is a nonterminal and Y and Z are nonterminals, with a production of

X -> YY -> ZaZ-> b; then FIRST(X) = b; where FIRST(nonterminal1) -> FIRST(nonterminal2)or until you reach the first terminal of the production. In that case

(FIRST(nonterminaln) =FIRST(nonterminaln+1))

4) If X is a nonterminal and contains two productions. EX:X -> a | b; then FIRST (X) = {a , b}

First and Follow

Page 10: Top down     and botttom up Parsing

• Consider again grammar G:1) E -> T E’ E’ -> +T E’ | ε T -> F T’ T‘ -> *F T’ | ε F -> ( E ) | id 2) S -> iEtSS’ | a S’ -> eS | ε E -> b

ANSWERS(FIRST):

1) FIRST(E) = FIRST(T) = FIRST(F) = { ( , id }FIRST (E’) = { + , ε }FIRST (T) = { *, ε }

2) FIRST(S)= { i , a }FIRST(S’)= { e, ε }FIRST(E) = { b }

First and Follow

Page 11: Top down     and botttom up Parsing

Rules in computing FOLLOW ( X) where X is a nonterminal1) If X is a part of a production and is succeeded by a terminal, for example: A ->

Xa; then Follow(X) = { a }2) If X is the start symbol for a grammar, for ex:

X -> ABA -> aB -> b; then add $ to FOLLOW (X); FOLLOW(X)= { $ }

3) If X is a part of a production and followed by another non terminal, get the FIRST of that succeeding nonterminal. ex: A -> XD D -> aB ; then FOLLOW(X)= FIRST(D) = { a }; and if FIRST(D) contains ε

(ex: D->aB | ε), then everything in FOLLOW(D) is in FOLLOW(X).4) If X is the last symbol of a production, ex: S -> abX, then

FOLLOW(X)= FOLLOW(S)

First and Follow

Page 12: Top down     and botttom up Parsing

• Consider again grammar G:1) E -> T E’ E’ -> +T E’ | ε T -> F T’ T‘ -> *F T’ | ε F -> ( E ) | id

2) S -> iEtSS’ | a S’ -> eS | ε E -> b

ANSWERS(FIRST):1) FIRST(E) = FIRST(T) = FIRST(F) = { ( , id }

FIRST (E’) = { + , ε }FIRST (T’) = { *, ε }

2) FIRST(S)= { i , a }; FIRST(S’)= { e, ε }; FIRST(E) = { b }

ANSWERS(FOLLOW):

ANSWERS FOR FOLLOW:3) FOLLOW(E) = FOLLOW(E’)= { ) , $}

FOLLOW (T)= FOLLOW(T’)= { +, ), $}FOLLOW (F) = { +, * , ), $}

2) FOLLOW (S) = FOLLOW (S’)={ e, $}FOLLOW(E)= { t }

BACK

First and Follow

Page 13: Top down     and botttom up Parsing

The general idea is to use the FIRST AND FOLLOW to construct the parsing tables.

Each FIRST of every production is labeled in the table whenever the input matches with it.

When a FIRST of a production contains ε, then we get the Follow of the production

Construction of Predictive Parsing Tables

Page 14: Top down     and botttom up Parsing

Consider again grammar G:E -> T E’E’ -> + T E’ | εT -> F T’T- -> *FT | εF -> ( E ) | idand their First and Follow

FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FOLLOW(E) = FOLLOW(E’)= { ) , $}

FIRST (E’) = { + , ε } FOLLOW (T)= FOLLOW(T’)= { +, ), $}

FIRST (T’) = { *, ε } FOLLOW (F) = { +, * , ), $}

Construction of Predictive Parsing Tables

Nonterminals Id + * ( ) $

EE’TT’F

E->TE’

T->FT’

F-> id

E’->+TE’

T’-> εT’->*FT’

E->TE’

T-FT’

F->(E)

E’->ε

T’->ε

E’->ε

T’->ε

Page 15: Top down     and botttom up Parsing

Back

STACK INPUT ACTION

$E$E’T$E’T’F$E’T’id$E’T’$E’ $E’T +$E’T$E’T’F$E’T’id$E’T’$E’T’F*$E’T’F$E’T’id$E’T’$E’$

id + id * id $ id + id * id $

id + id * id $id + id * id $

+ id * id $+ id * id $+ id * id $

id * id $id * id $id * id $

* id $* id $ id $ id $

$$$

E->TE’T->FT’F-> id

T’-> εE’->+TE’

T->FT’F-> id

T’->*FT’

F-> id

T’->εE’->ε

Nonterminals

Id + * ( ) $

EE’TT’F

E->TE’

T->FT’

F-> id

E’->+TE’

T’-> εT’->*FT’

E->TE’

T->FT’

F->(E)

E’->ε

T’->ε

E’->ε

T’->ε

Page 16: Top down     and botttom up Parsing

• What does LL(1) mean?The first “L” in LL(1) stands for scanning the input from left to right, the

second “L” is for producing a leftmost derivation, and the “1” for using one input symbol of lookahead at each step to make parsing action decisions.

No ambiguous or left recursive grammar is LL(1).

LL(1) Grammars

Page 17: Top down     and botttom up Parsing

There remains a question of what should be done when a parsing table has multiple-defined entries.

One solution is to transform the grammar by eliminating all left recursion and then left factoring when possible, but not all grammars can yield an LL(1) grammar at all.

The main difficulty in using a predictive parsing is in writing a grammar for the source language such that a predictive parser can be constructed from the grammar.

To alleviate some of the difficulty, one can use a operator precedence, or even better the LR parser, that provides both the benefits of predictive parsing and operator precedence automatically.

BACK

LL(1) Grammars

Page 18: Top down     and botttom up Parsing

When does an error possibly occur?-An error is detected when the terminal on the top of

the stack does not match the next input symbol or when the nonterminal A is on the top of the stack, a is the next input symbol, and the parsing table entry M[A, a] is empty.

How can we deal with errors?Panic-mode error recovery is based on the idea of

skipping symbols on the input until a token in a selected set of synch tokens appears.

Error Recovery

Page 19: Top down     and botttom up Parsing

How does it work?Using follow and first symbols as synchronizing tokens

works well. The parsing table will be filled with “synch” tokens obtained from the FOLLOW set of the nonterminal.

When a parser looks up entry M[A,a] and finds it blank, then a is skipped. If the entry is “synch”, then the nonterminal is popped in an attempt to resume parsing.

Error Recovery

Page 20: Top down     and botttom up Parsing

Back

Nonterminals

Id + * ( ) $

EE’TT’F

E->TE’

T->FT’

F-> id

E’->+TE’synchT’-> εsynch

T’->*FT’synch

E->TE’

T->FT’

F->(E)

synchE’->εsynchT’->εsynch

synchE’->εsynchT’->εsynchSTACK INPUT ACTION

$E$E$E’ T$E’ T’F$E’ T’id$E’ T’$E’ T’ F *$E’ T’ F$E’ T’$E’$E’ T+$E’ T$E’ T’ F$E’ T’ id$E’T’$E’$

) id * + id $ id * + id $

id * + id $id * + id $id * + id $

* + id $* + id $ + id $ + id $ + id $ + id $

id $ id $ id $

$$$

Error, skip )Id is in FIRST(E)

Error, M[F, +1 = synchF has been popped

Page 21: Top down     and botttom up Parsing

• Another error recovery procedure is the Phrase-level Recovery. This is implemented by filling in the blank entries in the parsing table with pointers to error routines. These routines can also pop symbols from the stack, change, insert or delete symbols on the input, and issue appropriate error messages. The alteration of stack symbols is very questionable and risky.

BACK

Error Recovery

Page 22: Top down     and botttom up Parsing

A general style of bottom up parsing will be introduced, it is the shift-reduce parsing.

Shift reduce parsing works based on its name, “Shift” and “Reduce”, so whenever the stack holds symbols that cannot be reduced anymore, we shift another input, and when it matches, we reduce.

Bottom Up Parsing

Page 23: Top down     and botttom up Parsing

STACK INPUT ACTION

1) $2) $id1

3) $E4) $E +5) $E + id2 6) $E + E7) $E + E *8) $E + E * id3

9) $E + E * E10)$E + E11)$E

id1 + id2 * id3 $ + id2 * id3 $

+ id2 * id3 $id2 * id3 $

* id3 $ * id3 $

id3 $$$$$

ShiftReduce by E ->idShiftShiftReduce by E->idShiftShiftReduce by E->idReduce by E-> E * EReduce by E-> E+ EACCEPT

Bottom Up Parsing


Recommended