Pergunta

Quais ferramentas estão lá para mim para construir um real, honesto a bondade DSL externo. E não, eu não estou falando de abusar Ruby, Boo, XML ou outro idioma ou sintaxe existente, quero dizer um DSL externo real -. A minha própria língua para minhas próprias finalidades

Eu sei que há uma linguagem de alguns bancadas sendo desenvolvido e eu já ouviu falar sobre coisas como "ironia" para .NET. E, claro, há ANTLR, Lex / Yaac, etc, mas eu tenho medo que aqueles são muito complicado para o que estou tentando fazer.

Por favor fale sobre uma ferramenta Construtor DSL você pode ter usado ou ouvido falar e suas impressões sobre como ele ajuda e quais as suas desvantagens são.

Foi útil?

Solução

Eu escrevi DSLs em Boo, Irony.NET e um kit de ferramentas chamado Grammatica. Você diz que um analisador-gerador é muito complicado, mas você pode estar sendo muito precipitado em seu julgamento, na verdade, eles são bastante simples de usar, uma vez que você começa sobre uma curva de aprendizado pequena, e abrir um vasto mundo de possibilidades que facilmente substitui o esforço. Achei aprender a notação necessário para gramáticas de escrita para a maioria dos geradores de analisador um pouco semelhante a aprender expressões regulares -. Você tem que dobrar sua mente apenas um pouco para deixá-los entrar, mas as recompensas são significativas

A minha opinião é esta: Se sua língua-alvo é simples o suficiente para que ele poderia ser tratado por um idiotizadas designer visual, em seguida, escrever uma gramática para ele usando um gerador de analisador deve ser bastante fácil.

Se o seu DSL-alvo é complicada o suficiente para que você precisa quebrar um suor escrevendo uma gramática, então o dumbed para baixo ferramenta visual não vai cortar a mostarda de qualquer maneira e você vai acabar tendo que aprender a escrever uma gramática de qualquer maneira .

Eu concordo em longo prazo sobre interna vs externo DSL de, apesar de tudo. Eu escrevi uma DSL interna em Boo e teve que modificar o meu sintaxe DSL para fazer o trabalho, e ele sempre me senti como um hack. A mesma gramática usando Irony.NET ou ANTLR teria sido tão fácil de realizar com mais flexibilidade.

Eu tenho um blog discutir algumas opções. O post é centrado em torno escrevendo uma DSL para avaliação da expressão de tempo de execução, mas as ferramentas são todos iguais.

A minha experiência com Irony.NET tem sido todos positivos, e há vários língua de referência implementado usando ele, que é um bom lugar para começar. Se a sua linguagem é simples, é absolutamente não é complicado para se levantar e correr. Há também uma biblioteca no CodeProject chamado TinyParser - este é realmente interessante, porque gera o analisador como código-fonte pura, o que significa que seu produto final é completamente livre de qualquer referência de terceiros. Eu não usei isso mesmo, no entanto.

Outras dicas

Se você está olhando para escrever DSLs stand-alone, então você está olhando para a construção de compiladores - nenhuma maneira em torno dela. construção de compiladores é conhecimento de programação essencial, e não é realmente tão difícil como se imagina. Righ programador Alimentos de Steve Yegge resume o valor de saber como para compiladores de compilação muito bem.

Existem muitas maneiras de começar. Eu recomendo verificar os 2 documentos mencionados no artigo: Quer escrever um compilador? Basta ler estes dois papéis . O primeiro, Vamos construir um compilador , é muito acessível. Ele usa Turbo Pascal como uma linguagem de implementação, mas você pode facilmente implementá-lo em qualquer outra língua - o código-fonte é muito clara. Pascal é uma linguagem simples.

Depois de conseguir uma boa idéia de como as coisas funcionam e a terminologia envolvida, eu recomendo aprofundar em algo como ANTLR . ANTLR tem um IDE bom, ANTLRWorks , que vem com um intérprete e um depurador. Também produz realmente muito bons visualizações de suas gramáticas na mosca. Eu achei inestimável na aprendizagem.

ANTLR tem vários tutoriais bons, embora possam ser um pouco esmagadora na primeira. Este é agradável, embora seja contra ANTLR 2.0, de modo que você pode correr em incompatibilidades com uma versão mais recente (atualmente o mais recente é 3.1).

