NECompiler

Na disciplina de Compiladores do período 2010.1 do Departamento de Informática da Universidade Federal da Paraíba ministrada pelo professor Clauirton Siebra, o projeto ao longo da cadeira foi fazer um compilador para algumas regras da linguagem Pascal.

Eu e Juracy Lucena Neto (juracylucena[at]gmail.com) fizemos uma API de um compilador onde os módulos (Léxico, Sintático e Semântico) ficassem independentes um do outro proporcionando assim a possibilidade da busca de um compilador ótimo para a disciplina: o melhor léxico, o melhor sintático e o melhor semântico da turma unidos em um único compilador sem esforços de entendimento entre os códigos.

A utilização da API é bem simples. O projeto foi feito utilizando o Netbeans e tem o nome: NECompilerAPI. Esse projeto contém interfaces que definem cada um dos módulos do compilador (léxico, sintático e semântico).

O esquema de um compilador pode ser visto acima. Desses módulos, os que utilizamos na disciplina são: Léxico, Sintático e Semântico.

Léxico: A função do léxico é separar o texto em tokens, classificar esses tokens de acordo com seu dicionário e criar a tabela léxico. Sua implementação foi utilizando autômatos. A arquitetura já tem implementado um autômato que pode ser utilizado (classe Automaton no pacote automaton). Para a criação desse autômato é necessário definir seus estados (classe AutomatonState no pacote automaton) e passar para seu construtor. Para definir os estados é necessário definir suas condições de transição entre um estado e outro. Para isso você terá que extender a classe abstrata AbstractCondition do pacote automaton. Para criar um léxico basta implementar a interface LexiconIF do pacote interfaces e lembre de chamar os métodos init() e end() quando o autômato inicia e termina, respectivamente, para que ele possa funcionar corretamente. O léxico tem um método chamado analyse() que recebe uma instância da classe TextFile do pacote util. Essa classe serve para manipular arquivos texto, crie uma instância no modo somente leitura (olhe os construtores) e utilize o método nextChar() para alimentar seu autômato.

Sintático: A função do sintático é analisar a tabela léxica e verificar se os tokens estão em uma sequência previamente definida em uma gramática. Para criar um sintático basta implementar a interface SyntacticIF do pacote interfaces. Ele tém um método chamado analyse() que recebe uma tabela léxica para ser analisada. A API já tem uma implementação dessa tabela (classe Table do pacote automaton), utilize-a.

Semântico: O semântico tem a função de analisar a coerência nos tipos das variáveis e seus escopos. Para a cadeira o semântico fica dentro do sinático, mas pode ser implementado separadamente através da interface SemanticIF do pacote interfaces. Quem fizer mande a contribuição que eu adiciono no svn. Uma instância desse módulo é passada para o sintático e é lá que as chamadas dos métodos são feitas para a análise semântica. Essa interface só tem suporte à verificação de escopo, a verificação de tipos não foi feita.

O projeto NECompiler contém uma interface gráfica que fizemos e também é algo que pode ser utilizado. Ela tem suporte a múltiplos compiladores, fazendo a identificação de cada um através da extensão do arquivo que ele suporta. Exemplo: *.pas -> compilador de Pascal, *.java -> compilador de Java, etc… Para fazer uso disso, a IG recebe como argumento no seu construtor um mapa [extensão, compilador]. Na classe Main do pacote necompiler tem um método chamado insertCompilers() e nele tem um exemplo de como inserir os compiladores.

A API do projeto pode ser baixada aqui (versão do trunk: 333) e deve ser inserida no seu projeto como uma biblioteca. A implementação pode ser feita de qualquer maneira, mas para possibilitar uma futura junção entre os projetos as interfaces: LexiconIF, SyntacticIF e SemanticIF devem ser implementadas.

A interface gráfica e o todo o código do nosso projeto (vale salientar que o código está todo comentado e com o Javadoc feito) podem ser encontrados no svn (trunk). Vou logo avisando, nos preocupamos em fazer a API e não tivemos tempo de fazer um bom projeto, por isso há algumas inconsistências, portanto não o copiem! Utilizem apenas a API.

Qualquer contribuição é bem vinda. Nos envie!


Produzido por Elenilson Vieira