1 nonrecursive predictive parsing it is possible to build a nonrecursive predictive parser this is...

57
1 Nonrecursive Predictive Nonrecursive Predictive Parsing Parsing It is possible to build a nonrecursive predictive parser This is done by maintaining an explicit stack

Upload: primrose-mclaughlin

Post on 19-Jan-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

1

Nonrecursive Predictive Nonrecursive Predictive ParsingParsingNonrecursive Predictive Nonrecursive Predictive ParsingParsing It is possible to build a

nonrecursive predictive parser

This is done by maintaining an explicit stack

Page 2: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

2

Nonrecursive Predictive Nonrecursive Predictive ParsingParsingNonrecursive Predictive Nonrecursive Predictive ParsingParsing It is possible to build a

nonrecursive predictive parser

This is done by maintaining an explicit stack

Page 3: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

3

Table-driven ParsersTable-driven ParsersTable-driven ParsersTable-driven Parsers The nonrecursive LL(1)

parser looks up the production to apply by looking up a parsing table

Page 4: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

4

Table-driven ParsersTable-driven ParsersTable-driven ParsersTable-driven ParsersLL(1) table: One dimension for current

non-terminal to expand One dimension for next token Table entry contains one

production

Page 5: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

5

Table-driven ParsersTable-driven ParsersTable-driven ParsersTable-driven ParsersLL(1) table: One dimension for current

non-terminal to expand

One dimension for next token

Table entry contains one production

Page 6: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

6

Table-driven ParsersTable-driven ParsersTable-driven ParsersTable-driven ParsersLL(1) table: One dimension for current

non-terminal to expand One dimension for next token Table entry contains one

production

Page 7: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

7

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

Page 8: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

8

Predictive Parsing TablePredictive Parsing TablePredictive Parsing TablePredictive Parsing Tableid + * ( ) $

E E →TE' E →TE'

E' E' → +TE'

E' → E' →

T T →FT' T →FT'

T' T' → T →*FT' T' → T' →

F F → id F →(E )

Rows for current non-terminal to expandColumns for next token

Page 9: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

9

Predictive Parsing TablePredictive Parsing TablePredictive Parsing TablePredictive Parsing Tableid + * ( ) $

E E →TE' E →TE'

E' E' → +TE'

E' → E' →

T T →FT' T →FT'

T' T' → T →*FT' T' → T' →

F F → id F →(E )

Table entries are productionsBlank entries are errors

Page 10: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

10

Predictive ParsersPredictive ParsersPredictive ParsersPredictive Parsers The predictive parser uses

an explicit stack to keep track of pending non-terminals

It can thus be implemented without recursion.

Page 11: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

11

Predictive ParsersPredictive ParsersPredictive ParsersPredictive Parsers The predictive parser uses

an explicit stack to keep track of pending non-terminals

It can thus be implemented without recursion.

Page 12: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

12

Predictive ParsersPredictive ParsersPredictive ParsersPredictive Parsers

a + b $

Predictive parser

stackXYZ$

Parsing table M

input

output

Page 13: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

13

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm The input buffer contains

the string to be parsed; $ is the end-of-input marker

The stack contains a sequence of grammar symbols

Page 14: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

14

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

Initially, the stack contains the start symbol of the grammar on the top of $.

Page 15: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

15

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

The parser is controlled by a program that behaves as follows:

Page 16: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

16

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

The program considers X, the symbol on top of the stack, and a, the current input symbol.

Page 17: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

17

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

These two symbols, X and a determine the action of the parser.

There are three possibilities.

Page 18: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

18

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

These two symbols, X and a determine the action of the parser.

There are three possibilities.

Page 19: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

19

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

1. X a $, the parser halts and annouces successful completion.

Page 20: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

20

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

2. X a $the parser pops X off the stack and advances input pointer to next input symbol

Page 21: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

21

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

3. If X is a nonterminal, the program consults entry M[X,a] of parsing table M.

