43
Dynamic Grammars Lukas Renggli, Stéphane Ducasse, Tudor Gîrba, Oscar Nierstrasz

Dynamic grammars

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Dynamic grammars

Dynamic Grammars

Lukas Renggli, Stéphane Ducasse, Tudor Gîrba, Oscar Nierstrasz

Page 2: Dynamic grammars

[Adapted from The New Oxford American Dictionary on Grammar]

grammara set of rules governing what

strings are valid or allowable in a [formal] language.

Page 3: Dynamic grammars

dynamic grammara high-level grammar that

executes at runtime behaviors that other grammars perform during compilation, see dynamic languages.

[Adapted from Wikipedia on Dynamic Programming Languages]

Page 4: Dynamic grammars

Dynamic GrammarsDynamic Languages

‣ Late-bound behavior

‣ First-class representation

‣ On-the-fly transformation

‣ Introspection and reflection

Page 5: Dynamic grammars

Why would we want that?

Page 6: Dynamic grammars

Language Boxes

Host Environment

Language and Tool Extensions

Page 7: Dynamic grammars

Language Boxes

Host Environment

Dyn

amic

G

ram

mar

s

Language and Tool Extensions

Page 8: Dynamic grammars

LanguageChange

LanguageConcern

LanguageScope

LanguageBox

*

*

*

*

Page 9: Dynamic grammars

LanguageChange =

Host Language Grammarδ

Page 10: Dynamic grammars

LanguageChange =

Grammar Transformation

Page 11: Dynamic grammars

scanIdentifier self step. ((currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ]) ifTrue: [ [ self recordMatch: #IDENTIFIER. self step. (currentCharacter between: $0 and: $9)or: [ (currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ] ] ] whileTrue. ^ self reportLastMatch ]

Page 12: Dynamic grammars

scanIdentifier self step. ((currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ]) ifTrue: [ [ self recordMatch: #IDENTIFIER. self step. (currentCharacter between: $0 and: $9)or: [ (currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ] ] ] whileTrue. ^ self reportLastMatch ]✖

Page 13: Dynamic grammars

#(#[1 0 9 0 25 0 13 0 34 0 17 0 40 0 21 0 41] #[1 0 9 0 25 0 13 0 34 0 93 0 76 0 157 0 112] #[1 2 38 0 21 2 38 0 25 2 38 0 26 0 13 0 34] #[0 1 154 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[0 1 210 0 76 0 81] #[0 1 214 0 76 0 81] #[1 0 173 0 76 0 177 0 81] #[0 1 134 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[1 1 46 0 21 1 46 0 25 1 46 0 26 1 69] #[1 1 54 0 21 1 54 0 25 1 54 0 26 1 54 0 34] #[0 2 102 0 21 0 25 0 26 0 34 0 40 0 41 0 76]

#[0 2 50 0 21 0 25 0 26 0 76 0 79] #[1 1 13 0 76 2 85 0 124 1 21 0 125] #[1 2 89 0 17 2 30 0 21 2 30 0 82] #[1 2 93 0 21 2 97 0 82] )

Page 14: Dynamic grammars

#(#[1 0 9 0 25 0 13 0 34 0 17 0 40 0 21 0 41] #[1 0 9 0 25 0 13 0 34 0 93 0 76 0 157 0 112] #[1 2 38 0 21 2 38 0 25 2 38 0 26 0 13 0 34] #[0 1 154 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[0 1 210 0 76 0 81] #[0 1 214 0 76 0 81] #[1 0 173 0 76 0 177 0 81] #[0 1 134 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[1 1 46 0 21 1 46 0 25 1 46 0 26 1 69] #[1 1 54 0 21 1 54 0 25 1 54 0 26 1 54 0 34] #[0 2 102 0 21 0 25 0 26 0 34 0 40 0 41 0 76]

#[0 2 50 0 21 0 25 0 26 0 76 0 79] #[1 1 13 0 76 2 85 0 124 1 21 0 125] #[1 2 89 0 17 2 30 0 21 2 30 0 82] #[1 2 93 0 21 2 97 0 82] )✖

Page 15: Dynamic grammars
Page 16: Dynamic grammars

a..z a..z

0..9

ID ::= letter { letter | digit } ;

Page 17: Dynamic grammars

letter

letter digit

sequence

choice

star

id := #letter , (#letter / #digit) star

Page 18: Dynamic grammars

letter

letter digit

sequence

choice

star

id := #letter asParser , (#letter asParser / #digit asParser) star

Page 19: Dynamic grammars

Scannerless Parser

Page 20: Dynamic grammars

Parsing Expression Grammar

Page 21: Dynamic grammars

Packrat Parser

Page 22: Dynamic grammars

Parser Combinator

Page 23: Dynamic grammars
Page 24: Dynamic grammars

GrammarTransformation

Page 25: Dynamic grammars

GraphRewriting

Page 26: Dynamic grammars

letter

letter digit

sequence

choice

star

#letter → #letter / $_

Page 27: Dynamic grammars

letter

digit

sequence

choice

starchoice

_

letter

choice

_

#letter → #letter / $_

Page 28: Dynamic grammars

Optimizations

Page 29: Dynamic grammars

letter

digit

sequence

choice

starchoice

_

letter

choice

_

(`a / `b) / `c → `a / `b / `c

Page 30: Dynamic grammars

letter

digit

sequence

choice

starchoice

_

letter _

(`a / `b) / `c → `a / `b / `c

Page 31: Dynamic grammars

letter

digit

sequence

choice

starchoice

_

letter _

in generala graph

(`a / `b) / `c → `a / `b / `c

Page 32: Dynamic grammars

Conflicts?

Page 33: Dynamic grammars

SELECT * FROM users

Page 34: Dynamic grammars

SELECT * FROM users| r |r := ^ User fromRow: r

.

Page 35: Dynamic grammars

expr sql|

Page 36: Dynamic grammars

SELECT * FROM users<SQL: >

Page 37: Dynamic grammars

expr sql/

ordered

Page 38: Dynamic grammars

No Conflicts

Page 39: Dynamic grammars

No Ambiguities

Page 40: Dynamic grammars

expr sql/

surprise

Page 41: Dynamic grammars

/ exprsql

surprise

Page 42: Dynamic grammars

expr sql|

!expr sql / !sql expr

Page 43: Dynamic grammars

expr sql$

!expr sql / !sql expr / ui