Skip to content

Interpretador de C em Python

Nesta Etapa focamos na resolução dos problemas da entrega 1.


Visão Geral

  • Linguagem de entrada: Subconjunto de C (inteiros, if, else, while, for, return)
  • Tecnologias: Python + PLY

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

Obs.: vc pode colocar o código utilizado para teste da equipe, localizado na pasta Testes dentro de interpretadorPython.

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 (na pasta interpretadorPython)
Testes/ 📂 Diretório contendo arquivos .c para testes específicos (na pasta interpretadorPython)

Fluxo de Execução

Inicia com o "Código-fonte (.c)".
Mostra explicitamente o `main.py` como o primeiro receptor e orquestrador (🖥️).
Em seguida, detalha o fluxo através dos componentes `lexer.py` (🧪), `parser.py` (🧠), e `interpreter.py` (⚙️), usando os mesmos ícones e nomenclaturas da sua tabela de componentes.
Conclui com o "Resultado Final" (📤).

Input[📄 Código-fonte (.c)] --> Main[🖥️ main.py]
Main --> Lexer[🧪 lexer.py<br/>(Análise Léxica/Tokenização)]
Lexer --> Parser[🧠 parser.py<br/>(Análise Sintática/Geração de AST)]
Parser --> Interpreter[⚙️ interpreter.py<br/>(Interpretação/Execução da AST)]
Interpreter --> Output[📤 Resultado Final]

Exemplo Completo

No arquivo de testes.c com o código de teste de array:

int main() {
    int x[3];
    x[0] = 1;
    x[1] = 2;
    x[2] = x[0] + x[1];
    return x[2];
}

Espera-se a saída:

=== Analyzing testes.c ===

=== TOKENIZATION ===
Line 1: INT             = int
Line 1: ID              = main
Line 1: LPAREN          = (
Line 1: RPAREN          = )
Line 1: LBRACE          = {
Line 2: INT             = int
Line 2: ID              = x
Line 2: LBRACKET        = [
Line 2: NUMBER          = 3
Line 2: RBRACKET        = ]
Line 2: SEMI            = ;
Line 3: ID              = x
Line 3: LBRACKET        = [
Line 3: NUMBER          = 0
Line 3: RBRACKET        = ]
Line 3: ASSIGN          = =
Line 3: NUMBER          = 1
Line 3: SEMI            = ;
Line 4: ID              = x
Line 4: LBRACKET        = [
Line 4: NUMBER          = 1
Line 4: RBRACKET        = ]
Line 4: ASSIGN          = =
Line 4: NUMBER          = 2
Line 4: SEMI            = ;
Line 5: ID              = x
Line 5: LBRACKET        = [
Line 5: NUMBER          = 2
Line 5: RBRACKET        = ]
Line 5: ASSIGN          = =
Line 5: ID              = x
Line 5: LBRACKET        = [
Line 5: NUMBER          = 0
Line 5: RBRACKET        = ]
Line 5: PLUS            = +
Line 5: ID              = x
Line 5: LBRACKET        = [
Line 5: NUMBER          = 1
Line 5: RBRACKET        = ]
Line 5: SEMI            = ;
Line 6: RETURN          = return
Line 6: ID              = x
Line 6: LBRACKET        = [
Line 6: NUMBER          = 2
Line 6: RBRACKET        = ]
Line 6: SEMI            = ;
Line 7: RBRACE          = }

Total tokens: 47

=== SYNTAX TREE ===
└─ Program
  └─ Function: main (returns ('type', 'int', 0))
    └─ Body
      └─ Array Declare: x (int)[3]
      └─ Array Assign: x[0]
        └─ Value
          └─ Num: 1
      └─ Array Assign: x[1]
        └─ Value
          └─ Num: 2
      └─ Array Assign: x[2]
        └─ Value
          └─ Binop: +
            └─ Left
              └─ Array Access: x[0]
            └─ Right
              └─ Array Access: x[1]
      └─ Return
        └─ Value
          └─ Array Access: x[2]


=== EXECUTION ===
Variáveis locais: {'x': {'type': 'array', 'size': 3}}

Variáveis locais da função main: {}

=== FINAL STATE ===
Return value: 3

Global variables:

Arrays:
  x: [1, 2, 3]

Memory used: -3096 bytes

Tabela de Versionamento

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