Difference between revisions of "Top-Down Parsing/Example 3"

From Wiki**3

< Top-Down Parsing
(Solution)
 
(6 intermediate revisions by the same user not shown)
Line 16: Line 16:
 
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).
 
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 indirect left recursion is present in rules B and D. Also, there are left corners that may hide ambiguity (E).
+
A simple inspection of the grammar shows that indirect left recursion is present in rules '''B''' and '''D'''. Also, there are left corners that may hide ambiguity ('''E''').
  
The first step, then, is to rewrite the grammar so that mutual recursion is eliminated (A becomes unreachable and can be removed from the grammar):
+
The first step, then, is to rewrite the grammar so that mutual recursion is eliminated ('''D''' becomes unreachable and can be removed from the grammar):
  
 
   S -> u B z
 
   S -> u B z
Line 25: Line 25:
 
   E -> v | v x
 
   E -> v | v x
  
Now we handle the left corner (E in B) (since E is not completely replaced, it cannot be removed from the grammar):
+
Now we handle the left corner ('''E''' in '''B''') (since '''E''' is not completely replaced, it cannot be removed from the grammar):
  
 
   S -> u B z
 
   S -> u B z
Line 35: Line 35:
 
   S  -> u B z
 
   S  -> u B z
 
   B  -> v u E B1 | v x u E B1
 
   B  -> v u E B1 | v x u E B1
   B1 -> v B1 | y E B1 | ε
+
   B1 -> v B1 | y E B1 | ε
 +
  E  -> v | v x
  
 
Factoring...
 
Factoring...
Line 41: Line 42:
 
   S  -> u B z
 
   S  -> u B z
 
   B  -> v B2
 
   B  -> v B2
   B1 -> v B1 | y E B1 | ε
+
   B1 -> v B1 | y E B1 | ε
 
   B2 -> u E B1 | x u E B1
 
   B2 -> u E B1 | x u E B1
 +
  E  -> v E1
 +
  E1 -> x | ε
  
 
The FIRST and FOLLOW sets are as follows:
 
The FIRST and FOLLOW sets are as follows:
Line 48: Line 51:
 
   FIRST(S)  = FIRST(u B z) = {u}
 
   FIRST(S)  = FIRST(u B z) = {u}
 
   FIRST(B)  = FIRST(v B2) = {v}
 
   FIRST(B)  = FIRST(v B2) = {v}
   FIRST(B1) = FIRST(v B1) ∪ FIRST(y E B1) ∪ {ε} = {v, y, ε}
+
   FIRST(B1) = FIRST(v B1) FIRST(y E B1) {ε} = {v, y, ε}
   FIRST(B2) = FIRST(u E B1) ∪ FIRST(x u E B1) = {u, x}
+
   FIRST(B2) = FIRST(u E B1) FIRST(x u E B1) = {u, x}
 +
  FIRST(E)  = FIRST(v E1) = {v}
 +
  FIRST(E1) = {x} ∪ {ε} = {x, ε}
  
   FOLLOW(S) = {$}    FOLLOW(B1) ⊇ FOLLOW(B2)  
+
   FOLLOW(S) = {$}    FOLLOW(B) = {z}    FOLLOW(B1) FOLLOW(B2)    FOLLOW(B2) FOLLOW(B)
  FOLLOW(B) = {z}   FOLLOW(B2) ⊇ FOLLOW(B)
 
 
 
   FOLLOW(B1) = FOLLOW(B2) = FOLLOW(B) = {z}
 
   FOLLOW(B1) = FOLLOW(B2) = FOLLOW(B) = {z}
 +
  FOLLOW(E)  = FIRST(B1)\{ε} ∪ FOLLOW(B1) ∪ FOLLOW(B2) = {v, y, z}
 +
  FOLLOW(E1) = FOLLOW(E) = {v, y, z}
  
[[category:Compilers]]
+
For building the parse table, we will consider the FIRST and FOLLOW sets above.
[[category:Teaching]]
+
 
 +
