SlideShare a Scribd company logo
16
Most read
22
Most read
23
Most read
Top-Down and Bottom-Up Parsing
Top Down Parsing

Bottom Up Parsing
Top Down 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 Parse tree of Grammar G(Where input=id):
G= E -> T E‟
   E‟-> +T E‟ | ε                  E        E          E          E
   T-> F T‟
                                        T       E’ T       E’ T        E’
   T‟-> *F T‟ | ε
   F-> (E) | id                                 F      T’ F       T’

                                                        id

An example of a simple production with left recursive grammar
Consider the grammar: expr -> expr + term
This 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
Top Down Parsing Techniques



    Recursive-Descent Parsing

    Predictive Parsing
Recursive-Descent
Recursive-Descent Parsing               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 d
  A -> a b | a

                       S                   S                     S

                   c   A   d           c   A    d           c    A   d

                                       a        b                a

  c   a   d



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



                                           Construction of
              First and
                                             Predictive
               Follow
                                           Parsing Tables


              LL(1)
                                           Error Recovery
            Grammars
First and
      Follow

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
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 -> Y
     Y -> Za
     Z-> 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

• Consider again grammar G:   ANSWERS(FIRST):
  1) E -> T E‟                1) FIRST(E) = FIRST(T) =
     E‟ -> +T E‟ | ε             FIRST(F) = { ( , id }
     T -> F T‟                   FIRST (E‟) = { + , ε }
     T„ -> *F T‟ | ε             FIRST (T) = { *, ε }
     F -> ( E ) | id
  2) S -> iEtSS‟ | a          2) FIRST(S)= { i , a }
     S‟ -> eS | ε                FIRST(S‟)= { e, ε }
     E -> b                      FIRST(E) = { b }
First and
           Follow
Rules in computing FOLLOW ( X) where X is a nonterminal
1) 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 -> AB
     A -> a
     B -> 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

•   Consider again grammar G:                             ANSWERS FOR FOLLOW:
    1) E -> T E‟                                          1) FOLLOW(E) = FOLLOW(E‟)= { ) , $}
       E‟ -> +T E‟ | ε                                       FOLLOW (T)= FOLLOW(T‟)= { +, ), $}
       T -> F T‟                                             FOLLOW (F) = { +, * , ), $}
       T„ -> *F T‟ | ε
       F -> ( E ) | id
2) S -> iEtSS‟ | a                                        2)   FOLLOW (S) = FOLLOW (S‟)={ e, $}
       S‟ -> eS | ε                                            FOLLOW(E)= { t }
       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):
Construction of
  Predictive
Parsing Tables
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
Consider again grammar G:
   Construction of                    E -> T E‟
                                      E‟ -> + T E‟ | ε
     Predictive                       T -> F T‟

   Parsing Tables                     T- -> *FT | ε
                                      F -> ( E ) | id
                                      and 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) = { +, * , ), $}

Nontermi
  nals
                 Id           +               *          (           )          $

    E         E->TE‟                                  E->TE‟
    E‟                    E‟->+TE‟                                 E‟->ε      E‟->ε
    T         T->FT‟                                   T-FT‟
    T‟                      T‟-> ε      T‟->*FT‟                   T‟->ε      T‟->ε
    F          F-> id                                 F->(E)
Nontermin        Id      +                         (       )               $
    als                              *
     E       E->TE‟                             E->TE‟
     E‟                E‟->+TE‟                           E‟->ε            E‟->ε
     T       T->FT‟                             T->FT‟
     T‟                 T‟-> ε    T‟->*FT‟                T‟->ε            T‟->ε
     F       F-> id                             F->(E)
          STACK                    INPUT                        ACTION
$E                                       id + id * id $
$E‟T                                     id + id * id $         E->TE‟
$E‟T‟F                                   id + id * id $         T->FT‟
$E‟T‟id                                  id + id * id $         F-> id
$E‟T‟                                       + id * id $
$E‟                                         + id * id $          T‟-> ε
$E‟T +                                      + id * id $         E‟->+TE‟
$E‟T                                          id * id $
$E‟T‟F                                        id * id $         T->FT‟
$E‟T‟id                                       id * id $         F-> id
$E‟T‟                                            * id $
$E‟T‟F*                                          * id $         T‟->*FT‟
$E‟T‟F                                             id $
$E‟T‟id                                            id $          F-> id
$E‟T‟                                                 $
$E‟                                                   $         Back
                                                                 T‟->ε
