Syntax Analysis
Syntax Analysis
Syntax Analysis
Outline
Context-Free Grammars (CFGs)
Parsing
Top-Down
Recursive Descent
Table-Driven
Bottom-Up
LR Parsing Algorithm
How to Build LR Tables
Parser Generators
Grammar Issues for Programming Languages
Top-Down Parsing
!LL Grammars - A subclass of all CFGs
!Recursive-Descent Parsers - Programmed by hand
!Non-Recursive Predictive Parsers - Table Driven
!Simple, Easy to Build, Better Error Handling
Bottom-Up Parsing
!LR Grammars - A larger subclass of CFGs
!Complex Parsing Algorithms - Table Driven
!Table Construction Techniques
!Parser Generators use this technique
!Faster Parsing, Larger Set of Grammars
!Complex
!Error Reporting is Tricky
Output of Parser?
Succeed is string is recognized
... and fail if syntax errors
Syntax Errors?
Good, descriptive, helpful message!
Recover and continue parsing!
*
Errors in Programs
Lexical
if x<1 thenn y = 5:
Typos
Syntactic
if ((x<1) & (y>5))) ...
{ ... { ...
... }
Semantic
if (x+5) then ...
Type Errors
Undefined IDs, etc.
Logical Errors
if (i<9) then ...
Compiler
Always halts
Any checks guaranteed to terminate
Decidable
Other Program Checking Techniques
Debugging
Testing
Correctness Proofs
Partially Decidable
Okay? ! The test terminates.
Not Okay? ! The test may not terminate!
You may need to run some programs to see if they are okay.
Requirements
Detect All Errors (Except Logical!)
Messages should be helpful.
Difficult to produce clear messages!
Example:
Syntax Error
Example:
Line 23: Unmatched Paren
if ((x == 1) then
^
Missing } here
Example
var myVarr: Integer;
...
x := myVar;
Misspelled ID here
...
Detected here as
Undeclared ID
Harry H. Porter, 2005
Error-Correcting Compilers
!Issue an error message
!Fix the problem
!Produce an executable
Example
Error on line 23: myVarr undefined.
myVar was used.
Error Avalanche
One error generates a cascade of messages
Example
x := 5 while ( a == b ) do
^
Expecting ;
^
Expecting ;
^
Expecting ;
10
Example
Skip to next occurrence of
} end ;
!Simple to implement
!Commonly used
!The key...
Good set of synchronizing tokens
Knowing what to do then
!May skip over large sections of source
11
Example
while (x = 4)
y := a+b; ...
!The key...
Dont get into an infinite loop
...constantly inserting tokens
...and never scanning the actual source
12
Used with...
LR (Bottom-up) parsing
!Parser Generators
13
Token Classes
ID INTEGER REAL
Punctuation
;
Non-terminals
Any symbol appearing on the lefthand side of any rule
Start Symbol
Usually the non-terminal on the lefthand side of the first rule
Rules (or Productions)
BNF: Backus-Naur Form / Backus-Normal Form
Stmt ::= if Expr then Stmt else Stmt
Harry H. Porter, 2005
14
Rule Alternatives
E
E
E
E
"E+E
"(E)
"-E
" ID
E "E+E
"(E)
"-E
" ID
E "E+E
|(E)
|-E
| ID
E "E+E
| (E) | -E |
ID
15
Notational Conventions
Terminals
a b c ...
Nonterminals
A B C ...
S
Expr
Grammar Symbols (Terminals or Nonterminals)
X Y Z U V W ...
Strings of Symbols
# $ % ...
Strings of Terminals
x y z u v w ...
A sequence of zero
Or more terminals
And nonterminals
Including &
Examples
A"#B
A rule whose righthand side ends with a nonterminal
A"x#
A rule whose righthand side begins with a string of terminals (call it x)
Harry H. Porter, 2005
16
Derivations
1.
2.
3.
4.
5.
E "E+E
"E*E
"(E)
"-E
" ID
A Derivation of (id*id)
E ! (E) ! (E*E) ! (id*E) ! (id*id)
Sentential Forms
A sequence of terminals and nonterminals in a derivation
(id*E)
Harry H. Porter, 2005
17
#A% ! #$%
Any sentential form containing a nonterminal (call it A)
... such that A matches the nonterminal in some rule.
Derives in zero-or-more steps !*
E !*
If #
(id*id)
!* $ and $ ! %, then # !* %
18
Given
G
S
A grammar
The Start Symbol
Define
L(G) The language generated
L(G) = { w | S !+ w}
Equivalence of CFGs
If two CFGs generate the same language, we say they are equivalent.
G1 ' G2 whenever L(G1) = L(G2)
In making a derivation...
Choose which nonterminal to expand
Choose which rule to apply
19
Leftmost Derivations
In a derivation... always expand the leftmost nonterminal.
E
!
E+E
!
(E)+E
!
(E*E)+E
!
(id*E)+E
!
(id*id)+E
!
(id*id)+id
1.
2.
3.
4.
5.
E "E+E
"E*E
"(E)
"-E
" ID
Let !LM denote a step in a leftmost derivation (!LM* means zero-or-more steps )
!LM* #
Rightmost Derivations
In a derivation... always expand the rightmost nonterminal.
E
1.
!
E+E
2.
!
E+id
3.
!
(E)+id
4.
!
(E*E)+id
5.
!
(E*id)+id
!
(id*id)+id
E "E+E
"E*E
"(E)
"-E
" ID
Let !RM denote a step in a rightmost derivation (!RM* means zero-or-more steps )
!RM* #
21
Bottom-Up Parsing
Bottom-up parsers discover rightmost derivations!
Parser moves from input string back to S.
Follow
S !RM* w
in reverse.
22
Parse Trees
Two choices at each step in a derivation...
!Which non-terminal to expand
!Which rule to use in replacing it
Leftmost Derivation:
!
!
!
!
!
!
E
E+E
(E)+E
(E*E)+E
(id*E)+E
(id*id)+E
(id*id)+id
1. E " E + E
2.
"E*E
3.
"(E)
4.
"-E
5.
" ID
E
E
id
id
id
23
Parse Trees
Two choices at each step in a derivation...
!Which non-terminal to expand
!Which rule to use in replacing it
Rightmost Derivation:
!
!
!
!
!
!
1. E " E + E
2.
"E*E
3.
"(E)
4.
"-E
5.
" ID
id
id
Harry H. Porter, 2005
E
E+E
E+id
(E)+id
(E*E)+id
(E*id)+id
(id*id)+id
id
24
Parse Trees
Two choices at each step in a derivation...
!Which non-terminal to expand
!Which rule to use in replacing it
Leftmost Derivation:
!
!
!
!
!
!
Rightmost Derivation:
E
E+E
(E)+E
(E*E)+E
(id*E)+E
(id*id)+E
(id*id)+id
1. E " E + E
2.
"E*E
3.
"(E)
4.
"-E
5.
" ID
!
!
!
!
!
!
E
E
id
id
E
E+E
E+id
(E)+id
(E*E)+id
(E*id)+id
(id*id)+id
E
id
25
Rightmost Derivation of
(id*id)+id
(id*id)+id
Ambiguity:
However, one input string may have several parse trees!!!
Therefore:
!Several leftmost derivations
!Several rightmost derivations
26
Ambuiguous Grammars
E
Leftmost Derivation #1
!
!
!
!
!
E
E+E
id+E
id+E*E
id+id*E
id+id*id
id
Input: id+id*id
E
id
id
Leftmost Derivation #2
!
!
!
!
!
1. E " E + E
2.
"E*E
3.
"(E)
4.
"-E
5.
" ID
E
E*E
E+E*E
id+E*E
id+id*E
id+id*id
E
id
id
id
27
Ambiguous Grammar
More than one Parse Tree for some sentence.
The grammar for a programming language may be ambiguous
Need to modify it for parsing.
28
29
IfStmt
Expr
Expr
if
...
then
Stmt
Stmt
Expr
elseIf
then
Stmt
...
...
Stmt
else
end
...
Terminal Symbols:
Harry H. Porter, 2005
Nonterminal Symbols:
30
if
E1
then
if
S
E2
else
then
S2
S1
if
E1
if
E2
then
then
S
S1
else
S2
31
WithElse
"
"
"
"
"
Any Stmt occurring between then and else must have an else.
i.e., the Stmt must not end with then Stmt.
Interpretation #2: if E1 then (if E2 then S1 else S2)
Stmt
if
if
E1
E2
then
Stmt
S2
32
WithElse
"
"
"
"
"
Any Stmt occurring between then and else must have an else.
i.e., the Stmt must not end with then Stmt.
Interpretation #1: if E1 then (if E2 then S1) else S2
Stmt
if
E1
then
WithElse
else
Stmt
33
WithElse
"
"
"
"
"
Any Stmt occurring between then and else must have an else.
i.e., the Stmt must not end with then Stmt.
Interpretation #1: if E1 then (if E2 then S1) else S2
Stmt
if
if
E2
E1
then
WithElse
else
Stmt
34
WithElse
"
"
"
"
"
Any Stmt occurring between then and else must have an else.
i.e., the Stmt must not end with then Stmt.
Interpretation #1: if E1 then (if E2 then S1) else S2
Stmt
if
if
E2
E1
then
WithElse
else
Stmt
Oops, No Match!
Harry H. Porter, 2005
35
Top-Down Parsing
Find a left-most derivation
Find (build) a parse tree
Start building from the root and work down...
As we search for a derivation...
Must make choices:
!Which rule to use
!Where to use it
May run into problems!
Option 1:
Backtracking
Made a bad decision
Back up and try another choice
Option 2:
Always make the right choice.
Never have to backtrack: Predictive Parser
Possible for some grammars (LL Grammars)
May be able to fix some grammars (but not others)
!Eliminate Left Recursion
!Left-Factor the Rules
Harry H. Porter, 2005
36
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
37
Backtracking
Input: aabbde
S
A
1.
2.
3.
4.
5.
6.
7.
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
38
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
39
Backtracking
Input: aabbde
S
A
a
1.
2.
3.
4.
5.
6.
7.
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
40
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
41
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
42
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
43
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
44
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
45
Backtracking
Input: aabbde
S
A
a
1.
2.
3.
4.
5.
6.
7.
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
We need an ability to
back up in the input!!!
46
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
47
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
a
b
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
48
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
a
b
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
49
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
a
b
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
50
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
a
b
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
51
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
a
a
b
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
52
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
A
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
53
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
54
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
C
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
55
Backtracking
Input: aabbde
S
C
a
1.
2.
3.
4.
5.
6.
7.
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
56
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
C
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
57
Backtracking
Input: aabbde
1.
2.
3.
4.
5.
6.
7.
S
C
a
S " Aa
" Ce
A " aaB
" aaba
B " bbb
C " aaD
D " bbd
58
Predictive Parsing
Will never backtrack!
Requirement:
For every rule:
A " #1 | #2 | #3 | ... | #N
We must be able to choose the correct alternative
by looking only at the next symbol
May peek ahead to the next symbol (token).
Example
A
" aB
" cD
"E
Assuming a,c ) FIRST (E)
Example
Stmt " if Expr ...
" for LValue ...
" while Expr ...
" return Expr ...
" ID ...
Harry H. Porter, 2005
59
Predictive Parsing
LL(1) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next 1 input symbol
60
Predictive Parsing
LL(1) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next 1 input symbol
LL(k) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next k input symbols
61
Predictive Parsing
LL(1) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next 1 input symbol
LL(k) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next k input symbols
Techniques to modify the grammar:
!Left Factoring
!Removal of Left Recursion
62
Predictive Parsing
LL(1) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next 1 input symbol
LL(k) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next k input symbols
Techniques to modify the grammar:
!Left Factoring
!Removal of Left Recursion
But these may not be enough!
63
Predictive Parsing
LL(1) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next 1 input symbol
LL(k) Grammars
Can do predictive parsing
Can select the right rule
Looking at only the next k input symbols
Techniques to modify the grammar:
!Left Factoring
!Removal of Left Recursion
But these may not be enough!
LL(k) Language
Can be described with an LL(k) grammar.
64
Left-Factoring
Problem:
Stmt
65
Left-Factoring
Problem:
Stmt
66
Left-Factoring
Problem:
Stmt
A
C
" #C | *1 | *2 | *3 | ...
" $1 | $2 | $3 | ...
67
Left-Factoring
Problem:
Stmt
A
& $1
$2
1
With predictive parsing,
we need to know which rule to use!
(While looking at just the next token)
Solution:
Stmt
" if Expr then Stmt ElsePart
" OtherStmt
ElsePart " else Stmt | &
General Approach:
Before: A
" #$1 | #$2 | #$3 | ... | *1 | *2 | *3 | ...
After:
Harry H. Porter, 2005
A
C
" #C | *1 | *2 | *3 | ...
" $1 | $2 | $3 | ...
68
Left-Factoring
Problem:
Stmt
A
& $1
$2
1
With predictive parsing,
we need to know which rule to use!
(While looking at just the next token)
Solution:
Stmt
" if Expr then Stmt ElsePart
" OtherStmt
*1
2
General Approach: 1
Before: A
" #$1 | #$2 | #$3 | ... | *1 | *2 | *3 | ...
After:
A
C
" #C | *1 | *2 | *3 | ...
" $1 | $2 | $3 | ...
69
Left Recursion
Whenever
A !+ A#
Simplest Case: Immediate Left Recursion
Given:
A " A# | $
Transform into:
A " $A'
A' " #A' | &
70
71
72
S ! Af ! Sdf
73
S ! Af ! Sdf
Approach:
Look at the rules for S only (ignoring other rules)... No left recursion.
74
S ! Af ! Sdf
Approach:
Look at the rules for S only (ignoring other rules)... No left recursion.
Look at the rules for A...
75
S ! Af ! Sdf
Approach:
Look at the rules for S only (ignoring other rules)... No left recursion.
Look at the rules for A...
Do any of As rules start with S? Yes.
A " Sd
76
S ! Af ! Sdf
Approach:
Look at the rules for S only (ignoring other rules)... No left recursion.
Look at the rules for A...
Do any of As rules start with S? Yes.
A " Sd
Get rid of the S. Substitute in the righthand sides of S.
A " Afd | bd
77
S ! Af ! Sdf
Approach:
Look at the rules for S only (ignoring other rules)... No left recursion.
Look at the rules for A...
Do any of As rules start with S? Yes.
A " Sd
Get rid of the S. Substitute in the righthand sides of S.
A " Afd | bd
The modified grammar:
S " Af | b
A " Ac | Afd | bd | e
78
S ! Af ! Sdf
Approach:
Look at the rules for S only (ignoring other rules)... No left recursion.
Look at the rules for A...
Do any of As rules start with S? Yes.
A " Sd
Get rid of the S. Substitute in the righthand sides of S.
A " Afd | bd
The modified grammar:
S " Af | b
A " Ac | Afd | bd | e
Now eliminate immediate left recursion involving A.
S " Af | b
A " bdA' | eA'
A' " cA' | fdA' | &
Harry H. Porter, 2005
79
80
81
82
83
84
85
86
87
88
89
90
91
92
A7
Ai
Outer Loop
93
Example
E "
E' "
T "
T' "
F "
Step 1:
Step 2:
Term ...
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
94
E "
E' "
T "
T' "
F "
X
Y
Z
$
Stack of
grammar symbols
* 4 )
Input String
Algorithm
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Output
Pre-Computed Table:
95
E "
E' "
T "
T' "
F "
X
Y
Z
$
Stack of
grammar symbols
* 4 )
Input String
id
E"TE'
Output
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
E'"+TE'
E'
Nonterminals
Algorithm
Pre-Computed Table:
E
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
96
E "
E' "
T "
T' "
F "
X
Y
Z
$
Stack of
grammar symbols
* 4 )
Input String
id
E"TE'
Output
T"FT'
F"id
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
T'
Blank entries
indicate ERROR
E"TE'
E'"+TE'
E'
Nonterminals
Algorithm
Pre-Computed Table:
E
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
97
98
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
( id * id )
id
E"TE'
+ id
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
99
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
( id * id )
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
+ id
id
E"TE'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
E'"+TE'
E'
T
T'"*FT'
F"(E)
100
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
( id * id )
E
T
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
101
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
( id * id )
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
+ id $
E"TE'
T"FT'
T'
F
E'"+TE'
E'
T
Look at Table [ E, ( ]
Use rule E"TE'
Pop E
Push E'
Push T
Print E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
102
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
" T E'
( id * id )
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
Look at Table [ E, ( ]
Use rule E"TE'
Pop E
Push E'
Push T
Print E"TE'
E'"+TE'
E'
T
+ id $
T'"*FT'
F"id
F"(E)
103
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
" T E'
( id * id )
Table [ T, ( ] = T"FT'
Pop T
Push T
Push F
Print T"FT'
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+
E'"+TE'
E'
+ id $
T'"*FT'
F"(E)
104
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
" T E'
" F T'
( id * id )
Table [ T, ( ] = T"FT'
Pop T
Push T
Push F
Print T"FT'
F
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
T'"*FT'
F"id
F"(E)
105
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
" T E'
" F T'
( id * id )
F
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
E'"+TE'
E'
T
Table [ F, ( ] = F"(E)
Pop F
Push (
Push E
Push )
Print F"(E)
+ id $
T'"*FT'
F"(E)
106
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
" T E'
" F T'
" ( E )
( id * id )
(
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
Table [ F, ( ] = F"(E)
Pop F
Push )
Push E
Push (
Print F"(E)
E'"+TE'
E'
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
107
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
" T E'
" F T'
" ( E )
( id * id )
(
E
)
T
E
$
id
E"TE'
T
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
108
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
" T E'
" F T'
" ( E )
( id * id )
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
109
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
" T E'
" F T'
" ( E )
( id * id )
E
)
T
E
$
id
E"TE'
T
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
Table [ E, id ] = E"TE'
Pop E
Push E'
Push T
Print E"TE'
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
110
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
"
"
"
"
T
F
(
T
E'
T'
E )
E'
( id * id )
T
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
Table [ E, id ] = E"TE'
Pop E
Push E'
Push T
Print E"TE'
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
111
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
"
"
"
"
T
F
(
T
E'
T'
E )
E'
( id * id )
T
E
)
T
E
$
id
E"TE'
T
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
Table [ T, id ] = T"FT'
Pop T
Push T'
Push F
Print T"FT'
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
112
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
"
"
"
"
"
T
F
(
T
F
E'
T'
E )
E'
T'
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
Table [ T, id ] = T"FT'
Pop T
Push T'
Push F
Print T"FT'
E'"+TE'
E'
T
( id * id )
F
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
113
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
"
"
"
"
"
T
F
(
T
F
E'
T'
E )
E'
T'
id
E"TE'
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
Table [ F, id ] = F"id
Pop F
Push id
Print F"id
E'"+TE'
E'
T
( id * id )
F
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
114
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
Table [ F, id ] = F"id
Pop F
Push id
Print F"id
E'"+TE'
E'
T
( id * id )
id
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
115
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
id
E"TE'
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
E'"+TE'
E'
T
( id * id )
id
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
116
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
( id * id )
T
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
117
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
( id * id )
T
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+ id $
E'"+TE'
E'
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
118
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
*
F
T
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E'"+TE'
E'
T
( id * id )
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
119
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
*
F
T
E
)
T
E
$
id
E"TE'
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
E'"+TE'
E'
T
( id * id )
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
120
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E'"+TE'
E'
T
( id * id )
F
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
121
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
E"TE'
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
Table [ F, id ] = F"id
Pop F
Push id
Print F"id
E'"+TE'
E'
T
( id * id )
F
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
122
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
Table [ F, id ] = F"id
Pop F
Push id
Print F"id
E'"+TE'
E'
T
( id * id )
id
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
123
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
id
E"TE'
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
E'"+TE'
E'
T
( id * id )
id
T
E
)
T
E
$
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
124
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
( id * id )
T
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
125
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
( id * id )
T
E
)
T
E
$
id
E"TE'
T
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
126
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
( id * id )
E
)
T
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
127
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
( id * id )
E
)
T
E
$
id
E"TE'
T
F
Harry H. Porter, 2005
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
+ id $
E'"+TE'
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
128
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
)
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
129
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
( id * id )
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+
E'"+TE'
E'
+ id $
)
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
130
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
131
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
( id * id )
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+
E'"+TE'
E'
+ id $
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
132
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
E
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
133
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
E
( id * id )
E
$
id
E"TE'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+ id $
E'"+TE'
E'
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
134
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
E
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
T
+ id $
+
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
135
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
E
( id * id )
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+
E'"+TE'
E'
+ id $
+
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
136
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
E
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
137
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
E
( id * id )
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+
E'"+TE'
E'
+ id $
Table [ T, id ] = T"FT'
Pop T
Push T'
Push F
Print T"FT'
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
138
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
E
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
T"FT'
T"FT'
T'"&
T'
F
E'"+TE'
E'
+ id $
Table [ T, id ] = T"FT'
Pop T
Push T'
Push F
Print T"FT'
F
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
139
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
E
( id * id )
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
T"FT'
T'
F
+
E'"+TE'
E'
+ id $
Table [ F, id ] = F"id
Pop F
Push id
Print F"id
F
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
140
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
E'
T
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
E'"+TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
Table [ F, id ] = F"id
Pop F
Push id
Print F"id
id
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
141
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
E'
T
( id * id )
F
Harry H. Porter, 2005
T"FT'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
E'"+TE'
T'
+ id $
id
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
142
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
E'
T
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
E'"+TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
143
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
E'
T
( id * id )
F
Harry H. Porter, 2005
T"FT'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
E'"+TE'
T'
+ id $
T
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
144
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
&
E'
T
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
E'"+TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
145
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
&
E'
T
( id * id )
F
Harry H. Porter, 2005
T"FT'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
E'"+TE'
T'
+ id $
E
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
146
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
&
E'
&
T
( id * id )
E'"&
E'"&
T'"&
T'"&
E"TE'
E'"+TE'
T"FT'
T"FT'
T'"&
T'
F
+ id $
$
id
E"TE'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"id
F"(E)
147
E "
E' "
T "
T' "
F "
Example
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id E
&
E'
&
T
( id * id )
+ id $
Input symbol == $
Top of stack == $
Loop terminates with success
$
id
E"TE'
T"FT'
E'"&
E'"&
T'"&
T'"&
T"FT'
T'"&
F"id
E"TE'
E'"+TE'
T'
F
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'"*FT'
F"(E)
148
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
" T E'
E'
149
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
" T E'
" F T'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
E'
T
F
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
150
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
" T E'
" F T'
" ( E )
E'
T
F
(
T'
)
151
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
"
"
"
"
T
F
(
T
E'
T'
E )
E'
(
T
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
E'
T
F
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
)
E'
152
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
"
"
"
"
"
T
F
(
T
F
E'
T'
E )
E'
T'
E'
T
F
(
T'
)
E'
T'
153
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
"
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T E'
F T'
( E )
T E'
F T'
id
E'
T
F
(
T
F
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
)
E'
T'
id
154
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
E'
T
F
(
T'
)
E'
T'
F
id
T'
155
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
"
"
"
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
E'
T
F
(
T'
)
E'
T'
F
id
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
id
Harry H. Porter, 2005
156
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
E'
T
F
(
T'
)
E'
T'
F
id
T'
id
&
157
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
F
(
T'
)
id
E'
&
T'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
id
&
158
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
E'
T
F
(
T'
)
&
E'
&
T'
F
id
T'
id
&
159
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F
(
T'
)
id
E'
&
E'
&
T'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
E'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
id
&
160
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
E'
T
F
(
&
T
F
E'
T'
E'
&
T'
F
id
T'
T'
id
&
161
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id
F
(
T'
)
&
E'
T
F
E'
T'
id
&
T'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
E'
id
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
id
&
162
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id
&
E'
T
F
(
&
E'
E'
T'
id
&
&
T'
F
id
T'
T'
id
&
163
E "
E' "
T "
T' "
F "
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id
&
&
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
E'
T
F
(
T'
)
id
&
E'
E'
T'
id
&
&
&
T'
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
T'
id
&
164
Input:
(id*id)+id
Output:
E
T
F
E
T
F
T'
F
T'
E'
T'
E'
T
F
T'
E'
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
T E'
F T'
( E )
T E'
F T'
id
* F T'
id
&
&
&
+ T E'
F T'
id
&
&
Leftmost Derivation:
E
T E'
F T' E'
( E ) T' E'
( T E' ) T' E'
( F T' E' ) T' E'
( id T' E' ) T' E'
( id * F T' E' ) T' E'
( id * id T' E' ) T' E'
( id * id E' ) T' E'
( id * id ) T' E'
( id * id ) E'
( id * id ) + T E'
( id * id ) + F T' E'
( id * id ) + id T' E'
( id * id ) + id E'
( id * id ) + id
E "
E' "
T "
T' "
F "
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
165
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
166
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
Example:
E"
E'"
T"
T'"
F "
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
FIRST (F) = ?
167
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
Example:
E"
E'"
T"
T'"
F "
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
FIRST (F) = { (, id }
FIRST (T') = ?
168
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
Example:
E"
E'"
T"
T'"
F "
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
FIRST (F) = { (, id }
FIRST (T') = { *, &}
FIRST (T) = ?
169
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
Example:
E"
E'"
T"
T'"
F "
FIRST (F)
FIRST (T')
FIRST (T)
FIRST (E')
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
= { (, id }
= { *, &}
= { (, id }
=?
170
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
Example:
E"
E'"
T"
T'"
F "
FIRST (F)
FIRST (T')
FIRST (T)
FIRST (E')
FIRST (E)
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
= { (, id }
= { *, &}
= { (, id }
= { +, &}
=?
171
FIRST Function
Let # be a string of symbols (terminals and nonterminals)
Define:
FIRST (#) = The set of terminals that could occur first
in any string derivable from #
= { a | # !* aw, plus & if # !* & }
Example:
E"
E'"
T"
T'"
F "
FIRST (F)
FIRST (T')
FIRST (T)
FIRST (E')
FIRST (E)
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
= { (, id }
= { *, &}
= { (, id }
= { +, &}
= { (, id }
172
173
174
endIf
Harry H. Porter, 2005
175
endIf
endIf
Harry H. Porter, 2005
176
endIf
endIf
endIf
Harry H. Porter, 2005
177
endIf
...
endIf
endIf
endIf
Harry H. Porter, 2005
178
179
180
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
?
?
?
?
?
181
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Add $ to FOLLOW(S)
182
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Add $ to FOLLOW(S)
183
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
F " ( E ) | id
What can follow E?
184
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
F " ( E ) | id
What can follow E?
185
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
E " T E'
Whatever can follow E
can also follow E'
186
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
E " T E'
Whatever can follow E
can also follow E'
187
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
E'0 " + T E'1
Whatever is in FIRST(E'1)
can follow T
188
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
E'0 " + T E'1
Whatever is in FIRST(E'1)
can follow T
189
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
T'0 " * F T'1
Whatever is in FIRST(T'1)
can follow F
190
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
T'0 " * F T'1
Whatever is in FIRST(T'1)
can follow F
191
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
E'0 " + T E'1
Since E'1 can go to &
i.e., & + FIRST(E')
Everything in FOLLOW(E'0)
can follow T
192
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
E'0 " + T E'1
Since E'1 can go to &
i.e., & + FIRST(E')
Everything in FOLLOW(E'0)
can follow T
193
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
T " F T'
Whatever can follow T
can also follow T'
194
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
T " F T'
Whatever can follow T
can also follow T'
195
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
T'0 " * F T'1
Since T'1 can go to &
i.e., & + FIRST(T')
Everything in FOLLOW(T'0)
can follow F
196
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
Look at rule
T'0 " * F T'1
Since T'1 can go to &
i.e., & + FIRST(T')
Everything in FOLLOW(T'0)
can follow F
197
E
E'
T
T'
F
"
"
"
"
"
T E'
+ T E' | &
F T'
* F T' | &
( E ) | id
198
199
200
201
202
S
S
S'
S'
E
203
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
1.
2.
3.
4.
5.
S
S
S'
S'
E
204
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
205
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
206
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
S
S'
E
Harry H. Porter, 2005
207
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
i
S " iEtSS'
S'
E
Harry H. Porter, 2005
208
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
i
S " iEtSS'
S'
E
Harry H. Porter, 2005
209
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S S"o
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
i
S " iEtSS'
S'
E
Harry H. Porter, 2005
210
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
o
S S"o
i
S " iEtSS'
S'
E
Harry H. Porter, 2005
211
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S S"o
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
i
S " iEtSS'
S'
E
Harry H. Porter, 2005
E"b
212
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
o
S S"o
i
S " iEtSS'
S'
E"b
E
Harry H. Porter, 2005
213
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S S"o
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
i
S " iEtSS'
S' " e S
S'
E
E"b
214
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
o
S S"o
i
S " iEtSS'
S' " e S
S'
E"b
E
Harry H. Porter, 2005
215
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S S"o
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
S' " e S
S'
E
Harry H. Porter, 2005
i
S " iEtSS'
$
S' " &
E"b
216
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
o
S S"o
i
S " iEtSS'
S' " e S
S'
$
S' " &
E"b
E
Harry H. Porter, 2005
217
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S S"o
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
S' " e S
S' " &
S'
E
Harry H. Porter, 2005
i
S " iEtSS'
$
S' " &
E"b
218
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
CONFLICT!
Two rules in one table entry.
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
o
S S"o
i
S " iEtSS'
S' " e S
S' " &
S'
$
S' " &
E"b
E
Harry H. Porter, 2005
219
S
S
S'
S'
E
" i E t S S'
"o
"eS
"&
"b
CONFLICT!
Two rules in one table entry.
The grammar is not LL(1)!
ibtibtoeo
FIRST(S) = { i, o }
FIRST(S') = { e, & }
FIRST(E) = { b }
o
S S"o
FOLLOW(S) = { e, $ }
FOLLOW(S') = { e, $ }
FOLLOW(E) = { t }
S' " e S
S' " &
S'
E
Harry H. Porter, 2005
i
S " iEtSS'
$
S' " &
E"b
220
221
222
endFor
223
endIf
endFor
224
225
226
227
LL(1) Grammars
LL(1) grammars
Are never ambiguous.
! Will never have left recursion.
Furthermore...
More Precisely...
If A"# and A"$ are two rules
If # !* a... and $ !* b...
then we require a - b
(i.e., FIRST(#) and FIRST($) must not intersect)
If # !* &
then $ !* & must not be possible.
(i.e., only one alternative can derive &.)
If # !* & and $ !* b...
then b must not be in FOLLOW(A)
Harry H. Porter, 2005
228
Error Recovery
We have an error whenever...
!Stacktop is a terminal, but stacktop - input symbol
!Stacktop is a nonterminal but TABLE[A,b] is empty
Options
1. Skip over input symbols, until we can resume parsing
Corresponds to ignoring tokens
2. Pop stack, until we can resume parsing
Corresponds to inserting missing material
3. Some combination of 1 and 2
4. Panic Mode - Use Synchronizing tokens
!Identify a set of synchronizing tokens.
!Skip over tokens until we are positioned on a synchronizing token.
!Pop stack until we can resume parsing.
229
THEN
S
ELSE
S
END
...
$
Harry H. Porter, 2005
...
<
) TH y
...
)
THEN
S
ELSE
S
END
...
$
...
IF (
<
5 TH y
...
231
232
233
SEMI
RPAREN
E4
E'
E5
LPAREN
...
...
234
id
SEMI
RPAREN
E4
E'
E5
LPAREN
...
...
E4:
Error-Handling Code
E5:
...
Harry H. Porter, 2005
...
235