CS 406: Bottom-Up Parsing

Similar documents
Shift-Reduce parser E + (E + (E) E [a-z] In each stage, we shift a symbol from the input to the stack, or reduce according to one of the rules.

Administrivia. Test I during class on 10 March. Bottom-Up Parsing. Lecture An Introductory Example

Syntax Analysis (Part 2)

Parsing -3. A View During TD Parsing

Compiler Design Spring 2017

I 1 : {S S } I 2 : {S X ay, Y X } I 3 : {S Y } I 4 : {X b Y, Y X, X by, X c} I 5 : {X c } I 6 : {S Xa Y, Y X, X by, X c} I 7 : {X by } I 8 : {Y X }

Compiler Construction

Bottom-Up Parsing. Ÿ rm E + F *idÿ rm E +id*idÿ rm T +id*id. Ÿ rm F +id*id Ÿ rm id + id * id

LR2: LR(0) Parsing. LR Parsing. CMPT 379: Compilers Instructor: Anoop Sarkar. anoopsarkar.github.io/compilers-class

Computer Science 160 Translation of Programming Languages

CA Compiler Construction

Compiler Design 1. LR Parsing. Goutam Biswas. Lect 7

Bottom up parsing. General idea LR(0) SLR LR(1) LALR To best exploit JavaCUP, should understand the theoretical basis (LR parsing);

Parsing Algorithms. CS 4447/CS Stephen Watt University of Western Ontario

Compiler Construction Lectures 13 16

Lecture 11 Sections 4.5, 4.7. Wed, Feb 18, 2009

Compiler Construction Lent Term 2015 Lectures (of 16)

Lecture VII Part 2: Syntactic Analysis Bottom-up Parsing: LR Parsing. Prof. Bodik CS Berkley University 1

Compiler Construction Lent Term 2015 Lectures (of 16)

n Top-down parsing vs. bottom-up parsing n Top-down parsing n Introduction n A top-down depth-first parser (with backtracking)

THEORY OF COMPILATION

Chapter 4: Bottom-up Analysis 106 / 338

ΕΠΛ323 - Θεωρία και Πρακτική Μεταγλωττιστών. Lecture 7a Syntax Analysis Elias Athanasopoulos

Introduction to Bottom-Up Parsing

Introduction to Bottom-Up Parsing

Bottom-Up Syntax Analysis

Introduction to Bottom-Up Parsing

Bottom-Up Syntax Analysis

Introduction to Bottom-Up Parsing

Curs 8. LR(k) parsing. S.Motogna - FL&CD

Announcements. H6 posted 2 days ago (due on Tue) Midterm went well: Very nice curve. Average 65% High score 74/75

Top-Down Parsing and Intro to Bottom-Up Parsing

1. For the following sub-problems, consider the following context-free grammar: S AA$ (1) A xa (2) A B (3) B yb (4)

CMSC 330: Organization of Programming Languages. Pushdown Automata Parsing

Bottom-Up Syntax Analysis

Bottom-up Analysis. Theorem: Proof: Let a grammar G be reduced and left-recursive, then G is not LL(k) for any k.

EXAM. CS331 Compiler Design Spring Please read all instructions, including these, carefully

LR(1) Parsers Part III Last Parsing Lecture. Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

CS20a: summary (Oct 24, 2002)

Syntax Analysis Part I

CS 455/555: Finite automata

Bottom-Up Syntax Analysis

INF5110 Compiler Construction

Syntax Analysis Part I

Syntax Analysis Part I. Position of a Parser in the Compiler Model. The Parser. Chapter 4

LR(1) Parsers Part II. Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

LR(1) Parsers Part II. Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

Compiling Techniques

Type 3 languages. Type 2 languages. Regular grammars Finite automata. Regular expressions. Type 2 grammars. Deterministic Nondeterministic.

Briefly on Bottom-up

1. For the following sub-problems, consider the following context-free grammar: S AB$ (1) A xax (2) A B (3) B yby (5) B A (6)

Context free languages

CS415 Compilers Syntax Analysis Bottom-up Parsing

Pushdown Automata: Introduction (2)

Parsing VI LR(1) Parsers

Syntax Analysis, VII The Canonical LR(1) Table Construction. Comp 412

Everything You Always Wanted to Know About Parsing

THEORY OF COMPUTATION (AUBER) EXAM CRIB SHEET

Syntax Analysis, VI Examples from LR Parsing. Comp 412

CS 314 Principles of Programming Languages

Ambiguity, Precedence, Associativity & Top-Down Parsing. Lecture 9-10

Compilerconstructie. najaar Rudy van Vliet kamer 124 Snellius, tel rvvliet(at)liacs.

60-354, Theory of Computation Fall Asish Mukhopadhyay School of Computer Science University of Windsor

October 6, Equivalence of Pushdown Automata with Context-Free Gramm

UNIT-VI PUSHDOWN AUTOMATA

Bottom-up syntactic parsing. LR(k) grammars. LR(0) grammars. Bottom-up parser. Definition Properties

Creating a Recursive Descent Parse Table

Syntax Analysis Part III

Computing if a token can follow

EXAM. CS331 Compiler Design Spring Please read all instructions, including these, carefully

Syntactic Analysis. Top-Down Parsing

MA/CSSE 474 Theory of Computation

Translator Design Lecture 16 Constructing SLR Parsing Tables

Bottom-up syntactic parsing. LR(k) grammars. LR(0) grammars. Bottom-up parser. Definition Properties

Bottom-up syntactic parsing. LR(k) grammars. LR(0) grammars. Bottom-up parser. Definition Properties

Why augment the grammar?

CS153: Compilers Lecture 5: LL Parsing

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

Outline. CS21 Decidability and Tractability. Machine view of FA. Machine view of FA. Machine view of FA. Machine view of FA.

Syntax Analysis, VII The Canonical LR(1) Table Construction. Comp 412 COMP 412 FALL Chapter 3 in EaC2e. source code. IR IR target.

CS Rewriting System - grammars, fa, and PDA

Context-free Languages and Pushdown Automata

CPS 220 Theory of Computation Pushdown Automata (PDA)

Predictive parsing as a specific subclass of recursive descent parsing complexity comparisons with general parsing

CS415 Compilers Syntax Analysis Top-down Parsing

Syntactical analysis. Syntactical analysis. Syntactical analysis. Syntactical analysis

On LR(k)-parsers of polynomial size

Outline. CS21 Decidability and Tractability. Regular expressions and FA. Regular expressions and FA. Regular expressions and FA

CSE302: Compiler Design

CSC 4181Compiler Construction. Context-Free Grammars Using grammars in parsers. Parsing Process. Context-Free Grammar

UNIT-VIII COMPUTABILITY THEORY

Computer Science 160 Translation of Programming Languages

CS Pushdown Automata

Compiler Principles, PS4

Pushdown Automata (2015/11/23)

Syntax analysis Context-free syntax is specified with a context-free grammar.

1. Draw a parse tree for the following derivation: S C A C C A b b b b A b b b b B b b b b a A a a b b b b a b a a b b 2. Show on your parse tree u,

Decision, Computation and Language

Harvard CS 121 and CSCI E-207 Lecture 10: Ambiguity, Pushdown Automata

CISC4090: Theory of Computation

Transcription:

CS 406: Bottom-Up Parsing Stefan D. Bruda Winter 2016

BOTTOM-UP PUSH-DOWN AUTOMATA A different way to construct a push-down automaton equivalent to a given grammar = shift-reduce parser: Given G = (N, Σ, S, R) construct the push-down automaton M = ({p, q}, Σ, N Σ,, s, {q}) with containing exactly all the transitions: shift a Σ : ((p, a, ε), (p, a)) reduce A ::= α R : ((p, ε, α R ), (p, A)) done ((p, ε, S), (q, ε)) Left-to-right traversal of the input + rightmost derivation! Just as nondeterministic as the previous construction! CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 1 / 17

BOTTOM-UP PUSH-DOWN AUTOMATA A different way to construct a push-down automaton equivalent to a given grammar = shift-reduce parser: Given G = (N, Σ, S, R) construct the push-down automaton M = ({p, q}, Σ, N Σ,, s, {q}) with containing exactly all the transitions: shift a Σ : ((p, a, ε), (p, a)) reduce A ::= α R : ((p, ε, α R ), (p, A)) done ((p, ε, S), (q, ε)) Left-to-right traversal of the input + rightmost derivation! Just as nondeterministic as the previous construction! Shift/reduce conflict: when to shift and when to reduce? Establish a precedence relation (lookahead table) P (N Σ) Σ If (stack-top, input) P then we reduce, else we shift CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 1 / 17

BOTTOM-UP PUSH-DOWN AUTOMATA A different way to construct a push-down automaton equivalent to a given grammar = shift-reduce parser: Given G = (N, Σ, S, R) construct the push-down automaton M = ({p, q}, Σ, N Σ,, s, {q}) with containing exactly all the transitions: shift a Σ : ((p, a, ε), (p, a)) reduce A ::= α R : ((p, ε, α R ), (p, A)) done ((p, ε, S), (q, ε)) Left-to-right traversal of the input + rightmost derivation! Just as nondeterministic as the previous construction! Shift/reduce conflict: when to shift and when to reduce? Establish a precedence relation (lookahead table) P (N Σ) Σ If (stack-top, input) P then we reduce, else we shift Reduce/reduce conflict: when we reduce, with what rule we reduce? Use the logest rule = greedy (eat up the longest stack top) We thus obtain an LR parser CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 1 / 17

EXAMPLE OR LR PARSING E ::= E + T E ::= T T ::= T F T ::= F F ::= ( E ) F ::= y P ( ) y + $ ( ) y + E T F ( (p, a, ε), (p, a) ), a {+..(, ), y} ( (p, ε, T + E ), (p, E ) ) ( (p, ε, T ), (p, E ) ) ( (p, ε, F T ), (p, T ) ) ( (p, ε, F ), (p, T ) ) ( (p, ε, ) E (), (p, F ) ) ( (p, ε, y), (p, F ) ) ( (p, ε, E ) (q, ε) ) Input Stack y + y * y $ $ shift + y * y $ y $ red + y * y $ F $ red + y * y $ T $ red + y * y $ E $ shift y * y $ + E $ shift * y $ y + E $ red * y $ F + E $ red * y $ T + E $ shift y $ * T + E $ shift $ y * T + E $ red $ F * T + E $ g-red $ T + E $ g-red $ E $ done $ $ red = reduce (unambiguous) g-red = greedy reduce (longest rule) CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 2 / 17

A FIRST LR PARSING ALGORITHM function LRPARSER(G = (N, Σ, S, R), PrecTable:(N Σ) Σ): PUSH(ADVANCE()) 1 accepted False while not accepted do if TOP()TOP() = S$ and PEEK() = $ then accepted True 3 else action PrecTable[TOP()][PEEK()] if action = shift then PUSH(ADVANCE()) 1 else if action = reduce A ::= x 1... x m then for i = m down to 1 do POP(x i ) PUSH(A) 2 else ERROR( Syntax error ) accepted True Stack operations: PUSH(), POP(), TOP() Operations on the input stream: ADVANCE() (returns the next token and consume it), PEEK() (returns the next token but does not consume it) = {((p, a, ε), (p, a)) : a Σ} 1 {((p, ε, α R ), (p, A)) : A ::= α R} 2 {((p, ε, S), (q, ε))} 3 CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 3 / 17

A PRACTICAL LR PARSING ALGORITHM function LRPARSER(G = (N, Σ, S, R), LRTable:(N Σ) Σ): PUSH(0) accepted False while not accepted do action LRTable[TOP()][PEEK()] if action = shift s then PUSH(s) if s is accepting then accepted True else ADVANCE() else if action = reduce A ::= w then POP( w ) PREPEND( A ) else ERROR( Syntax error ) PREPEND() pushes one symbol at the beginning of the input stream Each time A ::= w is used the prefix w of the current input string is replaced by A Handle = a sequence of symbols that will be next replaced by a reduction The tokens are shifted on the stack until a handle appears When a handle appears, it is reduced CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 4 / 17

PARSE TABLE EXAMPLE st ::= S $ (1) S ::= A C (2) C ::= c (3) ε (4) A ::= a B C d (5) B Q (6) B ::= b B (7) ε (8) Q ::= q (9) ε (10) State a b c d q $ st S A B C Q 0 3 2 8 8 8 accept 4 1 5 1 11 4 14 2 2 8 8 8 8 13 3 2 8 8 9 4 8 5 10 7 10 6 6 6 6 7 9 9 8 1 9 11 4 10 10 12 11 3 3 12 5 5 13 7 7 7 7 14 2 CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 5 / 17

LR PARSING EXAMPLE Action Input Stack abbdc$ 0 shift 3 bbdc$ 3,0 shift 2 bdc$ 2,3,0 shift 2 dc$ 2,2,3,0 reduce 8 B dc$ 2,2,3,0 shift 13 dc$ 13,2,2,3,0 reduce 7 B dc$ 2,3,0 shift 13 dc$ 13,2,3,0 reduce 7 B dc$ 3,0 shift 9 dc$ 9,3,0 reduce 4 C dc$ 9,3,0 shift 10 dc$ 10,9,3,0 shift 12 c$ 12,10,9,3,0 reduce 5 A c$ 0 shift 1 c$ 1,0 shift 11 $ 11,1,0 reduce 3 C $ 1,0 shift 14 $ 14,1,0 reduce 2 S $ 0 shift 4 $ 4,0 shift 8 $ 8,4,0 reduce 1 st $ 0 accept st ::= S $ (1) S ::= A C (2) C ::= c (3) ε (4) A ::= a B C d (5) B Q (6) B ::= b B (7) ε (8) Q ::= q (9) ε (10) CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 6 / 17

CONFLICT RESOLUTION BASICS Some shift/reduce conflicts can be resolved by assigning precedence and associativity to tokens exp ::= exp + exp exp exp ( exp ) id CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 7 / 17

CONFLICT RESOLUTION BASICS Some shift/reduce conflicts can be resolved by assigning precedence and associativity to tokens exp ::= exp + exp exp exp ( exp ) id Suppose that a LR parser reaches the following configuration: Input Stack Prefix id $ 7,4,1,0 exp + exp If takes precedence over + then we must shift If + takes precedence over then we must reduce exp + exp to exp CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 7 / 17

CONFLICT RESOLUTION BASICS Some shift/reduce conflicts can be resolved by assigning precedence and associativity to tokens exp ::= exp + exp exp exp ( exp ) id Suppose that a LR parser reaches the following configuration: Input Stack Prefix id $ 7,4,1,0 exp + exp If takes precedence over + then we must shift If + takes precedence over then we must reduce exp + exp to exp Suppose that a LR parser reaches the following configuration: Input Stack Prefix + id $ 7,4,1,0 exp + exp If + is left-associative then we reduce, else we shift CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 7 / 17

CONFLICT RESOLUTION BASICS (CONT D) Reduce/reduce conflicts become essentially shift/reduce conflicts in an LR parser stmt ::= if e then stmt else stmt if e then stmt other Suppose that a LR parser reaches the following configuration: Input Stack Prefix else other $ 9,4,8,5,3,1,0 if e if e then other If we shift then the else branch will belong to the inner if If we reduce then the else branch will belong to the outer if CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 8 / 17

CONFLICT RESOLUTION BASICS (CONT D) Reduce/reduce conflicts become essentially shift/reduce conflicts in an LR parser stmt ::= if e then stmt else stmt if e then stmt other Suppose that a LR parser reaches the following configuration: Input Stack Prefix else other $ 9,4,8,5,3,1,0 if e if e then other If we shift then the else branch will belong to the inner if If we reduce then the else branch will belong to the outer if Usual strategy is greedy (reduce with the longest rule) the shift/reduce conflict is resolved in favor of shifting CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 8 / 17

LR(k) PARSING DEFINITIONS AND NOTATIONS An LR(k) parser can look ahead at the next k tokens in the input (plus the top of the stack) At any given time it can either reduce the current handler on the stack (reduce) or add to the handler (shift) The decision is based on the symbols already shifted (left context) and the next k lookahead symbols (right context) Driven by an LR algorithm + parse (lookahead) table Every entry in the parse table can accommodate at most one item an LR parser is deterministic Confusing notation: LR(0) and LR(1) parsers both look ahead at the next input token The 0 in LR(0) refers to the lookahead used in constructing the parse table LR(k) parsers for k 2 have huge parse tables and so are not in wide use CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 9 / 17

LR(k) GRAMMARS Notation: FIRST k (w) = {p Σ : w pu, p = k, u (N Σ) } A grammar is LR(k) iff it is possible to construct a LR(k) table for that grammar Formally, a grammar (N, Σ, S, R) is LR(k) iff the following conditions imply α A z = γ B x: 1 S R α A z R αβw 2 S R γ B x R αβy 3 FIRST k (w) = FIRST k (y) CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 10 / 17

LR(k) GRAMMARS Notation: FIRST k (w) = {p Σ : w pu, p = k, u (N Σ) } A grammar is LR(k) iff it is possible to construct a LR(k) table for that grammar Formally, a grammar (N, Σ, S, R) is LR(k) iff the following conditions imply α A z = γ B x: 1 S R α A z R αβw 2 S R γ B x R αβy 3 FIRST k (w) = FIRST k (y) Suppose we already have αβ as the current handle and w as remaining input; should we reduce using A ::= β? We can decide by looking at FIRST k (w) In LR(k) parsing we can thus always determine the correct reduction by looking at the left context and the next k tokens in the input CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 10 / 17

LR(0) TABLE CONSTRUCTION An LR(0) table is constructed based on exploring the state space of the parser The state space is finite so the algorithms takes finite time May or may not succeed in constructing a table (with one entry per cell) If the construction does not succeed then inadequate states (which lack sufficient information to have unique entries) are identified States represent sets of LR(0) items (or just items) An item for a Grammar G is a rule of G with a marker (or bookmark) at some position in the right hand side. The rule A ::= XYZ yields the following four items: A ::= XYZ A ::= X YZ A ::= XY Z A ::= XYZ The rule A ::= ε generates a single item: A ::= Intuitively, an item indicates how much of the rule has been seen so far in the input Canonical LR(0) collections are sets of items and provide the basis for the construction of the LR(0) finite automaton CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 11 / 17

LR(0) AUTOMATON: ESSENTIAL ALGORITHMS function CLOSURE(I: set of items) returns set of items: ans I repeat prev ans foreach rule A ::= α Bγ do foreach rule B ::= w do ans ans {B ::= w} until ans = prev: return ans function GOTO(I: set of items, X N Σ) returns set of items: ans foreach rule A ::= α Xγ do ans ans {A ::= αx γ} return CLOSURE(ans) A ::= α Bγ being in CLOSURE(I) means that at some point during parsing we might see next a substring derivable from Bγ If so, then this substring will have a prefix derivable from B GOTO is then used to define the transitions of the LR(0) automaton CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 12 / 17

CONSTRUCTING THE LR(0) AUTOMATON function LR0AUTOMATON(G = (N, Σ, S, R)) returns finite automaton: start CLOSURE({S ::= w R}) states {start} transitions repeat grow False foreach I states do foreach X N Σ do next GOTO(I, X) if next then X transitions transitions {I next} if next states then states states {next} grow True until grow: accepting {X states : A ::= u X} return finite automaton with initial state start, states states, transitions transitions, and accepting states accepting Note in passing that the whole construction is similar to the one that constructs a deterministic finite automaton out of a nondeterministic one CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 13 / 17

EXAMPLE OF LR(0) AUTOMATON E I 1 E ::= E E ::= E + T $ + I 6 E ::= E + T T ::= T F T ::= F F ::= ( E ) F ::= id T + I 9 E ::= E + T T ::= T F I 0 E ::= E E ::= E + T E ::= T T ::= T F T ::= F F ::= ( E ) F ::= id id T T accept I 2 E ::= T T ::= T F I 5 F ::= id id id E I 7 T ::= T F F ::= ( E ) F ::= id I 8 E ::= E + T F ::= ( E ) F ) I 10 T ::= T F I 11 F ::= ( E ) id ( F ( I 4 F ::= ( E ) E ::= E + T E ::= T T ::= T F T ::= F F ::= ( E ) F ::= id F I 3 T ::= F ( F ( E ::= E (1) E ::= E + T (2) E ::= T (3) T ::= T F (4) T ::= F (5) F ::= ( E ) (6) F ::= id (7) CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 14 / 17

USING THE LR(0) AUTOMATON: SHIFT ACTIONS Suppose that the string γ takes the automaton from state 0 to state j When the next input symbol is a we shift iff state j has an outgoing transition labeled a Example: the previous LR(0) automaton generates the following table: State + ( ) id $ E E T F 0 4 5 1 2 3 1 6 accept 2 7 3 4 4 5 8 2 5 6 4 5 9 3 7 4 5 10 8 6 11 9 7 10 11 CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 15 / 17

USING THE LR(0) AUTOMATON: REDUCE ACTIONS Suppose that the string γ takes the automaton from state 0 to state j When the next input symbol is a we shift iff state j has an outgoing transition labeled a CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 16 / 17

USING THE LR(0) AUTOMATON: REDUCE ACTIONS Suppose that the string γ takes the automaton from state 0 to state j When the next input symbol is a we shift iff state j has an outgoing transition labeled a Otherwise we reduce The items in state j tell us what rules to use for this purpose Reductions can only happen in the final states, which contain reducible items that is, items of form A ::= w For each reducible item we reduce with the corresponding rule for the whole state line in the table Can result in shift/reduce conflicts whenever some cells on a line already contain shift entries Can result in reduce/reduce conflicts whenever some state contains more than one reducible item CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 16 / 17

LR(0) PARSE TABLE EXAMPLE State + ( ) id $ E E T F 0 4 5 1 2 3 1 1, 6 1 1 1 1 1, accept 1 1 1 1 2 3 3, 7 3 3 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 4 4 5 8 2 5 7 7 7 7 7 7 7 7 7 7 6 4 5 9 3 7 4 5 10 8 6 11 9 2 2, 7 2 2 2 2 2 2 2 2 10 4 4 4 4 4 4 4 4 4 4 11 6 6 6 6 6 6 6 6 6 6 CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 17 / 17

LR(0) PARSE TABLE EXAMPLE State + ( ) id $ E E T F 0 4 5 1 2 3 1 1, 6 1 1 1 1 1, accept 1 1 1 1 2 3 3, 7 3 3 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 4 4 5 8 2 5 7 7 7 7 7 7 7 7 7 7 6 4 5 9 3 7 4 5 10 8 6 11 9 2 2, 7 2 2 2 2 2 2 2 2 10 4 4 4 4 4 4 4 4 4 4 11 6 6 6 6 6 6 6 6 6 6 Three shift/reduce conflicts but no reduce/reduce conflict CS 406: Bottom-Up Parsing (S. D. Bruda) Winter 2016 17 / 17