$                                                     $          E‟->ε
LL(1)
       Grammars

• 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

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
Error Recovery

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

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.
Nontermin        Id        +                        (          )            $
    als                                *
     E          E->TE‟                           E->TE‟      synch         synch
     E‟                  E‟->+TE‟                            E‟->ε         E‟->ε
     T          T->FT‟    synch                  T->FT‟     synch          synch
     T‟                   T‟-> ε    T‟->*FT‟                T‟->ε          T‟->ε
     F       STACK id
                 F->      synch      synch
                                     INPUT       F->(E)         ACTIONsynch
                                                             synch
$E                                         ) id * + id $        Error, skip )
$E                                           id * + id $     Id is in FIRST(E)
$E‟ T                                        id * + id $
$E‟ T‟F                                      id * + id $
$E‟ T‟id                                     id * + id $
$E‟ T‟                                          * + id $
$E‟ T‟ F *                                      * + id $
$E‟ T‟ F                                          + id $   Error, M[F, +1 = synch
$E‟ T‟                                            + id $    F has been popped
$E‟                                               + id $
$E‟ T+                                            + id $
$E‟ T                                               id $
$E‟ T‟ F                                            id $
$E‟ T‟ id                                           id $
$E‟T‟                                                  $
$E‟                                                    $
$                                                      $
                                                                    Back
Error Recovery

• 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
Bottom 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
    STACK            INPUT                 ACTION
1) $              id1 + id2 * id3 $   Shift
2) $id1               + id2 * id3 $   Reduce by E -
3) $E                 + id2 * id3 $   >id
4) $E +                 id2 * id3 $   Shift
5) $E + id2                 * id3 $   Shift
6) $E + E                   * id3 $   Reduce by E->id
7) $E + E *                   id3 $   Shift
8) $E + E * id3                   $   Shift
9) $E + E * E                     $   Reduce by E->id
10)$E + E                         $   Reduce by E-> E * E
11)$E                             $   Reduce by E-> E+ E
                                      ACCEPT

More Related Content

PPT
Top down parsing
PPTX
Compiler design syntax analysis
PPTX
Top Down Parsing, Predictive Parsing
PPTX
Automata theory - CFG and normal forms
PDF
Bottom up parser
PPTX
CLR AND LALR PARSER
PPTX
LALR Parser Presentation ppt
PPT
Bottom - Up Parsing
Top down parsing
Compiler design syntax analysis
Top Down Parsing, Predictive Parsing
Automata theory - CFG and normal forms
Bottom up parser
CLR AND LALR PARSER
LALR Parser Presentation ppt
Bottom - Up Parsing

What's hot (20)

PDF
Algorithms Lecture 2: Analysis of Algorithms I
PDF
Lexical Analysis - Compiler design
PPTX
Top down parsing
PDF
Syntax analysis
PDF
Syntax directed translation
PDF
Binary Search - Design & Analysis of Algorithms
PPTX
Types of Parser
PPTX
Lexical analysis - Compiler Design
PPTX
Top down parsing
PPTX
Lexical Analysis - Compiler Design
PPTX
Syntax Analysis - LR(0) Parsing in Compiler
PPTX
Assemblers
PPT
context free language
PPTX
Context free grammar
PPT
Lecture 1 - Lexical Analysis.ppt
PPT
Parsing
PPTX
Three Address code
PPT
UNIT-1-PPTS-DAA.ppt
PPTX
Loop optimization
Algorithms Lecture 2: Analysis of Algorithms I
Lexical Analysis - Compiler design
Top down parsing
Syntax analysis
Syntax directed translation
Binary Search - Design & Analysis of Algorithms
Types of Parser
Lexical analysis - Compiler Design
Top down parsing
Lexical Analysis - Compiler Design
Syntax Analysis - LR(0) Parsing in Compiler
Assemblers
context free language
Context free grammar
Lecture 1 - Lexical Analysis.ppt
Parsing
Three Address code
UNIT-1-PPTS-DAA.ppt
Loop optimization
Ad

