Fabian Berlin Syntaktische Analyse – Bottom-up Im Rahmen des Seminars Übersetzung von...

Preview:

Citation preview

Fabian Berlin

Syntaktische Analyse – Bottom-up

Im Rahmen des Seminars „Übersetzung von künstlichen Sprachen“

2

Gliederung

1. Grundlagen der Bottom-Up-Syntaxanalyse

2. Operator-Precedence-Syntaxanalyse

3. LR-Syntaxanalyse 3.1 LR-Syntaxanalysealgorithmus

3.2 LR(0)

3.3 SLR(1)

3.4 LR(1)

3.5 LALR(1)

4. Zusammenfassung

3

Einführung in die Bottom-Up-Syntaxanalyse

Grammatik G1:

Regel 1: S → aABe

Regel 2: A → Abc | b

Regel 3: B → d

a b b c d e

S

a A B e

a A d e

a A b c d e

Regel 2: A → b

Regel 2: A → Abc

Regel 3: B → d

Regel 1: S → aABe

Ziel:

Anwendung von Reduktionsschritten, um von der Eingabe auf das Startsymbol S zu reduzieren

4

Einführung in die Bottom-Up-Syntaxanalyse

S

A

B

A

a b b c d e

Anwendung einer umgekehrten Rechtsableitung

Problem: Bestimmung von Handles (rechte Seiten von Regeln, die reduziert werden können, um vorhergehenden Schritt der Rechtsableitung zu erhalten)

Idee: Nutzung eines Stacks

A → b

A → Abc

B→ d

S→ aABe

5

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

6

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$

3

4

5

6

7

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

Shift: Inputsymbol auf den Stack schieben (bis Handle erscheint)

7

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$

4

5

6

7

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

Reduce: reduzieren des Handle

8

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$

5

6

7

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

9

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$

6

7

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

10

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$

7

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

11

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$

8

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

12

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$

9

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

13

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$

10

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

14

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$

11

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

15

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$ Shift id

11 $ E + T * id $

12

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

16

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$ Shift id

11 $ E + T * id $ Reduce 9

12 $ E + T * F $

13

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

17

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$ Shift id

11 $ E + T * id $ Reduce 9

12 $ E + T * F $ Reduce 5

13 $ E + T $

14

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

18

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$ Shift id

11 $ E + T * id $ Reduce 9

12 $ E + T * F $ Reduce 5

13 $ E + T $ Reduce 2

14 $ E $

15

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

19

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$ Shift id

11 $ E + T * id $ Reduce 9

12 $ E + T * F $ Reduce 5

13 $ E + T $ Reduce 2

14 $ E $ Reduce 1

15 $ S $

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

20

Syntaxanalyse mit einem StackNr. Stack: Input: Aktion:

1 $ id + num * id$ Shift id

2 $ id + num * id$ Reduce 9

3 $ F + num * id$ Reduce 7

4 $ T + num * id$ Reduce 4

5 $ E + num * id$ Shift +

6 $ E + num * id$ Shift num

7 $ E + num * id$ Reduce 8

8 $ E + F * id$ Reduce 7

9 $ E + T * id$ Shift *

10 $ E + T * id$ Shift id

11 $ E + T * id $ Reduce 9

12 $ E + T * F $ Reduce 5

13 $ E + T $ Reduce 2

14 $ E $ Reduce 1

15 $ S $ Accept

Grammatik G2:

1 S E

2 E E + T

3 E E –T

4 E T

5 T T * F

6 T T / F

7 T F

8 F num

9 F id

Accept: Eingabe entsprach der Grammatik erfolgreiches Ende

21

Operator-Precedence-Syntaxanalyse

Definition von Relationen zwischen dem obersten Stackelement und dem ersten Eingabesymbol (begrenzt auf Terminalsymbole)

Vorgehen:

< oder =: Shift

>: Reduce

Handles werden erkannt: <: linke Markierung des Handle

>: rechte Markierung des Handle

Relation: Semantik:

a <• b a hat niedrigere Priorität als b

a •> b a hat höhere Priorität als b

a = b a und b haben gleiche Priorität

