Beruflich Dokumente
Kultur Dokumente
Top-Down Parsing
Start with the root of the parse tree
Root of the tree: node labeled with the start symbol
Algorithm:
Repeat until the fringe of the parse tree matches
input string
At a node A, select a production for A
Add a child node for each symbol on rhs
Done when:
Leaves of parse tree match input string
All productions exhausted in backtracking
(failure)
(success)
Top-Down Parsing
Consider the grammar:
ScAd
A ab | a
The input string is cad
Top-Down Parsing
Build parse tree:
step 1. From start symbol.
S
c
Top-Down Parsing
Step 2. We expand A using the first
alternative A ab to obtain the
following tree:
S
c
A
a
d
b
5
Top-Down Parsing
Now, we have a match for the second
input symbol a, so we advance the input
pointer to d, the third input symbol, and
compare d against the next leaf b.
Backtracking
Since b does not match d, we report failure and go
back to A to see whether there is another alternative
for A that has not been tried - that might produce a
match!
In going back to A, we must reset the input pointer to
a.
6
Top-Down Parsing
Step 3.
S
c
a
7
Example
Expression grammar
(with precedence)
# Production rule
1 expr expr + term
2
| expr - term
3
| term
4 term term * factor
5
| term / factor
6
| factor
7 factor number
8
| identifier
Input string x 2 * y
8
Example
Rule Sentential form
2
-3
6
8
-
expr + term
expr + term
term
factor + term
<id> + term
<id,x> + term
Current position in
the input stream
Input string
x - 2 *
x - 2 *
x 2 *
x 2 *
x 2 *
x 2 *
y
y
y
y
y
y
expr
expr +
term
fact
Problem:
Cant match next terminal
We guessed wrong at step 2
9
term
Backtracking
Rule Sentential form
2
-3
6
8
?
expr + term
expr + term
term
factor + term
<id> + term
<id,x> + term
Input string
x - 2 *
x - 2 *
x 2 *
x 2 *
x 2 *
x 2 *
y
y
y
y
y
y
Rollback productions
Choose a different production for expr
Continue
10
Retrying
Rule Sentential form
2
-3
6
8
3
7
expr - term
expr - term
term
factor - term
<id> - term
<id,x> - term
<id,x> - factor
<id,x> - <num>
Input string
x - 2 *
x - 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 *
expr
y
y
y
y
y
y
y
y
expr -
term
term
fact
fact
Problem:
More input to read
Another cause of backtracking
11
Successful Parse
Rule Sentential form
2
-3
6
8
4
6
7
8
expr - term
expr - term
term
factor - term
<id> - term
<id,x> - term
<id,x> - term * fact
<id,x> - fact * fact
<id,x> - <num> * fact
<id,x> - <num,2> * fact
<id,x> - <num,2> * <id>
Input string
x - 2 *
x - 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 *
x 2 * y
expr
y
y
y
y
y
y
y
y
y
y
expr -
term
term
fact
fact
term
fact
Common Prefix
In Fig. 5.12, the common prefix:
if Expr then StmtList (R1,R2)
makes looking ahead to distinguish R1
from R2 hard.
Just use Fig. 5.13 to factor it and
var(R5,6)
The resulting grammar is in Fig. 5.14.
14
Left Recursion
A production is left recursive
if its LHS symbol is the first symbol
of its RHS.
In fig. 5.14, the production
StmtList StmtList ; Stmt
StmtList is left-recursion.
17
18
20
2
3
4
5
21
23
Substituting S productions in A
A-->Ac|Sd| ==> A-->Ac|Aad|bd|
Then Eliminate immediate left recursion of A
S-->Aa|b
A-->bdA'|A'
A'-->cA'|adA'|
26
27
29
ID + (ID + ID)
30
input
expression
term
ID
rest_expression
+
expression
term
ID + ( ID+ ID )
rest_expression
parenthesized_expression
(
expression
)
32
E TE
E +TE |-TE|
T FT
T *FT | /FT|
F id|digit|(E)
The input: id + id * id
35
37
Procedure
Input
Grammar without left E()
i+i*i-i/i$
recursion
T()
i+i*i-i/i$
E->TE'
F()
i+i*i-i/i$
E'->+TE'|-TE'|e
T'()
+i*i-i/i$
T->FT'
E'()
+i*i-i/i$
T'->*FT'|/FT'|e
T()
i*i-i/i$
F->(E)|i
F()
i*i-i/i$
T'()
*i-i/i$
Enter Expression
F()
i-i/i$
end with $: i+i*iT'()
-i/i$
i/i$
E'()
-i/i$
T()
i/i$
F()
i/i$
T'()
/i$
F()
i$
T'()
$
E'()
$
i*i+ii-/i$
i*i+ii-/i$
i*i+ii-/i$
*i+ii-/i$
i+ii-/i$
+ii-/i$
+ii-/i$
ii-/i$
ii-/i$
i-/i$
i-/i$
i*(i+i$
i*(i+i$
i*(i+i$
*(i+i$
(i+i$
i+i$
i+i$
i+i$
+i$
+i$
i$
i$
$
$ERROR 1: Paranthesis
Mismatch
!!!!Not Accepted!!!!
T'()
$
E'()
$
!!!!Not Accepted!!!!
Predictive Parser
We apply rule X ::= s when
a is the first symbol that can be generated by
string s, OR
s reduces to the empty string (is nullable) and
a is the first symbol in any string that can
follow X
inductive case:
if (X := ABC...) and A, B, C, ... are all Nullable
then X is Nullable
base case:
Place $ in FOLLOW(S), where S is the start symbol, and $ is the
input
right endmarker.
inductive case:
If there is a production A ::=B, then everything in FIRST()
except is in FOLLOW(B).
If there is a production A ::= B , or a production A ::=B
,where FIRST() contains , then everything in FOLLOW (A) is
in FOLLOW (B) .
Y ::= c
Y ::=
nullable
Z
Y
X ::= a
X ::= b Y e
first
follow
Z ::= X Y Z
Z ::= d
nullable
Z
no
yes
base case
X ::= a
X ::= b Y e
first
follow
Y ::= c
Y ::=
nullable
Z
no
yes
X ::= a
X ::= b Y e
first
follow
Y ::= c
Y ::=
X ::= a
X ::= b Y e
nullable
first
no
yes
c,
base case
follow
Y ::= c
Y ::=
X ::= a
X ::= b Y e
nullable
first
no
d,a,b
yes
c,
follow
Y ::= c
Y ::=
X ::= a
X ::= b Y e
nullable
first
no
d,a,b
yes
c,
follow
Y ::= c
Y ::=
X ::= a
X ::= b Y e
nullable
first
follow
no
d,a,b
{}
yes
c,
{}
base case
Y ::= c
Y ::=
X ::= a
X ::= b Y e
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b
}
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
a
Z
Y
X
X ::= a
X ::= b Y e
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
Z
Y
X
X ::= a
X ::= b Y e
Z ::= XYZ
Z ::= XYZ
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
Z
Y
X
X ::= a
X ::= b Y e
Z ::= XYZ
Z ::= XYZ
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
d
Z ::= d
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
Z
Y
X ::= a
X ::= b Y e
Z ::= XYZ
Z ::= XYZ
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
d
Z ::= d
Y ::= c
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
X ::= a
X ::= b Y e
Z ::= XYZ
Z ::= XYZ
Y ::=
Y ::=
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
Z ::= d
Y ::= c
Y ::=
Y ::=
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
X ::= a
X ::= b Y e
Z ::= XYZ
Z ::= XYZ
Y ::=
Y ::=
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
Z ::= d
Y ::= c
Y ::=
Y ::=
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
X ::= a
X ::= b Y e
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
Z ::= XYZ
Z ::= XYZ
Y ::=
Y ::=
Z ::= d
Y ::= c
Y ::=
Y ::=
Grammar:
Computed Sets:
Z ::= X Y Z Y ::= c
Z ::= d
Y ::=
X ::= a
X ::= b Y e
nullable
first
follow
no
d,a,b
{ $}
yes
c,
{e,d,a,b}
no
a,b
{c,d,a,b}
Z ::= XYZ
Z ::= XYZ
Y ::=
Y ::=
Z ::= d
Y ::= c
Y ::=
Y ::=
LL(1) Grammars
Predictive parsers, that is, recursive-descent
parsers needing no backtracking, can be
constructed for a class of grammars called
LL(1).
The first "L" in LL(1) stands for scanning the
input from left to right, the second "L" for
producing a leftmost derivation, and the "1"
for using one input symbol of lookahead at
each step to make parsing action decisions.
A Grammar whose parsing table has multiply
defined entries is not a LL(1) grammar
LL(1) Grammars
LL(1) Grammars
To tranform a grammar G to LL(1)
Eliminate all left recursion
Left factoring whenever is possible
Unfortunately, there are some
grammars for which no amount of
alteration will yield an LL(1)
grammar.
Table-driven predictive
parsing.
INPUT: A string w and a parsing table M
for grammar G.
OUTPUT: If w is in L(G), a leftmost
derivation of w; otherwise, an error
indication.
METHOD: Initially, the parser is in a
configuration with w$ in the input
buffer and the start symbol S of G on
top of the stack, above $.
Model of a table-driven
predictive parser
Match
b
b
be
be
Stack
Z$
X Y Z$
Input
becd$
becd$
Action
bYeYZ$
becd$
X ::= b Y
e
YeYZ$
eYZ$
YZ$
cZ$
ecd$
ecd$
cd$
cd$
Y ::=
Z ::= X Y
Z
Y ::= c
Input String: ac
Match
a
a
ac
ac
Stack
Z$
X Y Z$
Input
ac$
ac$
Action
aYZ$
YZ$
cZ$
Z$
Z$
Error
ac$
c$
c$
$
$
X ::= a
Z ::= X Y
Z
Y ::= c
E ::= |TE
E ::=
T ::= FT
Nullable
E
E
T
T
T ::= &FT
T ::=
first
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
follow
E ::= |TE
E ::=
T ::= FT
Nullable
E
No
Yes
No
Yes
T ::= &FT
T ::=
first
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
follow
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
Nullable
first
No
{!,1,0,(}
Yes
No
Yes
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
follow
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
Nullable
first
No
{!,1,0,(}
Yes
{|, }
No
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
follow
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
Nullable
first
No
{!,1,0,(}
Yes
{|, }
No
{!,1,0,(}
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
follow
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
Nullable
first
No
{!,1,0,(}
Yes
{|, }
No
{!,1,0,(}
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
follow
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{}
Yes
{|, }
{}
No
{!,1,0,(}
{}
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{}
No
{!,1,0,(}
{}
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{}
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
E ::= |TE
E ::=
T ::= FT
T ::= &FT
T ::=
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
E
E
T
T
F
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
&
F
F
F
F
::= !F
::= 1
::= 0
::=(E)
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E
T
T
F
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
&
!
E ::=
T
E
F
F
F
F
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
::= !F
::= 1
::= 0
::=(E)
(
E ::= TE
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
|
E
E E ::= |
TE
T
T
F
&
!
E ::=
T
E
F
F
F
F
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
::= !F
::= 1
::= 0
::=(E)
(
E ::= TE
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
|
E
E E ::= |
TE
T
T
F
&
!
E ::=
T
E
F
F
F
F
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
::= !F
::= 1
::= 0
::=(E)
E ::= TE
E ::=
E ::=
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
|
E
&
!
E ::=
T
E
F
F
F
F
T
F
E ::= TE
E E ::= |
TE
T
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
::= !F
::= 1
::= 0
::=(E)
E ::=
T ::= FT
T ::= FT
E ::=
T ::= FT
T ::= FT
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
&
!
E ::=
T
E
F
F
F
F
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
E ::=
E ::= TE
E E ::= |
TE
Nullable
::= !F
::= 1
::= 0
::=(E)
T ::= FT
T ::= &FT
T ::= FT
E ::=
T ::= FT
T ::= FT
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
&
!
E ::=
T
E
F
F
F
F
E ::= TE
E E ::= |
TE
T
Nullable
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
::= !F
::= 1
::= 0
::=(E)
E ::=
T ::= FT
T ::= FT
E ::=
T ::= FT
T ::=
T ::= FT
T ::=
E ::= TE
T ::= FT
E ::= |TE
E ::=
T ::= &FT
T ::=
&
!
E ::=
T
E
F
F
F
F
first
follow
No
{!,1,0,(}
{$,)}
Yes
{|, }
{$,)}
No
{!,1,0,(}
{|,$,)}
Yes
{&, }
{|,$,)}
No
E ::= TE
E ::= TE
E ::=
T ::= FT
T ::= FT
E ::= TE
E E ::= |
TE
T
Nullable
::= !F
::= 1
::= 0
::=(E)
E ::=
T ::= FT
T ::= FT
T ::=
F ::= !F
F ::=(E)
T ::=
F ::= 1
F ::= 0
Output
E Te
T FT'
F1
T'
E' |TE'
T FT'
F (E)
E TE'
T FT'
F1
Stack
Output
$E'T')E'T'
$E'T')E'T'F&
&FT'
$E'T')E'T'F
$E'T')E'T'0
0
$E'T')E'T'
$E'T')E'
T'
$E'T')
E'
$E'T'
$E'
T'
Input
&0)$
&0)$
T'
0)$
0)$
)$
)$
)$
$
$
!0&11$
$E'T')E'T'F! !0&11$
$E'T')E'T'F
0&11$
T FT'
F !F ERROR 2:Syntax Error
!!!!Not Accepted!!!!
F0
T'
F1
E ::= +TE
E ::= -TE
E ::=
T ::= FT
nullable
E
E
T
T
T ::= *FT
T ::= /FT
T ::=
first
F ::= id
F ::= digit
F ::=(E)
follow
E ::= +TE
E ::= -TE
E ::=
T ::= FT
nullable
E
No
Yes
No
Yes
T ::= *FT
T ::= /FT
T ::=
first
F ::= id
F ::= digit
F ::=(E)
follow
E ::= +TE
E ::= -TE
E ::=
T ::= FT
T ::= *FT
T ::= /FT
T ::=
nullable
first
No
id,digit,(
Yes
+,-,
No
id,digit,(
Yes
*,/,
F ::= id
F ::= digit
F ::=(E)
follow
E ::= +TE
E ::= -TE
E ::=
T ::= FT
T ::= *FT
T ::= /FT
T ::=
F ::= id
F ::= digit
F ::=(E)
nullable
first
follow
No
id,digit,(
{}
Yes
+,-,
{}
No
id,digit,(
{}
E ::= +TE
E ::= -TE
E ::=
T ::= FT
T ::= *FT
T ::= /FT
T ::=
F ::= id
F ::= digit
F ::=(E)
nullable
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{}
No
id,digit,(
{}
E ::= +TE
E ::= -TE
E ::=
T ::= FT
T ::= *FT
T ::= /FT
T ::=
F ::= id
F ::= digit
F ::=(E)
nullable
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{}
No
id,digit,(
{+,-}
E ::= +TE
E ::= -TE
E ::=
T ::= FT
T ::= *FT
T ::= /FT
T ::=
F ::= id
F ::= digit
F ::=(E)
nullable
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
E
E
T
T
F
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
nullable
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E
T
T
F
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
(
E ::=
T
E
nullable
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E
T
T
F
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
nullable
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E ::= +TE
E ::= -TE
E ::=
T
E
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
T
F
T ::= FT
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E ::= +TE
E ::= -TE
E ::=
T
E
E
T T ::= FT
nullable
T ::= FT
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
T
F
T ::= FT
first
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E ::= +TE
E ::= -TE
T ::= *FT
T ::= /FT
E ::=
T
E
E
T T ::= FT
nullable
T ::= FT
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
T ::= FT
F ::= id
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E ::= +TE
E ::= -TE
T ::= *FT
T ::= /FT
T ::= FT
T
F ::=
d
i
g
it
first
E ::=
T
E
E
T T ::= FT
nullable
F ::=(E)
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
T ::= FT
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E::=
E ::= +TE
E ::= -TE
F ::= id
E::=
T ::= *FT
F ::=
d
i
g
it
T ::= FT
first
E ::=
T
E
E
T T ::= FT
nullable
F ::=(E)
T ::= /FT
E ::= TE
T ::= FT
F ::= id
E ::= +TE T ::= *FT F ::= digit
E ::= -TE T ::= /FT F ::=(E)
E ::=
T ::=
id
digit
E ::
=
T
E
E ::=
T
E
T ::= FT
F ::= id
follow
No
id,digit,(
{ ),$}
Yes
+,-,
{ ),$}
No
id,digit,(
{+,-,),$}
Yes
*,/,
{+,-,),$}
No
id,digit,(
{*,/,+,-,),$}
E::=
E ::= +TE
E ::= -TE
T::=
T::=
T::=
E::=
T ::= FT
T
F ::=
d
i
g
it
first
E ::=
T
E
E
T T ::= FT
nullable
F ::=(E)
T ::= *FT
T ::= /FT
T::=