| Recurso | Link |
|---|---|
| 📦 Repositório | github.com/viniciusbtech/Compilador_python_ |
| 🌐 Aplicação | Não possui aplicação web hospedada |
| 🎥 Vídeo | Adicionar link do vídeo |
O Compilador JSS é um projeto acadêmico que implementa um compilador para uma versão simplificada da linguagem JavaScript, chamada JavaScript Simplificado — JSS.
O compilador recebe um arquivo com a extensão .jss, realiza as etapas de análise léxica, sintática e semântica, constrói uma Árvore Sintática Abstrata — AST, gera código intermediário LLVM e utiliza o Clang para produzir um arquivo executável.
O fluxo principal de compilação é:
Arquivo .jss
↓
Análise léxica
↓
Lista de tokens
↓
Análise sintática com ANTLR4
↓
Construção da AST
↓
Análise semântica e tabela de símbolos
↓
Geração de código LLVM IR
↓
Compilação com Clang
↓
Arquivo executável
O projeto foi desenvolvido com foco no estudo prático das principais etapas envolvidas na construção de compiladores.
| Tecnologia | Utilização |
|---|---|
| Python 3.11+ | Implementação das etapas do compilador e da interface de linha de comando |
| ANTLR4 | Geração do parser a partir da gramática formal da linguagem JSS |
| ANTLR4 Python Runtime | Execução do parser gerado dentro da aplicação Python |
| llvmlite | Construção e geração do código intermediário LLVM IR |
| LLVM IR | Representação intermediária utilizada antes da geração do executável |
| Clang | Conversão do arquivo .ll em um programa executável |
| argparse | Processamento dos argumentos informados na linha de comando |
| Tecnologia | Utilização |
|---|---|
| Pytest | Execução dos testes automatizados |
| Testes de lexer | Validação da identificação de tokens e erros léxicos |
| Testes de parser | Validação da estrutura sintática dos programas |
| Testes semânticos | Verificação de tipos, escopos e regras da linguagem |
| Testes de execução | Validação dos programas compilados |
| Smoke tests | Verificação básica do funcionamento integrado do compilador |
| Tecnologia | Utilização |
|---|---|
| Git | Controle de versão do código |
| GitHub | Hospedagem e organização do repositório |
| PowerShell | Automação da compilação e execução dos exemplos no Windows |
| Ambiente virtual Python | Isolamento das dependências do projeto |
Não se aplica. O projeto não possui interface gráfica ou aplicação web. A interação acontece por meio do terminal.
Não existe um backend web ou uma API. O núcleo do compilador é executado localmente por meio dos módulos Python.
O projeto não utiliza banco de dados.
O projeto não possui deploy em servidor. O processo de build acontece localmente, gerando arquivos LLVM IR e executáveis por meio do Clang.
- Leitura de arquivos-fonte com extensão
.jss. - Lexer manual desenvolvido em Python.
- Identificação de tokens com linha e coluna.
- Tratamento de erros léxicos com mensagens específicas.
- Parser gerado pelo ANTLR4.
- Gramática formal definida no arquivo
JSS.g4. - Construção de uma Árvore Sintática Abstrata — AST.
- Criação e gerenciamento de tabela de símbolos.
- Análise semântica de variáveis, funções, classes e expressões.
- Validação de tipos e escopos.
- Detecção do uso incorreto de identificadores.
- Suporte a variáveis com
let. - Suporte a constantes com
const. - Suporte aos tipos
int,real,strebool. - Suporte ao valor
null. - Suporte a vetores e matrizes.
- Suporte a estruturas condicionais
ifeelse. - Suporte aos laços
whileefor. - Suporte aos comandos
breakereturn. - Suporte à declaração e chamada de funções.
- Suporte a classes, atributos, métodos e construtores.
- Suporte às palavras-chave
newethis. - Suporte a entrada de dados com
input. - Suporte à saída de dados com
console.log. - Suporte a conversões explícitas entre tipos.
- Suporte a operadores aritméticos, relacionais e lógicos.
- Suporte a operadores de atribuição composta.
- Suporte aos operadores de incremento e decremento.
- Suporte ao operador de exponenciação
**. - Geração de código intermediário LLVM IR.
- Geração de executáveis utilizando o Clang.
- Modo de build sem execução.
- Modo de build seguido de execução automática.
- Definição personalizada do caminho do executável.
- Testes automatizados com Pytest.
- Exemplos práticos organizados por funcionalidade.
O projeto não possui uma interface gráfica e, portanto, não utiliza atalhos de teclado próprios.
A interação acontece por meio de argumentos da linha de comando:
| Comando | Função |
|---|---|
--build |
Gera o arquivo LLVM IR e o executável sem executar o programa |
--run |
Gera o LLVM IR, cria o executável e executa o programa |
-o ou --output |
Define o caminho e o nome do executável de saída |
-h ou --help |
Exibe a ajuda da interface de linha de comando |
Exemplo:
python main.py --helpCaso seja criada uma interface gráfica ou extensão para editor, poderão ser adicionados os seguintes atalhos:
| Atalho sugerido | Ação |
|---|---|
Ctrl + B |
Compilar o arquivo atual |
Ctrl + R |
Compilar e executar |
Ctrl + Shift + T |
Executar os testes |
Ctrl + L |
Limpar o terminal |
F5 |
Executar o programa JSS |
F6 |
Exibir o LLVM IR gerado |
A primeira etapa foi definir o escopo da linguagem JavaScript Simplificado, incluindo seus tipos primitivos, operadores, declarações, estruturas de controle, funções, vetores e orientação a objetos.
Também foi planejado o pipeline completo do compilador:
Lexer → Parser → AST → Analisador semântico → LLVM IR → Executável
O desenvolvimento foi dividido em módulos com responsabilidades específicas:
- O lexer identifica os elementos presentes no código-fonte.
- A ponte de tokens converte os tokens internos para o formato utilizado pelo ANTLR.
- O parser verifica se o código segue a gramática da linguagem.
- O AST Builder transforma a árvore gerada pelo ANTLR em uma AST própria.
- O analisador semântico valida tipos, escopos e declarações.
- O gerador LLVM converte a AST validada em código intermediário.
- A CLI organiza o processo de compilação e execução.
Os testes automatizados foram desenvolvidos com Pytest e organizados por responsabilidade:
tests/
├── test_erros_execucao.py
├── test_lexer.py
├── test_lexer_bateria.py
├── test_parser.py
├── test_parser_semicolon_locations.py
├── test_semantic.py
└── test_smoke.py
Além dos testes automatizados, o diretório examples contém programas destinados à validação de:
- Declarações básicas.
- Operadores.
- Estruturas de controle.
- Strings e conversões.
- Classes.
- Funções.
O código foi versionado com Git e armazenado no GitHub. A organização modular permite acompanhar as alterações de cada etapa do compilador e facilita a identificação de regressões.
A revisão foi realizada por meio da execução dos testes automatizados, da compilação dos arquivos de exemplo e da análise das mensagens de erro produzidas pelo compilador.
Os arquivos .ll gerados também podem ser inspecionados para verificar a tradução do código JSS para LLVM IR.
Após a validação do código, o compilador gera um arquivo .ll. Em seguida, o Clang recebe esse arquivo e cria o programa executável.
O projeto não possui deploy em servidor, pois seu resultado final é uma aplicação de linha de comando executada localmente.
Durante o desenvolvimento deste projeto, aprofundei meus conhecimentos sobre:
- Funcionamento das principais etapas de um compilador.
- Construção de analisadores léxicos.
- Definição de tokens, palavras-chave e operadores.
- Criação de gramáticas formais.
- Precedência e associatividade de operadores.
- Uso do ANTLR4 para análise sintática.
- Construção e navegação em Árvores Sintáticas Abstratas.
- Implementação do padrão Visitor.
- Criação e gerenciamento de tabelas de símbolos.
- Controle de escopos globais e locais.
- Verificação de tipos durante a análise semântica.
- Validação de funções, variáveis, constantes e classes.
- Geração de código intermediário com LLVM.
- Integração entre Python, LLVM IR e Clang.
- Construção de interfaces de linha de comando.
- Organização de projetos Python em módulos.
- Gerenciamento de dependências com ambiente virtual.
- Desenvolvimento de testes automatizados com Pytest.
- Identificação e tratamento de erros com linha e coluna.
- Uso de Git e GitHub para versionamento.
- Importância da documentação e da separação de responsabilidades para facilitar revisões e colaboração em equipe.
O projeto também permitiu compreender, na prática, como um código escrito em uma linguagem de alto nível passa por diversas transformações até se tornar um programa executável.
Algumas melhorias futuras que podem ser implementadas são:
- Criar uma integração contínua com GitHub Actions.
- Executar os testes automaticamente em Windows, Linux e macOS.
- Gerar executáveis com nomes adequados para cada sistema operacional.
- Melhorar as mensagens de erro com trechos do código e indicadores visuais.
- Implementar recuperação de erros sintáticos para apresentar múltiplos problemas em uma única execução.
- Aumentar a cobertura dos testes automatizados.
- Adicionar testes específicos para o código LLVM gerado.
- Implementar otimizações no LLVM IR.
- Criar uma opção para gerar somente o arquivo
.ll. - Adicionar um modo detalhado para visualizar tokens, AST e tabela de símbolos.
- Criar um REPL para executar comandos JSS de forma interativa.
- Disponibilizar o compilador como um comando instalável pelo Python.
- Criar releases com executáveis prontos para uso.
- Separar os arquivos gerados dos arquivos-fonte de exemplo.
- Expandir a documentação da gramática.
- Adicionar mais exemplos de códigos válidos e inválidos.
- Desenvolver uma interface gráfica para edição, compilação e execução.
- Criar uma extensão para o Visual Studio Code com destaque de sintaxe para arquivos
.jss.
Antes de iniciar, verifique se as seguintes ferramentas estão instaladas:
- Git.
- Python 3.11 ou superior.
- Pip.
- Clang/LLVM disponível no
PATH.
Verifique as versões instaladas:
git --version
python --version
pip --version
clang --versiongit --version
python3 --version
python3 -m pip --version
clang --versionSem o Clang, o compilador poderá gerar o arquivo LLVM IR, mas não conseguirá produzir o executável.
git clone https://github.com/viniciusbtech/Compilador_python_.gitEntre na pasta do projeto:
cd Compilador_python_python -m venv .venvAtive o ambiente:
.\.venv\Scripts\Activate.ps1Caso o PowerShell bloqueie a ativação:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy BypassDepois, execute novamente:
.\.venv\Scripts\Activate.ps1python -m venv .venv.venv\Scripts\activate.batpython3 -m venv .venvsource .venv/bin/activatepython3 -m venv .venvsource .venv/bin/activatepython -m pip install --upgrade pippip install -r requirements.txtpython -m pip install -e .pip install -r requirements-dev.txtpython3 -m pip install --upgrade pippython3 -m pip install -r requirements.txtpython3 -m pip install -e .python3 -m pip install -r requirements-dev.txtAs dependências principais são:
antlr4-python3-runtime
llvmlite
pytest
O projeto não utiliza arquivo .env nem exige variáveis de ambiente obrigatórias.
Caso o pacote não tenha sido instalado no modo editável, configure temporariamente o PYTHONPATH.
$env:PYTHONPATH = "$PWD\src"export PYTHONPATH="$PWD/src"O projeto não utiliza banco de dados. Nenhuma migration ou configuração de conexão é necessária.
python .\main.py --build .\examples\1_basics.jssTambém é possível omitir --build, pois esse é o comportamento padrão:
python .\main.py .\examples\1_basics.jssA compilação gera:
examples/1_basics.ll
examples/1_basics.exe
Execute o programa gerado:
.\examples\1_basics.exepython3 main.py --build examples/1_basics.jssExecute o programa gerado:
./examples/1_basics.exeO fluxo principal do repositório está documentado para Windows. Em Linux e macOS, é necessário ter uma instalação compatível do Clang e permissão para executar o arquivo gerado.
python .\main.py --run .\examples\1_basics.jsspython3 main.py --run examples/1_basics.jsspython .\main.py --build .\examples\1_basics.jss -o .\examples\programa.exepython3 main.py --build examples/1_basics.jss -o examples/programa.exepython .\main.py --run .\examples\2_operators.jsspython .\main.py --run .\examples\3_control_flow.jsspython .\main.py --run .\examples\4_strings_casts.jsspython .\main.py --run .\examples\5_classes.jsspython .\main.py --run .\examples\6_functions.jsspython3 main.py --run examples/2_operators.jsspython3 main.py --run examples/3_control_flow.jsspython3 main.py --run examples/4_strings_casts.jsspython3 main.py --run examples/5_classes.jsspython3 main.py --run examples/6_functions.jssCom o ambiente virtual ativado:
pytestExecutar os testes com informações detalhadas:
pytest -vExecutar um arquivo específico:
pytest tests/test_semantic.py -vExecutar os testes interrompendo na primeira falha:
pytest -xNo Windows, o projeto disponibiliza scripts para automatizar testes e compilações.
powershell -ExecutionPolicy Bypass -File .\testar_tudo.ps1powershell -ExecutionPolicy Bypass -File .\teste_1_10.ps1powershell -ExecutionPolicy Bypass -File .\executar_run.ps1python .\main.py --helppython3 main.py --helpDesenvolvido para o estudo prático de compiladores, análise de linguagens e geração de código. ⚙️