$ <• id •> + <• id •> * <• id•> $

Erstes Handle

22

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2

3

4

5

6

7

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

23

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3

4

5

6

7

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

24

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4

5

6

7

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

25

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5

6

7

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

26

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6

7

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

27

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6 $ E<•+E <• *id$ Shift: <•*

7

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

28

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6 $ E<•+E <• *id$ Shift: <•*

7 $ E<•+<•* <• id$ Shift: <•id

8

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

29

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6 $ E<•+E <• *id$ Shift: <•*

7 $ E<•+<•* <• id$ Shift: <•id

8 $E<•+<•*<•id •> $ Red: E id

9

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

30

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6 $ E<•+E <• *id$ Shift: <•*

7 $ E<•+<•* <• id$ Shift: <•id

8 $E<•+<•*<•id •> $ Red: E id

9 $E<•+<•*E •> $ Red: E E*E

10

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

31

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6 $ E<•+E <• *id$ Shift: <•*

7 $ E<•+<•* <• id$ Shift: <•id

8 $E<•+<•*<•id •> $ Red: E id

9 $E<•+<•*E •> $ Red: E E*E

10 $E<•+E •> $ Red: E E+E

11

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

32

Ablauf OP-Parser

Nr Stack: R. Input: Aktion:

1 $ <• id+id*id$ Shift: <•id

2 $<•id •> +id*id$ Red: E id

3 $E <• +id*id$ Shift: <•+

4 $E<•+ <• id*id$ Shift: <•id

5 $E<•+<•id •> *id$ Red: E id

6 $ E<•+E <• *id$ Shift: <•*

7 $ E<•+<•* <• id$ Shift: <•id

8 $E<•+<•*<•id •> $ Red: E id

9 $E<•+<•*E •> $ Red: E E*E

10 $E<•+E •> $ Red: E E+E

11 $E $ Accept

+ * ( ) id $

+ •> <• <• •> <• •>

* •> •> <• •> <• •>

( <• <• <• = <•

) •> •> •> •>

id •> •> •> •>

$ <• <• <• <•

Grammatik G3:

Regel 1: E E + E

Regel 2: E E * E

Regel 3: E ( E )

Regel 4: E id

Input

Stac

k

33

Operator-Grammatik

Grammatik muss folgende Bedingungen erfüllen, damit sie mit OP-Parser behandelt werden kann:1. Keine zwei aufeinander folgenden Nichtterminale auf der rechten

Seite einer Produktion.

2. Keine Produktion mit gleicher rechter Seite.

3. Keine ε-Produktionen.

sehr schwaches Verfahren!

34

LR-Syntaxanalyse

LR(k)LR(1)LALR(1)

SLR(1)

LR(0)LL(0)

LL(1)

LL(k)

Alle eindeutigen Grammatiken

LR(k)-Syntaxanalyse:L: left-to-right-parse

R: rightmost derivation: Rechtsableitung

k: k-token lookahead: Anzahl im Voraus betrachteter Inputsymbole

Quelle: Appel, Palsberg (2002).

35

Modell eines LR-Parsers

Action[sm,ai] = shift s |

reduce A β |

accept |

error.

a1 … ai … an $

Sm

Xm

Sm-1

Xm-1

S0

LR-Syntaxanalyse-Programm

Input

Syntaxanalyse-tabelle

Stack

Terminalsymbole

Output

Syntaxbaum

Zu

-stand

Action

(Terminale)

X1… Xn

Goto

(Nichtterminale)

X1… Xn

0

1

Goto[s‘, A]

36

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2

3

4

5

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

37

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3

3

4

5

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

38

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 T + id $ Reduce 3 2

3

4

5

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

39

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 T 2 + id $ Reduce 3 2

3

4

5

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

40

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3 2

3 $ 0 T 2 + id $ Reduce 2 1

4

5

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

41

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3 2

3 $ 0 T 2 + id $ Reduce 2 1

4 $ 0 E 1 + id $ Shift 4

5

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

42

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3 2

3 $ 0 T 2 + id $ Reduce 2 1

4 $ 0 E 1 + id $ Shift 4

