Iniciarei neste post uma serie que falara sobre um assunto que ja existe a muito tempo, porem recentemente ganhou mais evidencia: Linguagens de Dominio Especifico, tambem conhecidas como DSL (Domain Specific Languages).Farei uma introducao sobre as DSLs, depois mostrarei uma ferramenta para auxiliar na criacao de linguagens e por fim um estudo de caso colocando em pratica todo o conhecimento.Este post foi construido com base em um trabalho de pos graduacao, feito por mim em parceria com Elson Travassos, que eventualmente tambem escreve no meu blog "Do Windows ao Linux"DSL - Domain Specific LanguagesNo mundo da computacao, linguagens de programacao existem para permitir que as pessoas escrevam programas que sejam compreensiveis pelas maquinas. Estas linguagens podem ser divididas em dois grandes blocos: linguagens de proposito generico e as linguagens de dominio especifico.As linguagens de proposito generico oferecem ao programador um conjunto de elementos, como operadores, abstracoes, variaveis, etc, que permitem a ele construir programas que resolvem uma grande variedade de problemas (AABY, 2004). Elas nao focam em um dominio especifico do conhecimento. Exemplos deste tipo de linguagem sao C, Java, Ruby, etc.Ao contrario das linguagens de proposito generico, existem as linguagens de dominio especifico (DSL). Elas sao criadas dentro de um contexto para resolver um conjunto especifico de problemas (FOWLER, 2006), e tendem a ser mais naturais e proximas da linguagem humana, facilitando a manutencao de seus codigos (PARR, 2007). Muitas linguagens utilizadas hoje em dia sao na verdade DSL. Alguns exemplos sao as macros de planilhas eletronicas, SQL para fazer consultas a bancos de dados, CSS para definir estilos de formatacao em HTML, arquivos de configuracoes de aplicacoes como Apache, Struts, dentre diversas outras.As DSLs podem ainda serem divididas em dois subgrupos: internas e externas. DSLs internas sao formas que o programador possui de reescrever um determinado trecho de codigo, utilizando a mesma linguagem original, mas que esta fique de maneira mais legivel (fluente) para um determinado proposito (FOWLER, 2006). Linguagens dinamicas, normalmente as de script, sao mais suscetiveis a notacoes mais fluentes, que exijam menos texto digitado. No entanto, e possivel se beneficiar das vantagens de uma DSL interna mesmo em linguagens estruturadas como o Java (RUIZ, 2008).Ja as DSLs externas sao de verdade uma linguagem. Elas possuem uma sintaxe propria e precisam de um interpretador para analisar o codigo e executar os comandos. Assim como as linguagens tradicionais, as DSLs externas podem ser interpretadas e executadas de imediato ou podem ser convertidas para outra linguagem (normalmente de proposito generico) que entao sera executada.O ANTLRPara se criar uma DSL interna (ou simplesmente DSL), e necessario criar as regras de definicao de uma linguagem. Deve-se definir seus atomos, criar suas regras sintaticas e semanticas alem de implementar seu analisador (comumente chamado de parser). Este ultimo e o responsavel por, de posse de um codigo fonte escrito na linguagem em questao, analise sua sintaxe verificando por erros de escrita, sua semantica e por fim transforme este codigo em algo que possa ser executado (AHO, 2007). Implementar o codigo que executa todas estas tarefas, por mais simples que a DSL seja, nao e