Skip to content

This repository is about implementing a simple compiler using golang

Notifications You must be signed in to change notification settings

FelipeFelipeRenan/simple-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple Compiler

Este é um compilador simples desenvolvido em Go que traduz uma linguagem imperativa básica para LLVM IR, permitindo gerar executáveis reais utilizando llc e gcc. O projeto tem fins didáticos e demonstra de forma modular os principais estágios de um compilador: análise léxica, análise sintática, geração de AST e código intermediário.


🧠 Funcionalidades

  • ✅ Análise léxica com geração de tokens
  • ✅ Análise sintática e construção de AST
  • ✅ Geração de código LLVM IR
  • ✅ Integração com clang para gerar assembly e geração do arquivo executável
  • ✅ Execução opcional do binário
  • ✅ Suporte a int, void, func, while, return, print

📁 Estrutura do projeto

simple-compiler/
├── cmd/
│   └── main.go                      # Entrada principal do compilador
├── lexer/                           # Analisador léxico
├── parser/                          # Parser e AST
├── intermediate-code-generation/   # Gerador de LLVM IR
├── token/                           # Definição dos tokens
└── input.txt                        # Código de entrada exemplo

⚙️ Requisitos

  • Go 1.18 ou superior
  • LLVM com llc disponível no PATH
  • Clang na sua ultima versão

🚀 Como compilar e executar

Compilar e gerar executável (sem rodar):

go run cmd/main.go input.txt meu_programa

Compilar e executar:

go run cmd/main.go input.txt meu_programa --run

Somente compilar (gera binário como output por padrão):

go run cmd/main.go input.txt

Rodar utilizando a build do compilador

./gopher <mesmas opções acima>

💻 Exemplo de código fonte (input.txt)

func sum(int a, int b) int {
    return a + b
}

func main() void {
    int result = sum(2, -10)
    print(result)
}

📦 Saída

O compilador irá:

  1. Gerar arquivos .ll temporários
  2. Compilar o código em um binário com nome definido (ou output se não especificado)
  3. Opcionalmente, executar o binário se --run for fornecido

🛠️ Melhorias futuras

  • Suporte a estruturas condicionais (if, else)
  • Análise semântica completa
  • Tipos adicionais (bool, float, string)
  • Suporte a escopos e funções aninhadas
  • Otimizações no LLVM IR

About

This repository is about implementing a simple compiler using golang

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published