5 $ 0 E 1 + 4 id $ Shift 3

6

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

43

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3 2

3 $ 0 T 2 + id $ Reduce 2 1

4 $ 0 E 1 + id $ Shift 4

5 $ 0 E 1 + 4 id $ Shift 3

6 $ 0 E 1 + 4 id 3 $ Reduce 3 5

7

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

44

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3 2

3 $ 0 T 2 + id $ Reduce 2 1

4 $ 0 E 1 + id $ Shift 4

5 $ 0 E 1 + 4 id $ Shift 3

6 $ 0 E 1 + 4 id 3 $ Reduce 3 5

7 $ 0 E 1 + 4 T 5 $ Reduce 1 1

8

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

45

Ablauf LR-Parser

Nr Stack Input Action Goto

1 $ 0 id + id $ Shift 3

2 $ 0 id 3 + id $ Reduce 3 2

3 $ 0 T 2 + id $ Reduce 2 1

4 $ 0 E 1 + id $ Shift 4

5 $ 0 E 1 + 4 id $ Shift 3

6 $ 0 E 1 + 4 id 3 $ Reduce 3 5

7 $ 0 E 1 + 4 T 5 $ Reduce 1 1

8 $ 0 E 1 $ Accept

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

46

LR-Syntaxanalysetabelle-Konstruktion

Allgemeines Vorgehen:Erstellen von:

1. „Dummy-Produktion“: S‘ S (S ist altes Startsymbol).

2. Endlichem Automat.

3. Syntaxanalysetabelle.

47

Erstellen eines Zustandsübergangsgraphen

Grundbegriffe:

Items: Produktionen mit Markierungspunkt auf rechter Seite; zeigt an wie weit man im Parseprozess vorangeschritten ist.

A •XYZ

A X•YZ

A XY•Z

A XYZ•

Closure-Operation: fügt weitere Items zu einer Menge von Items hinzu.

Goto-Operation: Definiert Zustandsübergänge zwischen Mengen von Items/Zuständen des Automaten.

48

Erstellen eines Zustandsübergangsgraphen

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Closure-Operation anwenden!

49

Erstellen einer LR(0)-Syntaxanalysetabelle

Punkt am rechten Ende eines ItemsFalls Dummy-Item: Accept

Sonst Reduce

I J, mit X Terminalsymbol: Shift

I J, mit X Nichtterminalsymbol: Goto

50

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0

1

2

3

4

5

51

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0 s3 1 2

1

2

3

4

5

52

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2

3

4

5

53

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3

4

5

54

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4

5

55

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5

56

Erstellen der LR(0)-Syntaxanalysetabelle

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

S •EE •E+TE •TT •id

S E•E E•+T

E T• T id•

S E+ •TT •id

E E+T•

E +

T id id T

I0

I2

I1

I3

I4

I5

Action Goto

Zust id + $ E T

0 s3 1 2

1 s4 acc

2 r2 r2 r2

3 r3 r3 r3

4 s3 5

5 r1 r1 r1

57

LR(0)-Syntaxanalyse

Grammatik G4:

Regel 1: E E + T

Regel 2: E T

Regel 3: T id

Grammatik G5:

Regel 1: E T + E

Regel 2: E T

Regel 3: T id

58

LR(0)-Syntaxanalyse

Grammatik G5:

Regel 1: E T + E

Regel 2: E T

Regel 3: T id

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 r2 s3, r2 r2

3 s4 5 2

4 r3 r3 r3

5 r1 r1 r1

S •EE •T+EE •TT •id

E

T

id

I0

S E• I1

E T•+EI2E T•

T id• I4

E T+ •EE •T+EE •TT •id

I3E T+E• I5

E

T+

59

LR(0)-Syntaxanalyse

Zwei mögliche Konflikte bei LR-Analyse:Shift-reduce-Konflikt

Reduce-reduce-Konflikt

60

SLR(1)-Syntaxanalyse

SLR(1)-Syntaxanalyse ist Erweiterung von LR(0):Anzahl von Reduce-Einträgen in Action-Tabelle kann verringert werden

Reduce-Aktionen werden nicht mehr für jedes Terminalsymbol eines Zustands eingetragen

