UNIVERSIDADE FEDERAL DE SÃO CARLOS
Centro de Ciências Exatas e de Tecnologia
Construção de Compiladores 2 - Semestre 2016/2
Prof. Dr. Daniel Lucrédio e Prof.ª Dr.ª Helena Caseli
Este trabalho consiste na implementação de um compilador para a linguagem LA. O mesmo deverá, portanto, ser capaz de realizar análise léxica, sintática e semântica da linguagem. O compilador deverá ainda, quando códigos escritos em linguagem LA estiverem corretos, realizar geração de código em linguagem C, para que os programas possam ser executados.
A análise léxica e sintática deve ser feita de acordo com a especificação da gramática. Com relação à análise semântica, o compilador desenvolvido neste trabalho deve ser capaz de identificar os seguintes erros:
- Identificador já declarado anteriormente no escopo
- Tipo não declarado
- Identificador não declarado
- Incompatibilidade entre argumentos e parâmetros formais (número, ordem e tipo) nas chamadas de procedimentos e funções
- Atribuição não compatível com o tipo declarado
- Uso do comando retorne em um escopo não permitido
Como ferramenta de auxílio, utilizamos o gerador automático ANTLR (ANother Tool for Language Recognition) versão 4.5.3 [http://www.antlr.org].
O compilador foi escrito em Java e, como ambiente de desenvolvimento, utilizamos o IntelliJ IDEA 2016.3 versão Ultimate. O projeto foi testado também na versão Community do IntelliJ e também no NetBeans 8.1. Como sistema operacional, foi utilizado o macOS Sierra, mas testes também foram realizados no Ubuntu.
O processo de instalação e configuração das ferramentas necessárias difere de acordo com o sistema operacional. A seguir, temos as instruções para macOS Sierra e Ubuntu (versões 12 ou superiores):
Com os comandos a seguir, é possível instalar o ANTLR 4.5.3. Para que o projeto funcione corretamente, é necessário ainda colocar o caminho do ANTLR no CLASSPATH
do sistema.
$ cd /usr/local/lib
$ sudo curl -O http://www.antlr.org/download/antlr-4.5.3-complete.jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.5.3-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.5.3-complete.jar'
Os arquivos incluídos neste projeto já contam com o parser da gramática gerado pelo ANTLR. Entretanto, na necessidade de realizar alterações na gramática e gerar novamente o parser, a maneira mais simples de realizar isso é instalando o plugin ANTLR Works no IntelliJ IDEA. Além de permitir a geração fácil do parser a partir do arquivo da gramática, o plugin adiciona syntax highlighting aos arquivos de gramáticas (arquivos com extensão .g4) e configura o ambiente para ter suporte a importações de bibliotecas do ANTLR. O plugin permite ainda gerar árvores de análise e é capaz de verificar existência de ambiguidade na gramática, o que ajuda muito no desenvolvimento. Para instalar o plugin:
- Abra o IntelliJ IDEA
- No macOS Sierra: entre no menu IntelliJ IDEA
▶️ Preferences...▶️ seção Plugins▶️ Browse repositories... - No Ubuntu: entre no menu File
▶️ Settings▶️ seção Plugins▶️ Browse repositories... - Procure pelos plugins ANTLR v4 grammar plugin e ANTLR Works e instale-os
- Reinicie o IntelliJ IDEA
As opções de geração de parsers para a gramática ficam no menu Tools do IntelliJ, entretanto, as mesmas só aparecem quando um arquivo .g4 está aberto. Para o contexto do nosso compilador, é necessário apenas a geração do Visitor. O Listener não é necessário. Para configurar o ANTLR para não gerar arquivos desnecessários ao projeto, basta ir em Tools
Por padrão, construir um projeto no IntelliJ não gera automaticamente o arquivo .jar como acontece no NetBeans. É necessário configurar o IntelliJ para criar um artefato JAR. Para fazer isso:
- Abra o IntelliJ IDEA
- Abra o projeto em File
▶️ Open... - Entre no menu File
▶️ Project Structure... - Na seção Project Settings, clique em Artifacts
- Clique no botão "+", em seguida escolha a opção "JAR" e por fim escolha "From module with dependencies..."
- Na caixa de diálogo apresentada, no campo Main Class, clique no botão "..." e escolha a classe Main (ufscar.compiladores2.t1)
- Ainda na caixa de diálogo, na seção "JAR files from libraries", selecione "extract to the target JAR" e clique em OK
- Selecione o artefato criado e na opção Class Path coloque:
/usr/local/lib/antlr-4.5.3-complete.jar
- Opcional: inclua a construção do artefato durante a construção do projeto selecionado a opção "Include in project build" e selecione o local em que o IntelliJ deverá colocar o arquivo .jar na opção "Output directory"
- Clique em OK
Com o projeto aberto, construa-o indo no menu Build /out/artifacts/T1_CC2_IntelliJ/
dentro da pasta do projeto. Caso tenha alterado o caminho no passo 9 anteriormente, o arquivo deve estar na pasta especificada.
Caso o passo 9 da etapa anterior não tenha sido executado, é necessário gerar o arquivo .jar manualmente. Isso é feito indo no menu Build
Após compilar o projeto, o arquivo T1_CC2_IntelliJ.jar será gerado. Este arquivo é o nosso compilador. Utilizá-lo é bem simples. O programa aceita dois parâmetros do tipo String
, sendo o primeiro o arquivo de entrada, que deve conter um programa escrito em linguagem LA; e o segundo o nome do arquivo de saída. Neste arquivo de saída, o compilador colocará:
- o código C gerado pelo compilador, caso o programa escrito em linguagem LA não tenha erros; ou
- um reporte de erros sintáticos ou semânticos encontrados no arquivo de entrada.
Supondo que você já esteja em uma sessão do terminal no diretório que contém os arquivos, o computador esteja com Java 8 instalado e o ANTLR esteja instalado e configurado, segue um exemplo de utilização do compilador:
$ java -jar T1_CC2_IntelliJ.jar arquivo_de_entrada.la arquivo_de_saida.c