Skip to content

Interpretador de C em Python

Este projeto implementa um interpretador simplificado para um subconjunto da linguagem C, utilizando Python e a biblioteca PLY (Python Lex-Yacc).

Nesse primeiro momento implementamos toda a tabela de simbolos e palavras reservadas do C, além de já implementar os condicionais if e else. Começamo o while, contudo temos que refinar melhor esse laço.


Visão Geral

  • Linguagem de entrada: Subconjunto de C (inteiros, if, return)
  • Tecnologias: Python + PLY
  • Etapas: Análise léxica → Sintática (AST) → Interpretação
  • Objetivo: Didático — compreender como funciona um compilador simples

Instalação

Pré-requisitos

  • Python 3.8+
  • PLY

Instale as dependências

pip install -r requirements.txt

Para executar, faça:

python main.py testes.c

Arquitetura do Projeto

Componentes Principais

Arquivo Responsabilidade
lexer.py 🧪 Análise léxica — define tokens da linguagem C
parser.py 🧠 Análise sintática — constrói a AST (Árvore Sintática Abstrata)
interpreter.py ⚙️ Interpretador — executa a AST em tempo de execução
main.py 🖥️ Orquestrador — coordena lexer, parser e interpretação
testes.c 🧾 Arquivo de exemplo com código C testável

Fluxo de Execução

flowchart TD
    A[📄 Código-fonte (.c)] --> B[🔍 Lexer<br/>(Tokenização)]
    B --> C[🧩 Parser<br/>(Geração de AST)]
    C --> D[🧮 Interpretador<br/>(Execução da AST)]
    D --> E[📤 Resultado Final]

Exemplo Completo

No arquivo de testes.c

int main() {
    int x = 4;
    int y = 3;

    if ((2+6) > (x+y)) {
        return 1;
    }

    return 0;
}

Espera-se a saída:

Tokens:
  INT: int
  ID: main
  ...
  RETURN: return
  NUMBER: 0

Abstract Syntax Tree:
└─ Program
  └─ Function: main (int)
    └─ Body
      └─ Declare: x (int)
        └─ Value
          └─ Num: 4
      └─ Declare: y (int)
        └─ Value
          └─ Num: 3
      └─ If
        └─ Condition
          └─ Op: >
            └─ Left
              └─ Op: +
                └─ Num: 2
                └─ Num: 6
            └─ Right
              └─ Op: +
                └─ Var: x
                └─ Var: y
        └─ Body
          └─ Return
            └─ Num: 1
      └─ Return
        └─ Num: 0

Resultado: 0
Variáveis finais: {'x': 4, 'y': 3}


Tabela de Versionamento

Versão Data Descrição Autor(es) Revisor(es)
1.0 30/04/2025 Desenvolvimento do tópico da entrega 1 Felipe das Neves Lucas Soares