Eintrag nur bei Terminalsymbolen, die sich in FOLLOW-Menge des Nichtterminals der Regel befinden

Informale FOLLOW-Definition:X ist ein Nichtterminal

FOLLOW(X) ist die Menge aller Terminale, die in einem Wort direkt rechts neben X stehen können

61

SLR(1)-SyntaxanalysetabelleFOLLOW(S): {$}

FOLLOW(E): {$}

FOLLOW(T): {+,$}

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 r2 s3, r2 r2

3 s4 5 2

4 r3 r3 r3

5 r1 r1 r1

Grammatik G5:

Regel 1: E T + E

Regel 2: E T

Regel 3: T id

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 s3 r2

3 s4 5 2

4 r3 r3 r3

5 r1 r1 r1

LR(0)-Syntaxanalysetabelle SLR(1)-Syntaxanalysetabelle

62

SLR(1)-SyntaxanalysetabelleFOLLOW(S): {$}

FOLLOW(E): {$}

FOLLOW(T): {+,$}

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 r2 s3, r2 r2

3 s4 5 2

4 r3 r3 r3

5 r1 r1 r1

Grammatik G5:

Regel 1: E T + E

Regel 2: E T

Regel 3: T id

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 s3 r2

3 s4 5 2

4 r3 r3

5 r1 r1 r1

LR(0)-Syntaxanalysetabelle SLR(1)-Syntaxanalysetabelle

63

SLR(1)-SyntaxanalysetabelleFOLLOW(S): {$}

FOLLOW(E): {$}

FOLLOW(T): {+,$}

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 r2 s3, r2 r2

3 s4 5 2

4 r3 r3 r3

5 r1 r1 r1

Grammatik G5:

Regel 1: E T + E

Regel 2: E T

Regel 3: T id

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 s3 r2

3 s4 5 2

4 r3 r3

5 r1

LR(0)-Syntaxanalysetabelle SLR(1)-Syntaxanalysetabelle

64

SLR(1)-SyntaxanalysetabelleFOLLOW(S): {$}

FOLLOW(E): {$}

FOLLOW(T): {+,$}

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 r2 s3, r2 r2

3 s4 5 2

4 r3 r3 r3

5 r1 r1 r1

Grammatik G5:

Regel 1: E T + E

Regel 2: E T

Regel 3: T id

Action Goto

Zust id + $ E T

0 s4 1 2

1 acc

2 s3 r2

3 s4 5 2

4 r3 r3

5 r1

LR(0)-Syntaxanalysetabelle SLR(1)-Syntaxanalysetabelle

65

LR(1)-Syntaxanalyse

Mit SLR(1) erstellte Syntaxanalysetabelle für Grammatik G6:

FOLLOW(S‘): {$}

FOLLOW(S): {$}

FOLLOW(E): {+,=,$}

Action Goto

Zust = + id $ S E

0 s3 1 2

1 acc

2 s4 s6

3 r4 r4 r2/r4

4 s8 5

5 s6 r1

6 s7

7 r3 r3 r3

8 r4 r4 r4

Grammatik G‘6:

Regel 0: S‘ S

Regel 1: S E = E

Regel 2: S id

Regel 3: E E + id

Regel 4: E id

66

LR(1)-Syntaxanalyse

id

S

S’

$

S’

S

E = E

id id

S’

S

+

idid

E

$ $

Anwendung von Regel 2

Anwendung von Regel 4

Anwendung von Regel 4

Grammatik G‘6:

Regel 0: S‘ S

Regel 1: S E = E

Regel 2: S id

Regel 3: E E + id

Regel 4: E id

Action Goto

Zust = + id $ S E

0 s3 1 2

1 acc

2 s4 s6

3 r4 r4 r2/r4

4 s8 5

5 s6 r1

6 s7

7 r3 r3 r3

8 r4 r4 r4

67

LR(1)-Syntaxanalyse

SLR(1)-Syntaxanalyse Nutzung von FOLLOW-Mengen

Globale Betrachtung, Zustand wird nicht berücksichtigt

LR(1)-SyntaxanalyseNutzung von LOOKAHEAD-Mengen

