Compilers Nikos Papaspyrou Kostis Sagonas nickie@softlab.ntua.gr - - PowerPoint PPT Presentation

compilers
SMART_READER_LITE
LIVE PREVIEW

Compilers Nikos Papaspyrou Kostis Sagonas nickie@softlab.ntua.gr - - PowerPoint PPT Presentation

Compilers Nikos Papaspyrou Kostis Sagonas nickie@softlab.ntua.gr kostis@cs.ntua.gr National Technical University of Athens School of Electrical and Computer Engineering Software Engineering Laboratory Polytechnioupoli, 15780 Zografou,


slide-1
SLIDE 1

Compilers

Nikos Papaspyrou Kostis Sagonas

nickie@softlab.ntua.gr kostis@cs.ntua.gr

National Technical University of Athens School of Electrical and Computer Engineering Software Engineering Laboratory Polytechnioupoli, 15780 Zografou, Athens, Greece.

March 2017

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 1 / 216

slide-2
SLIDE 2

Chapter 4: Parsing

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 55 / 216

slide-3
SLIDE 3

Parsing

▶ Parse tree ▶ It can be built in two ways:

▶ Top-down

i.e., starting from the root and moving towards the leaves

▶ Bottom-up

i.e., starting from the leaves and moving towards the root

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 56 / 216

slide-4
SLIDE 4

Top-down and bottom-up

S a A B c a b A c a B S ε

απόπάνωπροςτακάτω (topdown)

  • Nikos Papaspyrou, Kostis Sagonas

Compilers March 2017 57 / 216

slide-5
SLIDE 5

Top-down and bottom-up

S a A B c a b A c a B S ε

απόπάνωπροςτακάτω (topdown)

  • S

a A B c a b A c a B S ε

απόκάτωπροςταπάνω (bottomup)

  • Nikos Papaspyrou, Kostis Sagonas

Compilers March 2017 57 / 216

slide-6
SLIDE 6

Auxiliaries (i)

▶ FIRST sets

▶ Let 𝛽 ∈ (𝑈 ∪ 𝑂)∗ be a string ▶ The set FIRST(𝛽) ⊆ 𝑈 ∪ { 𝜗 } contains the terminal

symbols from which all strings that are produced by 𝛽 are bound to start

▶ If 𝛽 ⇒∗ a𝛾

then a ∈ FIRST(𝛽)

▶ If 𝛽 ⇒∗ 𝜗

then 𝜗 ∈ FIRST(𝛽)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 58 / 216

slide-7
SLIDE 7

Auxiliaries (i)

▶ FIRST sets

▶ Let 𝛽 ∈ (𝑈 ∪ 𝑂)∗ be a string ▶ The set FIRST(𝛽) ⊆ 𝑈 ∪ { 𝜗 } contains the terminal

symbols from which all strings that are produced by 𝛽 are bound to start

▶ If 𝛽 ⇒∗ a𝛾

then a ∈ FIRST(𝛽)

▶ If 𝛽 ⇒∗ 𝜗

then 𝜗 ∈ FIRST(𝛽)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 58 / 216

slide-8
SLIDE 8

Auxiliaries (ii)

▶ FOLLOW sets

▶ Let 𝐵 be a non-terminal symbol ▶ The set FOLLOW(𝐵) ⊆ 𝑈 ∪ { EOF } contains all terminal

symbol that may follow 𝐵 during a production from the start symbol 𝑇

▶ If 𝐵 can be the last symbol in a production, then

EOF ∈ FOLLOW(𝐵)

▶ If 𝑇 ⇒∗ 𝛽𝐵a𝛾

then a ∈ FOLLOW(𝐵)

▶ If 𝑇 ⇒∗ 𝛽𝐵

then EOF ∈ FOLLOW(𝐵)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 59 / 216

slide-9
SLIDE 9

Auxiliaries (ii)

▶ FOLLOW sets

▶ Let 𝐵 be a non-terminal symbol ▶ The set FOLLOW(𝐵) ⊆ 𝑈 ∪ { EOF } contains all terminal

symbol that may follow 𝐵 during a production from the start symbol 𝑇

▶ If 𝐵 can be the last symbol in a production, then

EOF ∈ FOLLOW(𝐵)

▶ If 𝑇 ⇒∗ 𝛽𝐵a𝛾

then a ∈ FOLLOW(𝐵)

▶ If 𝑇 ⇒∗ 𝛽𝐵

then EOF ∈ FOLLOW(𝐵)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 59 / 216

slide-10
SLIDE 10

Calculating FIRST (i)

▶ FIRST(𝜗) = { 𝜗 } ▶ FIRST(a𝛾) = { a } ▶ if

𝜗 ∉ FIRST(𝐵) then FIRST(𝐵𝛾) = FIRST(𝐵)

▶ if

𝜗 ∈ FIRST(𝐵) then FIRST(𝐵𝛾) = (FIRST(𝐵) − { 𝜗 }) ∪ FIRST(𝛾)

