Pergunta

Será que não existe um analisador que gera uma AST / árvore de análise em tempo de execução? Como uma espécie de biblioteca que aceitaria uma série de EBNF gramática ou algo análogo e cuspir uma estrutura de dados?

  • Eu estou ciente de antlr, jlex e sua laia. Eles gerar código-fonte que poderia fazer isso. (Como pular a etapa de compilação)
  • Eu estou ciente de boost :: Espírito, que usa alguma magia negra com a sintaxe do C ++ para gerar tais coisas em tempo de execução (definitivamente muito mais próximo do que eu quero, mas eu sou um covarde quando se trata de C ++. E ele ainda está um pouco limitante, porque sua gramática é codificado)
  • Eu não estou ciente de qualquer coisa em python ou ruby, embora um compilador compilador pode muito bem ser eficaz em tal linguagem um ...

Agora eu estou ciente de combinadores analisador. (obrigado, Jonas) e algumas bibliotecas (graças eliben)

aliás, eu também notei Analisando ultimamente, o que soa fresco foram alguém para implementá-lo (eles dizem Perl 6 terá, mas Perl escapa a minha compreensão)

Foi útil?

Solução

Dê uma olhada analisador combinators que eu acho que pode ajudá-lo. É possível fazer analisadores em tempo de execução usando esta técnica. Um combinator analisador popular é Parsec que usos Haskell como sua língua host. Do parsec documentação :

analisadores

Combinator são escritos e utilizados dentro de uma mesma linguagem de programação como o resto do programa. Não há diferença entre o formalismo gramática (Yacc) ea linguagem de programação real usado (C)

Analisadores são valores de primeira classe dentro da linguagem. Eles podem ser colocados em listas, passados ??como parâmetros e retornados como valores. É fácil estender o conjunto disponível de analisadores com custom made analisadores específicos para um determinado problema

Se você estiver usando .NET dar uma olhada na analisador biblioteca combinator para F # .

Outras dicas

Se o Java é melhor para você, há uma porta da biblioteca Haskell Parsec - JParsec . Muito poderoso, embora a documentação não é grande.

Você pode forçá-lo a fazer uma frente lex fase depois de análise, mas você pode fazer algumas coisas interessantes com lexing dinâmico e gramáticas dinâmicas.

Cabeça torção coisas.

Porque é tudo em Java (o analisador é um POJO), você pode refatorar, e fazer TDD, e tudo o que você está acostumado a fazer em Java. Esta é uma grande vantagem para a / JavaCC abordagem mais tradicional ANTLR / JJTree.

Lambda the Ultimate discutido um analisador que permite sintaxe extensões .

Eu estou projetando escrevendo um compilador que iria permitir extensões de sintaxe (algum tipo de metaprogramming em tempo de compilação). Eu não quero ter um sistema muito poderoso, então eu pensei sobre apenas ter:

{syntax: while (condition) do code}
while (condition, code) => // actual execution

e substituir cada padrão que corresponde a sintaxe com uma chamada para a função. No entanto, eu não sei por onde começar para obter o lexer e analisador em execução, porque as ferramentas habituais, tais como Flex / Bison ou ANTLR (eu gostaria de escrever o compilador em C #) não parecem permitir isso.

Você poderia me fornecer qualquer orientação sobre onde ir em seguida? Também li que Scheme ou Haskell poderia ser melhor línguas para alcançar esta tarefa. E, claro, estou aberto a qualquer sugestão sobre a idéia real para implementá-las.

Sim, claro!

Em todas as linguagens dinâmicas, isso é muito simples de conseguir, porque o código pode ser facilmente gerados e avaliados em tempo de execução. Vou recomendar duas alternativas:

  • Em Perl, use Parse :: RecDescent. Leva sua gramática de uma string, e você definitivamente pode pedi-lo para gerar um novo analisador de uma nova cadeia em tempo de execução.
  • Em Python, considere PLY. Você pode facilmente gerar as funções com docstrings em tempo de execução e PLY rodar nele.

Eu, pessoalmente, recomendo a opção Python, embora possa não ser relevante se você sabe Perl, mas não Python.

Para completar, devo observar que você pode fazê-lo com Lex & Yacc bem, mas é peludo. Você vai ter que gerar um arquivo Lex / Yacc da sua gramática em tempo de execução, compilar em C, compilação que em um lib compartilhada e carregá-lo em tempo de execução. Isso soa como ficção científica, mas algumas ferramentas realmente fazer isso para as necessidades complexas de eficiência e dinamicidade.

Boa sorte.

JFlex , a extensão JLex Java, permite que você execute a compilação tempo, mas é coisa muito peludo.

O que você está indo para analisar? Em C ou C ++, você não terá um analisador em tempo de execução, portanto, ele não está disponível sem uma biblioteca adicional. Para muitas linguagens de programação isso é verdade embora.

Todos os analisadores são de 'dinâmica' default quando você implementá-las. Mesmo em C.

Se o idioma que você está indo para analisar é a sua própria: escrever analisadores é uma coisa para aprender por conta própria. Mesmo com geradores de analisador é uma obra em si. Depois de ter aprendido isso, porém, ele vai se tornar muito simples embora. truques especiais como sintaxe recuado ainda será embora complicado, e você vai exigir testes boas e extensas para ver que o analisador faz o que quiser. Eu escrevi um analisador então eu sei.

[Dropincc.java] http://pfmiles.github.com/blog/dropincc-dot-java-the-ultimate-tool-to-create-dsls-in-java/ "Dropincc.java é gerador de analisador dinâmico em java puro".

Isso permite que você defina regras gramaticais em linguagem de programação Java e sem notações adicionais precisam aprender. Nenhuma outra necessidade ferramenta de linha de comando para usar. Você poderia definir, compilação e 'eval' seu idioma recém-definido em java puro.

Confira no link lá para obter mais informações.

[home page dos projetos] https://github.com/pfmiles/dropincc.java

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