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
“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
DSLs possuem features que são utilizadas apenas para um domínio específico, não permitindo reutilização de outras formas.
DSL x General-purpose language
DSLs são linguagens
O que diferencia DSLs e linguagens de propósito geral é a função, e não a forma.
if (x > 3.1) { print(x); }
Análise LexicaQuais são e o que significam os símbolos da linguagem?
if keyword
left parenthesis
identifier
operator gt
number
right parenthesis
left curly-braces
identifier
left parenthesis
identifier
right parenthesis
semicolon
right curly-braces
if (x > 3.1) { print(x); }
Análise LexicaQuais são e o que significam os símbolos da linguagem?
if keyword
left parenthesis
identifier
operator gt
number
right parenthesis
left curly-braces
identifier
left parenthesis
identifier
right parenthesis
semicolon
right curly-braces
function call
if-stmt
then-stmtcondition
binary op
Como os símbolos se organizam seguindo a sintaxe?
Análise Sintática
if (x > 3.1) { print(x); }
Análise Sintática Análise Semântica
if
xx 3.1float float float
boolean void
void
1 arg
O que significa cada nó da AST? Qual o tipo de cada expressão?
Análise Sintática
if
xx 3.1float float float
boolean void
void
1 arg
E qual o resultado disso tudo? Codegen
0122: ...0123: LOAD_VAR x0124: LOAD_FLOAT 3.10125: GT0126: JUMP_IF_FALSE 01290127: LOAD_VAR x0128: CALL print0129: ...
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)
Por que ANTLR 4
➔ Porque ele não é o ANTLR 3
➔ Facilidade
➔ Muito material online
➔ Compila para Java, C#, Python e Javascript
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.
Bibliografiahttps://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