<table>
 +
    <tr>
 +
      <td></td>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 20px; padding-right: 20px;">u</th>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 20px; padding-right: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">v</th>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 20px; padding-right: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">x</th>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 20px; padding-right: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">y</th>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 20px; padding-right: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">z</th>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 20px; padding-right: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">$</th>
 +
    </tr>
 +
    <tr>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">S</th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">S -&gt; u B z</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
    </tr>
 +
    <tr>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">B</th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">B -&gt; v B2</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
    </tr>
 +
    <tr>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">B1</th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">B1 -&gt; v B1</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">B1 -&gt; y E B1</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">B1 -&gt; </font><font face="Courier New, Courier, monospace">ε</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
    </tr>
 +
    <tr>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">B2</th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">B2 -&gt; u E B1</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">B2 -&gt; x u E B1</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
    </tr>
 +
    <tr>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">E</th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">E -&gt; v E1</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
    </tr>
 +
    <tr>
 +
      <th style="border: 1px solid black; background: wheat none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">E1</th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">E1 -&gt; </font><font face="Courier New, Courier, monospace">ε</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">E1 -&gt; x</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">E1 -&gt; </font><font face="Courier New, Courier, monospace">ε</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace">E1 -&gt; </font><font face="Courier New, Courier, monospace">ε</font></th>
 +
      <th style="border: 1px solid black; background: rgb(255, 255, 204) none repeat scroll 0% 50%; padding-left: 10px; padding-right: 10px; font-weight: normal; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font face="Courier New, Courier, monospace"></font></th>
 +
    </tr>
 +
</table>
 +
 
 +
The following table shows the parsing of the '''uvuvxz''' input sequence.
 +
 
 +
<table border="0" cellpadding="2" cellspacing="2" width="346">
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#f5deb3" valign="top"><b>STACK<br>
 +
      </b></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#f5deb3" valign="top"><b>INPUT<br>
 +
      </b></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#f5deb3" valign="top"><b>ACTION<br>
 +
      </b></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">S $</font><font
 +
face="Courier New, Courier, monospace"><br>
 +
      </font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">u v u v x z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">S -&gt; u B z</font><font
 +
face="Courier New, Courier, monospace"></font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">u B z $<br>
 +
      </font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">u v u v x z $</font><font
 +
face="Courier New, Courier, monospace"></font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">-&gt; u<br>
 +
      </font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">B z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">v u v x z $</font><font
 +
face="Courier New, Courier, monospace"></font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">B -&gt; v B2</font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">v B2 z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">v u v x z $</font><font
 +
face="Courier New, Courier, monospace"></font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">-&gt; v<br>
 +
      </font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">B2 z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">u v x z $</font><font
 +
face="Courier New, Courier, monospace"></font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">B2 -&gt; u E B1<br>
 +
      </font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">u E B1</font><font
 +
face="Courier New, Courier, monospace"> z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">u v x z $</font><font
 +
face="Courier New, Courier, monospace"></font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">-&gt; u<br>
 +
      </font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">E B1</font><font
 +
face="Courier New, Courier, monospace"> z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">v x z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">E -&gt; v E1</font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">v E1 </font><font
 +
face="Courier New, Courier, monospace">B1</font><font
 +
face="Courier New, Courier, monospace"> z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">v x z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">-&gt; v<br>
 +
      </font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">E1 </font><font
 +
face="Courier New, Courier, monospace">B1</font><font
 +
face="Courier New, Courier, monospace"> z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">x z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">E1 -&gt; x</font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">x B1</font><font
 +
face="Courier New, Courier, monospace"> z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">x z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top">-&gt; x<br>
 +
      </td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">B1</font><font
 +
face="Courier New, Courier, monospace"> z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">B1 -&gt; </font><font
 +
face="Courier New, Courier, monospace">ε</font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">z $</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">z $</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">-&gt; z<br>
 +
      </font></td>
 +
    </tr>
 +
    <tr>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">$</font></td>
 +
      <td style="border: 1px solid black;" align="right"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">$</font></td>
 +
      <td style="border: 1px solid black;" align="center"
 +
