Professional Documents
Culture Documents
Parsing
It is possible to build a
nonrecursive predictive
parser
This is done by maintaining
an explicit stack
1
Nonrecursive Predictive
Parsing
It is possible to build a
nonrecursive predictive
parser
This is done by maintaining
an explicit stack
2
Table-driven Parsers
The nonrecursive LL(1)
parser looks up the
production to apply by
looking up a parsing table
3
Table-driven Parsers
LL(1) table:
One dimension for current
non-terminal to expand
One dimension for next token
Table entry contains one
production
4
Table-driven Parsers
LL(1) table:
One dimension for current
non-terminal to expand
One dimension for next token
Table entry contains one
production
5
Table-driven Parsers
LL(1) table:
One dimension for current
non-terminal to expand
One dimension for next token
Table entry contains one
production
6
Consider the expression grammar
1 E → T E'
2 E' → + T E'
3 |
4 T → F T'
5 T' → * F T'
6 |
7 F → (E )
8 | id
7
Predictive Parsing Table
id + * ( ) $
E E →TE' E →TE'
14
LL(1) Parsing Algorithm
15
LL(1) Parsing Algorithm
The program considers X,
the symbol on top of the
stack, and a, the current
input symbol.
16
LL(1) Parsing Algorithm
These two symbols, X and a
determine the action of the
parser.
There are three possibilities.
17
LL(1) Parsing Algorithm
These two symbols, X and a
determine the action of the
parser.
There are three possibilities.
18
LL(1) Parsing Algorithm
1. X a $,
the parser halts and
annouces successful
completion.
19
LL(1) Parsing Algorithm
2. X a $
the parser pops X off the
stack and advances input
pointer to next input
symbol
20
LL(1) Parsing Algorithm
3. If X is a nonterminal, the
program consults entry
M[X,a] of parsing table M.
21
LL(1) Parsing Algorithm
If the entry is a production
M[X,a] = {X → UVW }
the parser replaces X on
top of the stack by WVU
(with U on top).
22
LL(1) Parsing Algorithm
As output, the parser just
prints the production used:
X → UVW
However, any other code
could be executed here.
23
LL(1) Parsing Algorithm
24
LL(1) Parsing Algorithm
Example:
Let’s parse the input string
id+idid
using the nonrecursive
LL(1) parser
25
id + id id $
E
$
stack Parsing
Table M
26
Predictive Parsing Table
id + * ( ) $
E E →TE' E →TE'
F F → id F →(E )
27
id + id id $
E
$
E →T E'
stack Parsing
Table M
28
id + id id $
T
E'
$
→ F T'
TParsing
stack
Table M
29
id + id id $
F
T'
E'
$
→ id
FParsing
stack
Table M
30
id + id id $
id
T'
E'
$
stack Parsing
Table M
31
+ id id $
T'
E'
$
→
T'Parsing
stack
Table M
32
+ id id $
E'
$
→ +T E'
E'Parsing
stack
Table M
33
+ id id $
+
T
E'
$
stack Parsing
Table M
34
Stack Input Ouput
$E id+idid$
$E' T id+idid$ E →TE'
$E' T' F id+idid$ T →FT'
$E'T' id id+idid$ F → id
$E' T' +idid$
$E' +idid$ T' →
$E' T + +idid$ E' → +TE'
35
Stack Input Ouput
$E' T idid$
$E' T' F idid$ T →FT'
$E' T' id idid$ F → id
$E' T' id$
$E' T' F id$ T → FT'
$E' T' F id$
$E'T' id id$ F → id
36
Stack Input Ouput
$E' T' $
$E' $ T' →
$ $ E' →
37
LL(1) Parsing Algorithm
Note that productions output
are tracing out a lefmost
derivation
The grammar symbols on
the stack make up left-
sentential forms
38
LL(1) Parsing Algorithm
Note that productions output
are tracing out a lefmost
derivation
The grammar symbols on
the stack make up left-
sentential forms
39
LL(1) Table Construction
Top-down parsing expands
a parse tree from the start
symbol to the leaves
Always expand the leftmost
non-terminal
40
LL(1) Table Construction
Top-down parsing expands
a parse tree from the start
symbol to the leaves
Always expand the leftmost
non-terminal
41
id+idid
E
T E'
F T' + T E'
id and so on ....
42
E
T E'
F T' + T E'
id
T E'
F T' + T E'
id
44
E
T E'
id + id id F T' E'
+ T
b
id
input
The string
prefix is b
matches
Next token is b
45
LL(1) Table Construction
Consider the state
S → A
with b the next token and we
are trying to match b
There are two possibilities
46
LL(1) Table Construction
Consider the state
S → A
with b the next token and we
are trying to match b
There are two possibilities
47
LL(1) Table Construction
1. b belongs to an expansion
of A
Any A → can be used if b
can start a string derived
from
48
LL(1) Table Construction
1. b belongs to an expansion
of A
Any A → can be used if b
can start a string derived
from
49
LL(1) Table Construction
50
LL(1) Table Construction
2. b does not belong to an
expansion of A
Expansion of A is empty, i.e.,
A → and b belongs an
expansion of , e.g., b
51
LL(1) Table Construction
2. b does not belong to an
expansion of A
Expansion of A is empty, i.e.,
A → and b belongs an
expansion of , e.g., b
52
LL(1) Table Construction
which means that b can
appear after A in a
derivation of the form
S → Ab
53
LL(1) Table Construction
We say that
b FOLLOW(A)
54
LL(1) Table Construction
Any A → can be used if
expands to
We say that FIRST(A) in
this case
55
Computing FIRST Sets
Definition
FIRST(X) =
{ b | X → ba }
{ | X → }
56