Um compilador completo para a linguagem C- (subconjunto da linguagem C) que realiza análise léxica, sintática, semântica e gera código binário executável.
Este projeto implementa um compilador completo para a linguagem C-, uma versão simplificada da linguagem C. O compilador foi desenvolvido como parte de um projeto acadêmico de Compiladores e realiza todas as fases de compilação:
- Análise Léxica - Tokenização do código fonte
- Análise Sintática - Construção da árvore sintática abstrata (AST)
- Análise Semântica - Verificação de tipos e construção da tabela de símbolos
- Geração de Código Intermediário - Código de três endereços (quadruplas)
- Geração de Assembly - Código assembly MIPS-like
- Geração de Código Binário - Instruções em formato binário
- Linguagem: C
- Ferramentas:
- Flex - Gerador de analisadores léxicos
- Bison - Gerador de analisadores sintáticos
- GCC - Compilador para construção do projeto
- Make - Automação da compilação
Compiladores/
├── main.c # Programa principal
├── lex.l # Especificação léxica (Flex)
├── parser.y # Gramática sintática (Bison)
├── globals.h # Definições globais e tipos
├── scan.h # Interface do analisador léxico
├── parser.h # Interface do analisador sintático
├── symtab.c/h # Tabela de símbolos
├── semantic.c/h # Análise semântica
├── intermediario.c/h # Geração de código intermediário
├── assembler.c/h # Geração de código assembly
├── binario.c/h # Geração de código binário
├── pilha.c/h # Estrutura de dados auxiliar
├── util.c/h # Funções utilitárias
├── Makefile # Script de compilação
├── entradas/ # Arquivos de teste
│ ├── gcd.txt # Algoritmo de Euclides
│ ├── sort.txt # Algoritmo de ordenação
│ └── teste.txt # Outros testes
├── saidas/ # Arquivos gerados
│ ├── arvore.txt # Árvore sintática
│ ├── assembly.txt # Código assembly
│ ├── binario.txt # Código binário
│ ├── intermediario.txt # Código intermediário
│ └── tabelaSimbolos.txt # Tabela de símbolos
└── sofs/ # Arquivos de simulação
- GCC (GNU Compiler Collection)
- Flex (Fast Lexical Analyzer Generator)
- Bison (GNU Parser Generator)
- Make
# Clone o repositório
git clone <url-do-repositorio>
cd Compiladores
# Compile o projeto
make all
# Comandos de limpeza
make clean # Remove arquivos de compilação (mantém saídas)
make clean-all # Remove tudo incluindo saídas
make rebuild # Limpa e recompila# Execute o compilador com um arquivo C-
./cmenos entradas/gcd.txt
# O compilador gerará automaticamente os seguintes arquivos:
# - saidas/arvore.txt (árvore sintática)
# - saidas/assembly.txt (código assembly)
# - saidas/binario.txt (código binário)
# - saidas/intermediario.txt (código intermediário)
# - saidas/tabelaSimbolos.txt (tabela de símbolos)# Compilar algoritmo de máximo divisor comum
./cmenos entradas/gcd.txt
# Compilar algoritmo de ordenação
./cmenos entradas/sort.txt
# Compilar programa personalizado
./cmenos meu_programa.c-A linguagem C- é um subconjunto da linguagem C com as seguintes características:
int- Números inteirosvoid- Tipo vazio (para funções)- Arrays de inteiros
int[]
if/else- Condicionaiswhile- Laços de repetiçãoreturn- Retorno de função
- Aritméticos:
+,-,*,/ - Relacionais:
==,!=,<,<=,>,>= - Atribuição:
=
input()- Leitura de entradaoutput(valor)- Saída de dados
/* Programa para calcular o MDC */
int gcd(int u, int v) {
if (v == 0)
return u;
else
return gcd(v, u - u/v*v);
}
void main(void) {
int x;
int y;
x = input();
y = input();
output(gcd(x, y));
}- Reconhece tokens da linguagem (palavras-chave, identificadores, números, operadores)
- Trata comentários e espaços em branco
- Gerencia contagem de linhas para relatório de erros
- Implementa a gramática da linguagem C-
- Constrói a árvore sintática abstrata (AST)
- Detecta erros de sintaxe
- Verifica compatibilidade de tipos
- Valida declarações e usos de variáveis
- Constrói e gerencia a tabela de símbolos
- Gera código de três endereços (quadruplas)
- Implementa otimizações básicas
- Gerencia alocação de registradores temporários
- Converte código intermediário para assembly MIPS-like
- Gerencia alocação de memória (global e local)
- Implementa convenções de chamada de função
- Converte instruções assembly para formato binário
- Suporta diferentes tipos de instrução (R, I, J)
- Gera arquivo binário executável
Representação textual da árvore sintática abstrata gerada pela análise sintática.
Lista de todos os símbolos (variáveis, funções) encontrados no programa com suas informações de escopo e tipo.
Código intermediário em formato de quadruplas (operação, arg1, arg2, resultado).
Código assembly MIPS-like gerado a partir do código intermediário.
Instruções em formato binário de 32 bits, prontas para execução.
O projeto inclui programas de teste na pasta entradas/:
gcd.txt- Implementa o algoritmo de Euclides para cálculo do MDCsort.txt- Algoritmo de ordenação por seleção para arraysteste.txt- Casos de teste diversos
Para manter o repositório limpo e não versionar arquivos desnecessários:
# Remove apenas arquivos de compilação (mantém as saídas exemplo)
make clean
# Remove tudo incluindo arquivos de saída
make clean-all
# Limpa e recompila
make rebuildVersionados (mantidos no git):
- Código fonte (
.c,.h,.l,.y) - Arquivos de entrada (
entradas/) - Arquivos de saída exemplo (
saidas/) - para demonstração - Documentação (
README.md)
Ignorados pelo git:
- Arquivos objeto (
*.o) - Executável (
cmenos) - Arquivos gerados pelo Flex/Bison (
lex.yy.c,parser.tab.*) - Arquivos temporários
- O compilador foi testado principalmente com os algoritmos GCD e Sort
- Algumas funcionalidades de assembly e binário podem estar incompletas para casos mais complexos
- A arquitetura alvo é baseada em MIPS mas com algumas adaptações
Bruno Kenji - BrunoKenji2
- Aho, A. V., Sethi, R., & Ullman, J. D. - Compilers: Principles, Techniques, and Tools
- Documentação do Flex e Bison
- Arquitetura MIPS
Nota: Para executar os programas gerados, você precisará de um simulador apropriado para a arquitetura alvo implementada no compilador.