▶ for each rule 𝐵 → 𝛽, it must be FIRST(𝛽) ⊆ FIRST(𝐵)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 60 / 216

slide-11
SLIDE 11

Calculating FIRST (ii)

▶ Example

FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 61 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-12
SLIDE 12

Calculating FIRST (ii)

▶ Example

FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 61 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-13
SLIDE 13

Calculating FIRST (ii)

▶ Example

FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 61 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-14
SLIDE 14

Calculating FIRST (ii)

▶ Example

FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 61 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-15
SLIDE 15

Calculating FIRST (ii)

▶ Example

FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 61 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-16
SLIDE 16

Calculating FIRST (ii)

▶ Example

FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 61 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-17
SLIDE 17

Calculating FOLLOW (i)

▶ EOF ∈ FOLLOW(𝑇) ▶ for each rule 𝐵 → 𝛽𝐶𝛾

▶ (FIRST(𝛾) − { 𝜗 }) ⊆ FOLLOW(𝐶) ▶ if

𝜗 ∈ FIRST(𝛾) then FOLLOW(𝐵) ⊆ FOLLOW(𝐶)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 62 / 216

slide-18
SLIDE 18

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = {

EOF, ) }

FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-19
SLIDE 19

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF , ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-20
SLIDE 20

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-21
SLIDE 21

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-22
SLIDE 22

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { + , EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-23
SLIDE 23

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-24
SLIDE 24

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { * , +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-25
SLIDE 25

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = {

EOF, ) }

FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-26
SLIDE 26

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = { EOF, ) } FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-27
SLIDE 27

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = { EOF, ) } FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-28
SLIDE 28

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = { EOF, ) } FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-29
SLIDE 29

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = { EOF, ) } FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-30
SLIDE 30

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = { EOF, ) } FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-31
SLIDE 31

Calculating FOLLOW (ii)

▶ Example

FOLLOW(E) = { EOF, ) } FOLLOW(T) = { +, EOF, ) } FOLLOW(F) = { *, +, EOF, ) } FOLLOW(E’) = { EOF, ) } FOLLOW(T’) = { +, EOF, ) } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 }

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 63 / 216

E → T E’ E’ → 𝜗 E’ → + T E’ T → F T’ T’ → 𝜗 T’ → * F T’ F → ( E ) F → id

slide-32
SLIDE 32

Top-down parsing (i)

▶ Parsing starts from the root ▶ Every time, we seek:

▶ the non-terminal symbol to replace

⇒ usually we pick the left-most

▶ the production rule to apply

⇒ based on the next 𝑙 tokens of the input string: LL(𝑙)

▶ We repeat until the non-terminal symbols have been

exhausted

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 64 / 216

slide-33
SLIDE 33

LL(1) grammars

▶ Necessary conditions:

▶ No left recursion (direct or indirect) ▶ No common prefix in alternative rules

▶ Sometimes it is possible to transform a grammar into an

equivalent LL(1)

⇒ left recursion elimination ⇒ left factorization

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 65 / 216

slide-34
SLIDE 34

Transformation to LL(1)

▶ Substitution

A → 𝛽1 ∣ … ∣ 𝛽𝑜 B → 𝛾1A𝛾2 ⇒ A → 𝛽1 ∣ … ∣ 𝛽𝑜 B → 𝛾1𝛽1𝛾2 ∣ … ∣ 𝛾1𝛽𝑜𝛾2

▶ Left factorization

A → 𝛽𝛾1 ∣ … ∣ 𝛽𝛾𝑜 ⇒ A → 𝛽B B → 𝛾1 ∣ … ∣ 𝛾𝑜

▶ Direct left recursion elimination

A → A𝛽1 ∣ … ∣ A𝛽𝑜 ∣ 𝛾1 ∣ … ∣ 𝛾𝑛 ⇒ A → 𝛾1B ∣ … ∣ 𝛾𝑛B B → 𝛽1B ∣ … ∣ 𝛽𝑜B ∣ 𝜗

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 66 / 216

slide-35
SLIDE 35

Recursive descent parsing

A → 𝛽1 ∣ … ∣ 𝛽𝑜 is transformed into a procedure whose body is of the form:

if token ∈ FIRST(𝛽1) then code to recognize 𝛽1 … else if token ∈ FIRST(𝛽𝑜) then code to recognize 𝛽𝑜 else if 𝜗 ∉ FIRST(𝛽1) ∪ … ∪ FIRST(𝛽𝑜) then syntax error else if token ∉ FOLLOW(𝐵) then syntax error end if

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 67 / 216

slide-36
SLIDE 36

LL(1) parsers (i)

▶ They use a stack where they put grammar symbols —

initially just 𝑇

▶ Every time, they examine the top of the stack:

▶ If it is a terminal symbol and it’s the same as the next input

symbol, then both are removed

▶ If it is a non-terminal symbol, then they apply a rule