Similar to Top down and botttom up Parsing (20)

PPTX
Top down and botttom up 2 LATEST.
PPTX
Top down parsing(sid) (1)
PPTX
System Programming Unit IV
PPTX
First and follow set
PPTX
Parsing in Compiler Design
PPTX
Chapter 4.pptx compiler design lecture note
PDF
Lecture4
PDF
ACD-U2-TopDown..pdf it hhepls inall the the
PPTX
Compiler Design_Syntax Analyzer_Top Down Parsers.pptx
PPTX
5-Introduction to Parsing and Context Free Grammar-09-05-2023.pptx
DOC
Principles of Compiler Design
DOC
PCD ?s(MCA)
DOC
Pcd(Mca)
DOC
Pcd(Mca)
DOC
Compiler Design Material 2
PDF
Theory of automata and formal language lab manual
PDF
Model answer of compilers june spring 2013
PDF
Lecture8 syntax analysis_4
Top down and botttom up 2 LATEST.
Top down parsing(sid) (1)
System Programming Unit IV
First and follow set
Parsing in Compiler Design
Chapter 4.pptx compiler design lecture note
Lecture4
ACD-U2-TopDown..pdf it hhepls inall the the
Compiler Design_Syntax Analyzer_Top Down Parsers.pptx
5-Introduction to Parsing and Context Free Grammar-09-05-2023.pptx
Principles of Compiler Design
PCD ?s(MCA)
Pcd(Mca)
Pcd(Mca)
Compiler Design Material 2
Theory of automata and formal language lab manual
Model answer of compilers june spring 2013
Lecture8 syntax analysis_4
Ad

Recently uploaded (20)

PDF
Spectral efficient network and resource selection model in 5G networks
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
cuic standard and advanced reporting.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPTX
A Presentation on Artificial Intelligence
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPT
Teaching material agriculture food technology
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Electronic commerce courselecture one. Pdf
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Encapsulation theory and applications.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
Big Data Technologies - Introduction.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Spectral efficient network and resource selection model in 5G networks
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
cuic standard and advanced reporting.pdf
Empathic Computing: Creating Shared Understanding
A Presentation on Artificial Intelligence
NewMind AI Weekly Chronicles - August'25 Week I
Network Security Unit 5.pdf for BCA BBA.
Advanced methodologies resolving dimensionality complications for autism neur...
Teaching material agriculture food technology
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Electronic commerce courselecture one. Pdf
NewMind AI Monthly Chronicles - July 2025
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Building Integrated photovoltaic BIPV_UPV.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Encapsulation theory and applications.pdf
Unlocking AI with Model Context Protocol (MCP)
Big Data Technologies - Introduction.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...