bgcolor="#ffffcc" valign="top"><font
 +
face="Courier New, Courier, monospace">ACCEPT<br>
 +
      </font></td>
 +
    </tr>
 +
</table>
 +
 
 +
[[category:Compiladores]]
 +
[[category:Ensino]]

Latest revision as of 16:40, 6 April 2015

Problem

Consider the following grammar, where S is the initial symbol and {u,v,x,y,z} is the set of terminal symbols:

 S -> u B z
 B -> B v | D
 D -> E u E | B y E
 E -> v | v x
  1. Examine the grammar and rewrite it so that an LL(1) predictive parser can be built for the corresponding language.
  2. Compute the FIRST and FOLLOW sets for all non-terminal symbols in the new grammar and build the parse table.
  3. Show the analysis table (stack, input, and actions) for the parsing process of the uvuvxz input sequence.

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 indirect left recursion is present in rules B and D. Also, there are left corners that may hide ambiguity (E).

The first step, then, is to rewrite the grammar so that mutual recursion is eliminated (D becomes unreachable and can be removed from the grammar):

 S -> u B z
 B -> B v | E u E | B y E
 D -> E u E | B y E
 E -> v | v x

Now we handle the left corner (E in B) (since E is not completely replaced, it cannot be removed from the grammar):

 S -> u B z
 B -> B v | v u E | v x u E | B y E
 E -> v | v x

Now, left recursion can be eliminated:

 S  -> u B z
 B  -> v u E B1 | v x u E B1
 B1 -> v B1 | y E B1 | ε
 E  -> v | v x

Factoring...

 S  -> u B z
 B  -> v B2
 B1 -> v B1 | y E B1 | ε
 B2 -> u E B1 | x u E B1
 E  -> v E1
 E1 -> x | ε

The FIRST and FOLLOW sets are as follows:

 FIRST(S)  = FIRST(u B z) = {u}
 FIRST(B)  = FIRST(v B2) = {v}
 FIRST(B1) = FIRST(v B1) ∪ FIRST(y E B1) ∪ {ε} = {v, y, ε}
 FIRST(B2) = FIRST(u E B1) ∪ FIRST(x u E B1) = {u, x}
 FIRST(E)  = FIRST(v E1) = {v}
 FIRST(E1) = {x} ∪ {ε} = {x, ε}
 FOLLOW(S)  = {$}    FOLLOW(B) = {z}    FOLLOW(B1) ⊇ FOLLOW(B2)    FOLLOW(B2) ⊇ FOLLOW(B)
 FOLLOW(B1) = FOLLOW(B2) = FOLLOW(B) = {z}
 FOLLOW(E)  = FIRST(B1)\{ε} ∪ FOLLOW(B1) ∪ FOLLOW(B2) = {v, y, z}
 FOLLOW(E1) = FOLLOW(E) = {v, y, z}

For building the parse table, we will consider the FIRST and FOLLOW sets above.

u v x y z $
S S -> u B z
B B -> v B2
B1 B1 -> v B1 B1 -> y E B1 B1 -> ε
B2 B2 -> u E B1 B2 -> x u E B1
E E -> v E1
E1 E1 -> ε E1 -> x E1 -> ε E1 -> ε

The following table shows the parsing of the uvuvxz input sequence.

STACK
INPUT
ACTION
S $
u v u v x z $ S -> u B z
u B z $
u v u v x z $ -> u
B z $ v u v x z $ B -> v B2
v B2 z $ v u v x z $ -> v
B2 z $ u v x z $ B2 -> u E B1
u E B1 z $ u v x z $ -> u
E B1 z $ v x z $ E -> v E1
v E1 B1 z $ v x z $ -> v
E1 B1 z $ x z $ E1 -> x
x B1 z $ x z $ -> x
B1 z $ z $ B1 -> ε
z $ z $ -> z
$ $ ACCEPT