depending on the next symbol of the input

▶ Success: both the stack and the input string are empty

άδειες

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 68 / 216

slide-37
SLIDE 37

LL(1) parsers (ii)

The algorithm for generating table 𝑁 defines the class of LL(1) languages

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 69 / 216

ΠίνακαςM συντακτικήςανάλυσης LL(1) ΣυντακτικόςΑναλυτήςLL(1) συβολοσειράεισόδου στοίβα

  • επόενο

σύβολο κορυφή

slide-38
SLIDE 38

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-39
SLIDE 39

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-40
SLIDE 40

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-41
SLIDE 41

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-42
SLIDE 42

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-43
SLIDE 43

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-44
SLIDE 44

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-45
SLIDE 45

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-46
SLIDE 46

Generating LL(1) parsers

E → T E’ E’ → + T E’ ∣ 𝜗 T → F T’ T’ → * F T’ ∣ 𝜗 F → ( E ) ∣ id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E’) = { +, 𝜗 } FIRST(T’) = { *, 𝜗 } FOLLOW(E) = FOLLOW(E’) = { ), EOF } FOLLOW(T) = FOLLOW(T’) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( )

EOF

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)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 70 / 216

slide-47
SLIDE 47

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-48
SLIDE 48

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-49
SLIDE 49

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-50
SLIDE 50

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-51
SLIDE 51

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-52
SLIDE 52

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-53
SLIDE 53

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-54
SLIDE 54

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-55
SLIDE 55

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-56
SLIDE 56

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-57
SLIDE 57

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-58
SLIDE 58

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-59
SLIDE 59

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-60
SLIDE 60

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-61
SLIDE 61

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-62
SLIDE 62

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-63
SLIDE 63

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-64
SLIDE 64

Operation of a LL(1) parser

E id + id * id EOF E → T E’ 1 E’ T id + id * id EOF T → F T’ 2 E’ T’ F id + id * id EOF F → id 3 E’ T’ id id + id * id EOF 4 E’ T’ + id * id EOF T’ → 𝜗 5 E’ + id * id EOF E’ → + T E’ 6 E’ T + + id * id EOF 7 E’ T id * id EOF T → F T’ 8 E’ T’ F id * id EOF F → id 9 E’ T’ id id * id EOF 10 E’ T’ * id EOF T’ → * F T’ 11 E’ T’ F * * id EOF 12 E’ T’ F id EOF F → id 13 E’ T’ id id EOF 14 E’ T’

EOF

T’ → 𝜗 15 E’

EOF

E’ → 𝜗 16 𝜗

EOF

success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 71 / 216

slide-65
SLIDE 65

Bottom-up parsing (i)

▶ Parsing starts from the leaves ▶ Every time, we seek:

▶ the left-most node of the tree ▶ that hasn’t yet been built ▶ but all its children have been built

▶ We repeat until the root is built ▶ Reducing: the selection of the nodes that will become the

children of a new node

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 72 / 216

slide-66
SLIDE 66

Bottom-up parsing (ii)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 73 / 216

  • S → r B

B → D ∣ B , D D → a ∣ b

slide-67
SLIDE 67

Bottom-up parsing (iii)

▶ Shift-reduce parsers

▶ They use an initially empty stack where they put symbols

  • f the grammar

▶ Shift: move the next input symbol to the top of the stack ▶ Reduce: remove from the top of the stack the RHS of some

rule and add the corresponding LHS

▶ Success: the stack contains only 𝑇 and all input symbols

have been exhausted

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 74 / 216

slide-68
SLIDE 68

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-69
SLIDE 69

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-70
SLIDE 70

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-71
SLIDE 71

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-72
SLIDE 72

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-73
SLIDE 73

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-74
SLIDE 74

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-75
SLIDE 75

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-76
SLIDE 76

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-77
SLIDE 77

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-78
SLIDE 78

Bottom-up parsing (iv)

step stack input action 𝜗 r a , b shift 1 r a , b shift 2 r a , b reduce with D → a 3 r D , b reduce with B → D 4 r B , b shift (not reduce with S → r B) 5 r B , b shift 6 r B , b 𝜗 reduce with D → b 7 r B , D 𝜗 reduce with B → B , D (not reduce with B → D) 8 r B 𝜗 reduce with S → r B 9 S 𝜗 success

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 75 / 216

S → r B B → D ∣ B , D D → a ∣ b

slide-79
SLIDE 79

Bottom-up parsing (v)

▶ LR(𝑙) ▶ LR(0) ▶ SLR(1) ▶ LALR(1) ▶ LR(1)

Nikos Papaspyrou, Kostis Sagonas Compilers March 2017 76 / 216

Πίνακεςελέγχου συντακτικήςανάλυσης LR(1) ΣυντακτικόςΑναλυτήςLR(1) συβολοσειράεισόδου στοίβα

  • επόενο

σύβολο κορυφή

  • ACTION

NEXT