Für jeden Zustand wird Information mitverwaltet, welche Terminale auf ein Nichtterminal nach Reduktion einer bestimmten Reduktionsregel im Zustandsautomaten folgen können

68

LR(1)-Syntaxanalyse

Änderungen im Vergleich zu SLR(1):Verwendung von LR(1)- anstelle von LR(0)-Items.

Definition von closure- und goto-Operation für Behandlung der LOOKAHEAD-Mengen abgeändert. Anfangszustand ist [S‘ S, $].

Action-Tabelle nutzt LOOKAHEAD-Mengen und nicht FOLLOW-Mengen.

69

LR(1)-Syntaxanalyse

S‘ •S {$} S •E=E {$}S •id {$}E •E+id {+,=}

I0

E •id {+,=}

S‘ S• {$}

S

I1

S id• {$}

id

E id• {+,=}

I3

S E•=E {$}

E

E E•+id {+,=}

I2

I4

I6

+

=

Grammatik G‘6:

0: S‘ S

1: S E = E

2: S id

3: E E + id

4: E id

Kern LOOKAHEAD-Menge

70

LR(1)-Syntaxanalyse

Mit LR(1) erstellte Syntaxanalysetabelle für Grammatik G6:

Action Goto

Zust = + id $ S E

0 s3 1 2

1 acc

2 s4 s6

3 r4 r4 r2

4 s8 5

5 s9 r1

6 s7

7 r3 r3

8 r4 r4

9 s10

10 r3 r3

Grammatik G‘6:

Regel 0: S‘ S

Regel 1: S E = E

Regel 2: S id

Regel 3: E E + id

Regel 4: E id

71

LR(1)-Syntaxanalyse

LR(1) mächtiges Verfahren

Anzahl Zustände: Typische Programmiersprachen bei LR(0)/SLR(1) mehrere 100

Typische Programmiersprache bei LR(1) werden mehrere 1000

Motivation für LALR(1):Weniger Zustände als LR(1)

Trotzdem mächtig genug für typische Programmiersprachen

Vorgehen bei LALR(1):Zustände eines LR(1)-Zustandsübergangsgraphen mit gleichen Kernen zusammenfassen

72

LALR(1)-Syntaxanalyse

S’→ .S {$}S → .E=E {$}S → .id {$}E → .E+id {+,=}E → .id {+,=}

S

E

S’→ S. {$}

I1

S → id. {$}E → id. {+,=}

S → E.=E {$}E → E.+id {+,=}

S → E=.E {$}E → .E+id {+,$}E → .id {+,$}

=

I0

I3 I2 I4

E → id. {+,$}

I8

id

E → E+.id {+,=}

I6

+

E → E+id. {+,=}id

I7

S → E=E. {$}E → E.+id {+,$}

I5

E → E+.id {+,$}

I9

E → E+id. {+,$}

I10

E

+

id

Gleiche Kerne

73

LALR(1)-Syntaxanalyse

Mit LALR(1) erstellte Syntaxanalysetabelle für Grammatik G6:

Action Goto

Zust = + id $ S E

0 s3 1 2

1 acc

2 s4 s69

3 r4 r4 r2

4 s8 5

5 s69 r1

69 s710

710 r3 r3 r3

8 r4 r4

Grammatik G‘6:

Regel 0: S‘ S

Regel 1: S E = E

Regel 2: S id

Regel 3: E E + id

Regel 4: E id

74

Zusammenfassung

Operator-Precedence-Syntaxanalyse Einfach umzusetzendes Verfahren

Geringe Mächtigkeit

LR-Parser Mächtigste effiziente Parser

LR(0), SLR(1), LALR(1), LR(1)

Gleicher Ablaufalgorithmus, Unterschied Syntaxanalysetabelle

Immer Konstruktion eines Zustandsautomaten, aus dem Syntaxanalysetabelle abgeleitet werden kann

Meist wird LALR(1) eingesetzt

Derzeitige Algorithmen der Syntaxanalyse ausreichend für gängige Programmiersprachen

75

Fragen, Kommentare, Diskussion

Recommended