Pergunta

Eu preciso escrever um compilador. É dever de casa na univ. O professor nos disse que podemos usar qualquer API que queremos fazer a análise do código, desde que ele é uma boa. Dessa forma, podemos nos concentrar mais na JVM que vai gerar.

Então, sim, eu vou escrever um compilador em Java para gerar Java.

Você conhece alguma boa API para isso? Devo usar regex? I normalmente escrever minhas próprias analisadores à mão, embora não é aconselhável neste cenário.

Qualquer ajuda seria apreciada.

Foi útil?

Solução

Regex é bom para utilização num compilador, mas somente para o reconhecimento de fichas (isto é, não há estruturas recursivas).

O modo clássico de escrever um compilador está a ter uma lexical analisador para fichas que reconhecem, um sintaxe analisador para o reconhecimento de estrutura, uma semântica analisador para o reconhecimento de significado, um código intermediário gerador , um otimizador , e por último um código alvo gerador . Qualquer uma dessas etapas pode ser incorporada, ou ignorado totalmente, se torna o compilador mais fácil de escrever.

Houve muitas ferramentas desenvolvidas para ajudar com este processo. Para Java, você pode olhar para

Outras dicas

Eu recomendaria ANTLR , principalmente por causa de sua capacidade de geração de saída via StringTemplate.

O que é melhor é que livro de Terence Parr no mesmo é de longe um dos melhores livros orientados para escrever compiladores com um gerador de analisador.

Então você tem ANTLRWorks que lhe permite estudar e depurar sua gramática na mosca.

Para cima de tudo, o ANTLR wiki + documentação , (embora não seja abrangente o suficiente para o meu gosto), é um bom lugar para começar para qualquer iniciante. Ele me ajudou a atualizar o conhecimento sobre a escrita do compilador em uma semana.

Tenha um olhar em JavaCC , um analisador de linguagem para Java. É muito fácil de usar e pegar o jeito

Vá clássica - Lex + Yacc. Em Java soletra JAX e javacc . Javacc tem mesmo alguns Java gramáticas pronto para a inspeção.

Eu recomendo usando uma metacompiler como ANTLR , ou um simples analisador combinator biblioteca. Java funcional tem um analisador combinator API . Há também JParsec é. Ambos são baseados em a biblioteca Parsec para Haskell .

JFlex é um scanner de gerador que, de acordo com o manual do , é projetado para trabalhar com o gerador de analisador CUP .

Um dos principais objetivos do projeto de JFlex era fazer interface com o Java CUP gerador de analisador livre tão fácil como possivelmente [sic].

Ele também tem apoiar para byacc / J, que, como o próprio nome sugere, é uma porta de Berkeley YACC para gerar o código Java.

Eu tenho usado si JFlex e gostei. Howeveer, o projeto que eu estava fazendo era simples o suficiente para que eu escrevi o analisador à mão, então eu não sei o quão bom seja CUP ou byacc / J é.

Eu usei SableCC no meu curso compilador, embora não por escolha.

Lembro-me achando muito volumoso e pesado, com mais ênfase na limpeza de conveniência. (Sem precedência do operador ou qualquer coisa, você tem que estado que na gramática)

Eu provavelmente vai querer usar outra coisa se eu tivesse a escolha. Minhas experiências com yacc (para C) e feliz (para Haskell) têm ambos sido agradável.

combinadores analisador é uma boa escolha. implementação Java popular é JParsec.

Se você estiver indo para ir incondicional, jogar em um pouco de http://llvm.org na misturar:)

Eu sugiro que você olhar para a fonte de BeanShell. Ele tem um compilador para Java e é bastante simples de ler.

Use um combinator analisador, como JParsec . Há um bom vídeo tutorial sobre como usá-lo .

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