/trabalho-compiladores

Trabalho - desenvolvimento compilador Java (2019)

Primary LanguageJava

O que é? · Iniciando o Programa · Requisitos · Primeiros Passos · Comandos Úteis · Como Contribuir

📋 O que é?

O analisador léxico e sintático é um projeto desenvolvido na linguagem de programação Java pelos alunos André Arantes, Livia Granato e Victor Pereira para a disciplina de Compiladores do curso de Engenharia da Computação da Universidade Federal de Itajubá. A partir de uma linguagem criada e especificada totalmente pelos alunos, o projeto tem por objetivo verificar uma implementação correta do código avaliando em dois critérios: Avaliação Léxica e Avaliação Sintática.

Iniciando o Programa

Ao executar o projeto e inserir um código na entrada, especifique um tipo de análise e realize o processo de compilação (através do botão COMPILAR).

A interface criada (tentamos tornar o mais similar a uma IDE) denominada Codekit será responsável por exibir os retornos e resultados da análise para o código na saída, assim como apresentar possíveis erros durante a escrita.

📖 Requisitos

Para execução do programa, é necessário ter o ambiente Netbeans IDE instalado no computador (recomenda-se a v8.0.1), Java JDK devidamente instalado, além das bibliotecas Java-Cup-11a.jar, Java_Cup.jar e JFlex.jar que estão disponíveis dentro do projeto.

🎉 Primeiros Passos

Para programar na linguagem "VAL", disponibilizamos o arquivo Linguagens_Formais.pdf onde especificamos todos os tokens que poderão ser utilizados, além de demonstrar também os compiladores acionados por eles durante o processo de compilação.

Como Utilizar Corretamente as Bibliotecas O projeto possuirá alguns arquivos principais para gerar uma linguagem: Lexer.flex, Parser.cup, Token.java, Sym.java e Yylex.java.

Obs: Alguns desses arquivos são gerados automaticamente após o processo de execução da main no projeto

  1. Lexer.flex
  2. É responsável por criar os lexemes, ou seja, as entradas para o compilador. Sendo assim, nele especificaremos tudo que estiver relacionado aos nossos tokens de entrada (como exemplo, uma int main() em C, se torna MAIN /MAIN em VAL). Sendo assim, especificaremos todos os nossos returns baseados em como esses tokens serão chamados na linguagem, além dos tipos de variáveis que iremos trabalhar (inteiro, digito, real, booleano, string e outros).
  3. MainLex.java | MainSint.java
  4. São responsáveis por criar os arquivos auxiliares a serem utilizados no código. Como exemplo, ao executar a MainLex.java, obteremos o arquivo Lexer.java, necessário para a verificação dos tokens por nossa interface.
  5. Token.java
  6. O arquivo gerado tokens.java é responsável por manter o identificador de todos os tokens da nossa linguagem.
  7. Parser.cup
  8. É o principal arquivo responsável por verificar o código sintaticamente. Para isso, define-se quais identificadores serão terminais e não-terminais, uma vez será realizada a derivação do código até obtermos os identificadores iniciais, de forma que o compilador possa interpretar o código inserido.
  9. Sym.java
  10. Contém todos os símbolos terminais como tokens servindo como auxiliar do Yylex.java.
  11. Yylex.java
  12. Por fim, o Yylex.java será o arquivo responsável por gerar os retornos para a interface dos resultados obtidos a partir da análise sintática, tomando como base os tokens especificados e como as estruturas deverão ser montadas. Por exemplo, sabemos que uma função principal deve ser precedida por um conjunto de operações dentro dela. Caso esse critério não seja cumprido, obteremos um erro sintático do código.

Comandos Úteis

  1. Comando para compilar o Parser.cup:

java -jar local_da_biblioteca/.../java-cup-11a.jar -parser Parser -symbols Sym Parser.cup

👏 Como Contribuir

O principal propósito deste repositório e agregar conhecimento e auxiliar no processo de aprendizagem acadêmica de como funciona um compilador na prática, além de ajudar no processo de criação de novas linguagens a partir das bibliotecas mencionadas. Sabemos que ainda existem recursos a serem melhorados (como exemplo, realizar a análise semântica do código) e aceitaremos commit's externos nas próximas versões para possíveis melhorias no código.