Page 22: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

22

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(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).

Page 23: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

23

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmAs output, the parser just prints the production used: X → UVW

However, any other code could be executed here.

Page 24: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

24

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

If M[X,a] =error, the parser calls an error recovery routine

Page 25: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

25

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm

Example:

Let’s parse the input string

id+ididusing the nonrecursive LL(1) parser

Page 26: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

26

id

E

+ id id

$

$

stack Parsing Table M

Page 27: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

27

Predictive Parsing TablePredictive Parsing TablePredictive Parsing TablePredictive Parsing Table

id + * ( ) $

E E →TE' E →TE'

E' E' → +TE'

E' → E' →

T T →FT' T →FT'

T' T' → T →*FT' T' → T' →

F F → id F →(E )

Page 28: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

Compiler Compiler ConstructionConstruction

Compiler Compiler ConstructionConstruction

Sohail Aslam

Lecture 17

Page 29: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

29

id

E

+ id id

$

$

stack Parsing Table M

E →T E'

Page 30: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

30

id + id id

$

$

stack Parsing Table M

T →

TE'

F T'

Page 31: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

31

T'

id + id id

$

$

stack Parsing Table M

E'

F

F id

Page 32: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

32

T'

id + id id

$

$

stack Parsing Table M

E'

id

Page 33: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

33

T'

+ id id

$

$

stack Parsing Table M

E'

T'

id

Page 34: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

34

+ id id

$

$

stack Parsing Table M→

E'

E' +

id

E'T

Page 35: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

35

+ id id

$

$

stack Parsing Table M

E'

+

id

T

Page 36: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

36

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'

Page 37: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

37

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

Page 38: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

38

Stack Input Ouput

$E' T' $ $E' $ T' →$ $ E' →

Page 39: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

39

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm Note that productions output

are tracing out a lefmost derivation

The grammar symbols on the stack make up left-sentential forms

Page 40: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

40

LL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing AlgorithmLL(1) Parsing Algorithm Note that productions output

are tracing out a lefmost derivation

The grammar symbols on the stack make up left-sentential forms

Page 41: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

41

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

Top-down parsing expands a parse tree from the start symbol to the leaves

Always expand the leftmost non-terminal

Page 42: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

42

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

Top-down parsing expands a parse tree from the start symbol to the leaves

Always expand the leftmost non-terminal

Page 43: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

43

id+idid

E

T E'

F

id

T'

E'T+

and so on ....

Page 44: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

44

E

T E'

F

id

T'

E'T+

The leaves at any point form a stringA

Page 45: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

45

E

T E'

F

id

T'

E'T+

only contains terminals

Page 46: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

46

E

T E'

F

id

T'

+ E'Tid + id id b

input string is bThe prefix matchesNext token is b

Page 47: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

47

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction Consider the state

S → Awith b the next token and we are trying to match b

There are two possibilities

Page 48: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

48

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction Consider the state

S → Awith b the next token and we are trying to match b

There are two possibilities

Page 49: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

49

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

1. b belongs to an expansion of A

Any A → can be used if b can start a string derived from

Page 50: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

50

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

1. b belongs to an expansion of A

Any A → can be used if b can start a string derived from

Page 51: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

51

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

In this case we say that b FIRST()

Page 52: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

52

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(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

Page 53: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

53

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(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

Page 54: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

54

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

which means that b can appear after A in a derivation of the form S → Ab

Page 55: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

55

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

We say that b FOLLOW(A)

Page 56: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

56

LL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table ConstructionLL(1) Table Construction

Any A → can be used if expands to

We say that FIRST(A) in this case

Page 57: 1 Nonrecursive Predictive Parsing  It is possible to build a nonrecursive predictive parser  This is done by maintaining an explicit stack

57

ComputingComputing FIRST FIRST Sets SetsComputingComputing FIRST FIRST Sets Sets

DefinitionFIRST(X) =

{ b | X → ba }

{ | X → }