Finalmente, há uma outra abordagem para DSLs: A abordagem Lisp. Dado do Lisp natureza sintaxe-less (seu código é árvores de sintaxe basicamente abstratas), você pode moldar línguas intermináveis ??fora dele, desde que você se acostumar com os parênteses:.)

Se você vai com essa abordagem, você quiser usar um Lisp embutido. Sob Java, você tem Clojure , um dialeto Lisp que interage perfeitamente com JVM e suas bibliotecas. Eu não usei pessoalmente, mas parece bom. Para Scheme, há GNU Guile , que é licenciado sob a LGPL . Para Lisp comum, há ECL , também sob a LGPL. Tanto o uso de uma interface C para a interoperabilidade, de modo que você pode muito bem incorporá-los em qualquer outra língua. ECL é único entre Lisps em que cada função Lisp é implementado como uma função C, assim você pode escrever código Lisp em C, se você quiser (digamos, dentro de seus próprios métodos extensões - você pode criar funções C que operam em Lisp objetos, e, em seguida, chamá-los de Lisp). Eu tenho usado ECL para um projeto paralelo da mina por um tempo, e eu como ele. O mantenedor é bastante ativo e receptivo.

Você realmente deve verificar para fora Ragel . É um quadro para máquinas de estado incorporar em seu código-fonte regular. Ragel suporta C, C ++, Objective-C, D, Java e Ruby.

grande de Ragel para escrever analisadores de arquivo e protocolo, bem como percorrendo coisas DSL externo. Principalmente porque ele permite que você execute qualquer tipo de código em transições de estado e tal.

Um par de projectos notáveis ??que usam Ragel são, Mongrel , um grande servidor ruby ??web. E Hpricot , um html-analisador com base rubi, espécie de inspirado pelo jQuery.

Outra grande característica do Ragel é como ele pode gerar GraphViz baseados em gráficos que visualizam suas máquinas de estado. Abaixo está um exemplo tirado Zed Shaw artigo sobre ragel gráficos de estado .

ragel estado gráfico

Xtext foi construído para isso.

A partir do site:

Xtext é um framework para desenvolvimento de linguagens de programação e linguagens específicas de domínio.

Ele cobre todos os aspectos de uma infra-estrutura de linguagem completa, a partir de analisadores, acima de ligante, compilador ou interpretador para totalmente fundido de alto nível integração Eclipse IDE. Ele vem com bons padrões para todos estes aspectos e, ao mesmo tempo todos os aspectos podem ser adaptados para suas necessidades.

Estou usando ironia com bons resultados. A grande parte sobre ironia é que você pode facilmente incluí-lo em qualquer tempo de execução que você estará usando o DSL para. Estou criando um DSL externo que eu preencher em um modelo semântico escrito em C # para a ironia é grande. Então eu uso o modelo semântico para gerar código com StringTemplate.

Se você está planejando implementar um DSLs externas, Spoofax ( http://strategoxt.org/Spoofax ) é um bom Workbench Idioma para fazer isso. É um texto baseado em analisador Langauge Workbench que a alavancagem vários tecnologia state-of-art, como SDF, Stratego. Além da implemenation DSL, você pode obter uma rica serviços de edição, como, conclusão de código, vista de destaques, intellisense etc Ela tem sido usada para construir várias línguas por exemplo http://mobl-lang.org/ . Verificar isso para ter uma idéia sobre o apoio prestado.

projeto Spoofax vem com um out-of-the caixa agradável implementação de exemplo DSL e um gerador de código java. Ele pode funcionar como um ponto de partida para começar com as ferramentas.

A seguir detalhes tutorial sobre o uso deste bancada langauge: http://strategoxt.org/Spoofax/Tour.

Espero que ajude!

Para DSLs externas graves, você não pode evitar o problema ao analisar; ANTLR é a menos do que você precisa. O que você quer fazer é verificar sistemas de transformação do programa, que podem ser usados ??para mapear a sintaxe DSL arbitrário em idiomas de destino, como Java.

Consulte http://en.wikipedia.org/wiki/Program_transformation

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top