Top down and botttom up Parsing

  • 3. Top Down 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.
  • 4. Top-down Parse tree of Grammar G(Where input=id): G= E -> T E‟ E‟-> +T E‟ | ε E E E E T-> F T‟ T E’ T E’ T E’ T‟-> *F T‟ | ε F-> (E) | id F T’ F T’ id An example of a simple production with left recursive grammar Consider the grammar: expr -> expr + term This 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
  • 5. Top Down Parsing Techniques Recursive-Descent Parsing Predictive Parsing
  • 6. Recursive-Descent Recursive-Descent Parsing 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 d A -> a b | a S S S c A d c A d c A d a b a c a d Back
  • 7. Predictive Parsing-a parsing technique that uses a lookahead symbol to determine if the current input arguments matches the lookahead symbol. Construction of First and Predictive Follow Parsing Tables LL(1) Error Recovery Grammars
  • 8. First and Follow 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.
  • 9. First and Follow 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 -> Y Y -> Za Z-> 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}
  • 10. First and Follow • Consider again grammar G: ANSWERS(FIRST): 1) E -> T E‟ 1) FIRST(E) = FIRST(T) = E‟ -> +T E‟ | ε FIRST(F) = { ( , id } T -> F T‟ FIRST (E‟) = { + , ε } T„ -> *F T‟ | ε FIRST (T) = { *, ε } F -> ( E ) | id 2) S -> iEtSS‟ | a 2) FIRST(S)= { i , a } S‟ -> eS | ε FIRST(S‟)= { e, ε } E -> b FIRST(E) = { b }
  • 11. First and Follow Rules in computing FOLLOW ( X) where X is a nonterminal 1) 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 -> AB A -> a B -> 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)
  • 12. First and Follow • Consider again grammar G: ANSWERS FOR FOLLOW: 1) E -> T E‟ 1) FOLLOW(E) = FOLLOW(E‟)= { ) , $} E‟ -> +T E‟ | ε FOLLOW (T)= FOLLOW(T‟)= { +, ), $} T -> F T‟ FOLLOW (F) = { +, * , ), $} T„ -> *F T‟ | ε F -> ( E ) | id 2) S -> iEtSS‟ | a 2) FOLLOW (S) = FOLLOW (S‟)={ e, $} S‟ -> eS | ε FOLLOW(E)= { t } 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):
  • 13. Construction of Predictive Parsing Tables 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
  • 14. Consider again grammar G: Construction of E -> T E‟ E‟ -> + T E‟ | ε Predictive T -> F T‟ Parsing Tables T- -> *FT | ε F -> ( E ) | id and 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) = { +, * , ), $} Nontermi nals Id + * ( ) $ E E->TE‟ E->TE‟ E‟ E‟->+TE‟ E‟->ε E‟->ε T T->FT‟ T-FT‟ T‟ T‟-> ε T‟->*FT‟ T‟->ε T‟->ε F F-> id F->(E)
  • 15. Nontermin Id + ( ) $ als * E E->TE‟ E->TE‟ E‟ E‟->+TE‟ E‟->ε E‟->ε T T->FT‟ T->FT‟ T‟ T‟-> ε T‟->*FT‟ T‟->ε T‟->ε F F-> id F->(E) STACK INPUT ACTION $E id + id * id $ $E‟T id + id * id $ E->TE‟ $E‟T‟F id + id * id $ T->FT‟ $E‟T‟id id + id * id $ F-> id $E‟T‟ + id * id $ $E‟ + id * id $ T‟-> ε $E‟T + + id * id $ E‟->+TE‟ $E‟T id * id $ $E‟T‟F id * id $ T->FT‟ $E‟T‟id id * id $ F-> id $E‟T‟ * id $ $E‟T‟F* * id $ T‟->*FT‟ $E‟T‟F id $ $E‟T‟id id $ F-> id $E‟T‟ $ $E‟ $ Back T‟->ε $ $ E‟->ε
  • 16. LL(1) Grammars • 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).
  • 17. LL(1) Grammars 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
  • 18. Error Recovery 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.
  • 19. Error Recovery 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.
  • 20. Nontermin Id + ( ) $ als * E E->TE‟ E->TE‟ synch synch E‟ E‟->+TE‟ E‟->ε E‟->ε T T->FT‟ synch T->FT‟ synch synch T‟ T‟-> ε T‟->*FT‟ T‟->ε T‟->ε F STACK id F-> synch synch INPUT F->(E) ACTIONsynch synch $E ) id * + id $ Error, skip ) $E id * + id $ Id is in FIRST(E) $E‟ T id * + id $ $E‟ T‟F id * + id $ $E‟ T‟id id * + id $ $E‟ T‟ * + id $ $E‟ T‟ F * * + id $ $E‟ T‟ F + id $ Error, M[F, +1 = synch $E‟ T‟ + id $ F has been popped $E‟ + id $ $E‟ T+ + id $ $E‟ T id $ $E‟ T‟ F id $ $E‟ T‟ id id $ $E‟T‟ $ $E‟ $ $ $ Back
  • 21. Error Recovery • 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
  • 22. Bottom 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.
  • 23. Bottom Up Parsing STACK INPUT ACTION 1) $ id1 + id2 * id3 $ Shift 2) $id1 + id2 * id3 $ Reduce by E - 3) $E + id2 * id3 $ >id 4) $E + id2 * id3 $ Shift 5) $E + id2 * id3 $ Shift 6) $E + E * id3 $ Reduce by E->id 7) $E + E * id3 $ Shift 8) $E + E * id3 $ Shift 9) $E + E * E $ Reduce by E->id 10)$E + E $ Reduce by E-> E * E 11)$E $ Reduce by E-> E+ E ACCEPT

Editor's Notes

  • #6: Top Down Parsing