Top-Down Parsing/Example 1: Difference between revisions

From Wiki**3

< Top-Down Parsing
No edit summary
(Redirected page to ist:Top-Down Parsing/Example 1)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
== Problem ==
#REDIRECT [[ist:Top-Down Parsing/Example 1]]
 
Consider the following grammar with the following set of terminal symbols '''<tt>{+,-,*,/,(,),id}</tt>''':
 
  E -> E + T | E - T | T
  T -> T * F | T / F | F
  F -> ( E ) | id
 
# Rewrite the grammar so that it can be analyzed by an LL(1) predictive parser.
# Compute the FIRST and FOLLOW sets for the non-terminal symbols.
# Build the parse table for the predictive parser.
# Process the input phrase '''<tt>a*(b+c)</tt>''' detailing the contents of the stack, the input and each action performed by the parser.
 
== Solution ==
 
The grammar can be parsed by an LL(1) parser if it does not have left recursion and no ambiguity is present (i.e., the LOOKAHEADs for all productions of each non-terminal are disjoint).
 
A simple inspection of the grammar shows that left recursion is present in both E and T rules. Also, there are left corners that may hide ambiguity.
 
The first step, then, is to rewrite the grammar so that left recursion is eliminated:
 
  E  -> T E'
  E' -> + T E' | - T E' | ε
  T  -> F T'
  T' -> * F T' | / F T' | ε
  F  -> ( E ) | id
 
The new grammar still has left corners, but a cursory inspection shows that they are not problematic. Nevertheless, they should be eliminated:
 
  E  -> ( E ) T' E' | id T' E'
  E' -> + T E' | - T E' | ε
  T  -> ( E ) T' | id T'
  T' -> * F T' | / F T' | ε
  F  -> ( E ) | id
 
  FIRST(E)  = FIRST(( E ) T' E') ∪ FIRST(id T' E') = {(, id}
  FIRST(E') = FIRST(+ T E') ∪ FIRST(- T E') ∪ {ε} = {+, -, ε}
  FIRST(T)  = FIRST(( E ) T') ∪ FIRST(id T') = {(, id}
  FIRST(T') = FIRST(* F T') ∪ FIRST(/ F T') ∪ {ε} = {*, /, ε}
  FIRST(F)  = FIRST(( E )) ∪ FIRST(id) = {(, id}
 
  FOLLOW(E)  = {$} ∪ {)} = {), $}
  FOLLOW(E') = FOLLOW(E) = {), $}
  FOLLOW(T)  = FIRST(E')\{ε} ∪ FOLLOW(E') = {+, -, ), $}
  FOLLOW(T') = FOLLOW(T) = {+, -, ), $}
  FOLLOW(F)  = FIRST(T')\{ε} ∪ FOLLOW(T') = {*, /, +, -, ), $}
 
For building the parse table, we will consider the FIRST and FOLLOW sets above.
{|
|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | +
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | -
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | *
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | /
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | id
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | (
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | )
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 20px; padding-right: 20px; background: wheat;" | $
|-
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; background: wheat;" | E
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| E  -> id T' E'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| E  -> ( E ) T' E'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
|-
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; background: wheat;" | E'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| E' -> + T E'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| E' -> - T E'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| E' -> ε
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| E' -> ε
|-
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; background: wheat;" | T
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T  -> id T'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T  -> ( E ) T'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
|-
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; background: wheat;" | T'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T' -> ε
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T' -> ε
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T' -> * F T'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T' -> / F T'
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T' -> ε
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| T' -> ε
|-
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; background: wheat;" | F
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| F  -> id
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"| F  -> ( E )
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
! style="border-style: solid; border-width: 1px; border-color: black; padding-left: 10px; padding-right: 10px; font-weight: normal; align: center; background: #ffffcc;"|
|}
 
The following table show the parsing of the '''a*(b+c)''' input sequence.
<table border="0" cellpadding="2" cellspacing="2" height="631" width="346">
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#f5deb3" valign="top"><b>STACK</b></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#f5deb3" valign="top"><b>INPUT</b></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#f5deb3" valign="top"><b>ACTION</b></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">E$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">a*(b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace"> E -&gt; id T' E'</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">idT'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">a*(b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">-&gt; id ≡ a</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">T'E'$<br>
      </font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">*(b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> T' -&gt; * F T'</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">*FT'E'$<br>
      </font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">*(b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">-&gt; *<br>
      </font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">FT'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">(b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> F -&gt; ( E )</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">(E)T'E'$<br>
      </font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">(b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">-&gt; (<br>
      </font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">E)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> E -&gt; id T' E'</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">idT'E')T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">b+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font face="Courier New, Courier, monospace">-&gt; id ≡ b</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">T'</font><font
face="Courier New, Courier, monospace">E'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> T' -&gt; ε</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">E'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> E' -&gt; + T E'</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">+TE'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">+c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">-&gt; +<br>
      </font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">TE'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> T -&gt; id T'</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">idT'</font><font
face="Courier New, Courier, monospace">E'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">c)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">-&gt; id ≡ c<br>
      </font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">T'</font><font
face="Courier New, Courier, monospace">E'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> T' -&gt; ε</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">E'</font><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> E' -&gt; ε</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">)T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">)$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">-&gt; )</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">T'E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> T' -&gt; ε</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">E'$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace"> E' -&gt; ε</font></td>
    </tr>
    <tr>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="right" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">$</font></td>
      <td style="border-style: solid; border-width: 1px; border-color: black;" align="center" bgcolor="#ffffcc" valign="top"><font
face="Courier New, Courier, monospace">ACCEPT<br>
      </font></td>
    </tr>
</table>
 
 
[[category:Compilers]]
[[category:Teaching]]

Latest revision as of 22:18, 5 December 2018