Criando DSLs no dia a dia

Transcrição

Criando DSLs no dia a dia
Uma linguagem para chamar de minha:
Criando DSLs no dia a dia
Jacqueline Abreu Lopes
Developer
Acredita que todas as tecnologias tem algo positivo
Mamãe do Miguel
@JacAbreu
Objetivo:
Contribuir para que todos
construam as suas DSLs
Domain Specific Language
“DSLs are small languages, focused on a
particular aspect of a software system.
You can't build a whole program with a DSL,
but you often use multiple DSLs in a system
mainly written in a general purpose language.”
Martin Fowler
Algumas DSLs
Yaml
CSS
SQL
LaTeX
DSL x General-purpose language
DSLs possuem features que são utilizadas
apenas para um domínio específico, não
permitindo reutilização de outras formas.
DSLs são linguagens
O que diferencia DSLs e linguagens de propósito
geral é a função, e não a forma.
Código Fonte
Análise Lexica
Análise Sintática
Análise Semântica
Codegen ou
Interpretação
Análise Lexica
Quais são e o que significam os
símbolos da linguagem?
if (x > 3.1) { print(x); }
Análise Lexica
Quais são e o que significam os
símbolos da linguagem?
if (x > 3.1) { print(x); }
Quais são e o que significam os
símbolos da linguagem?
Análise Lexica
if (x > 3.1) { print(x); }
if
r
o
nu
r
l
id
i r s
l i
ke eft den per
en left denightemi ight
m ight eft
be
pa ti
a
pa tif pa co
yw
tif
c
pa cur
r
re fie tor
ie
re ie re lon urly
r
l
or
y
e
r
nt r
gt
nt r nt
nt -b
d
-b
he
he
ra
h
he
ra
e
sis
sis
ce
sis ces
sis
s
Quais são e o que significam os
símbolos da linguagem?
Análise Lexica
if (x > 3.1) { print(x); }
if
r
o
nu
r
l
id
i r s
l i
ke eft den per
en left denightemi ight
m ight eft
be
pa ti
a
pa tif pa co
yw
tif
c
pa cur
r
re fie tor
ie
re ie re lon urly
r
l
or
y
e
r
nt r
gt
nt r nt
nt -b
d
-b
he
he
ra
h
he
ra
e
sis
sis
ce
sis ces
sis
s
Análise Sintática
Como os símbolos se organizam
seguindo a sintaxe?
if-stmt
condition
then-stmt
binary op
function call
if (x > 3.1) { print(x); }
Análise Sintática
Como os símbolos se organizam
seguindo a sintaxe?
if
>
x
print
3.1
x
AnáliseSemântica
Sintática
Análise
O que significa cada nó da AST? Qual o
tipo de cada expressão?
void
if
boolean
void
print
1 arg
>
float
float
float
x
3.1
x
Análise
Sintática
Codegen
E qual o resultado disso tudo?
void
if
boolean
void
print
1 arg
>
float
float
float
x
3.1
x
0122:
0123:
0124:
0125:
0126:
0127:
0128:
0129:
...
LOAD_VAR x
LOAD_FLOAT 3.1
GT
JUMP_IF_FALSE 0129
LOAD_VAR x
CALL print
...
Como construir uma
Domain Specific Language
+
+ ...
Como Construir a sua Linguagem
➔
Construir a linguagem na mão (e aproveitar e fazer em assembly)
➔
Usar um parser generator
(ou parser combinator, respeitamos a diversidade aqui)
Parsers Generators
JFlex
JavaCC
ANTLR4
Ragel
Por que ANTLR 4
➔ Porque ele não é o ANTLR 3
➔ Facilidade
➔ Muito material online
➔ Compila para Java, C#, Python e Javascript
https://theantlrguy.atlassian.
net/wiki/display/ANTLR4/ANTLR+4+Docume
ntation
Gramática é um conjunto de regras
que definem a construção de strings
de uma linguagem formal.
Não Terminais: símbolos que não fazem
parte da línguagem.
Estes serão substituídos para alcançar uma
sequência de caracteres válida para a línguagem.
Terminais: símbolos que fazem parte da
línguagem.
Estes substituírão não terminais - de acordo com a
gramática - para tentar alcançar uma sequência de
caracteres aceita pela linguagem.
Representação de Gramática
S→T
S→S
T→W
T→ε
Representação de Gramática em
ANTLR4
S : T | S;
T : W?;
https://github.com/JacAbreu/QConRio2015
https://github.com/JacAbreu/QConRio2015
Bibliografia
https://www.youtube.com/watch?v=i1KVwoE3n28
http://blog.caelum.com.br/domain-specific-languages-em-acao/
http://www.slideshare.net/karreiro/tdc-2015-dsls-em-ruby
https://github.com/JetBrains/MPS
http://www.cin.ufpe.br/~tg/2010-1/macfx.pdf
http://stackoverflow.com/questions/809574/what-is-domain-specific-language-anybody-using-it-and-in-what-way
http://www.slideshare.net/VasimPathan/spr-ch05compilers
http://martinfowler.com/bliki/LanguageWorkbench.html
http://stackoverflow.com/questions/tagged/antlr
http://stackoverflow.com/questions/tagged/antlr4
http://www.booksllc.net/sw2.cfm?q=Formal_grammar
https://pt.wikipedia.org/wiki/JavaCC
https://github.com/juanplopes/pyrex/blob/master/monograph/regex.pdf
http://www.linfo.org/compiler.html
https://en.wikipedia.org/wiki/Statement_(computer_science)
http://www.codeproject.com/Articles/13896/OpenC-A-C-Metacompiler-and-Introspection-Library
https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form
https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Runtime+Libraries+and+Code+Generation+Targets