EN

Nº 12de 22Índice

Compilador de linguagem própria

Compilador em Java: lexer, parser recursivo-descendente, interpretador tree-walking e gerador de assembly NASM x86 32-bit

Ano
2026
Status
ENTREGUE
Stack
Java · Assembly x86 · NASM · Docker +1
lp-compiler
CD

Java

Sem captura pública — capa gerada

01O projeto

Linguagem própria com sintaxe inspirada em Rust, implementada em Java: análise léxica, parser recursivo-descendente, AST e dois back-ends. O interpretador tree-walking cobre a linguagem inteira — variáveis tipadas com mutabilidade, funções recursivas com escopo léxico encadeado, structs com campos aninhados e if como expressão. O gerador de código emite NASM x86 de 32 bits, montado e executado dentro de um container, e cobre só o subconjunto inteiro: cada nó sem representação em assembly cru lança erro explícito em vez de fingir suporte. A gramática está formalizada em EBNF no repositório.

02O que foi feito

  1. Dois back-ends sobre a mesma AST: interpretador tree-walking com a linguagem completa, e gerador de NASM x86 32-bit limitado ao subconjunto inteiro, com erro explícito em cada nó não suportado

  2. Escopo léxico por cadeia de tabelas de símbolos: bloco só cria escopo filho quando é bloco explícito, preservando o escopo do chamador no corpo direto de função

  3. Pipeline de baixo nível automatizado: gerar o .asm, montar com nasm, linkar com gcc -m32 -nostartfiles e executar o binário ELF32 dentro de um container Linux

  4. Gramática formalizada em EBNF com diagrama sintático, evoluída em 38 commits com versionamento semântico

  5. Arquivos de casos cobrindo 19 cenários de erro de léxico, sintaxe e semântica — divisão por zero, reatribuição de variável imutável, tipo incompatível

03Decisões

Decisão 01

Pergunta: Por que dois back-ends em vez de um?

Resposta: O interpretador cobre a linguagem inteira, inclusive string, ponto flutuante e struct. O gerador de assembly x86 puro não tem heap nem runtime de string, então em vez de emular o que não cabe, cada nó não suportado lança erro nomeado — o limite fica explícito no código, não escondido num comportamento errado.

04Stack

  • Java
  • Assembly x86
  • NASM
  • Docker
  • Bash
Próximo projeto →Nº 13

Parceria com a USP — aplicação web para fonoaudiologia