Especificação do Projeto: PYtoC
1. Visão Geral
PYtoC é um compilador que traduz da linguagem Python para código C. O projeto foi desenvolvido como parte da disciplina de Compiladores, utilizando as ferramentas Flex e Bison.
2. Funcionalidades Implementadas
2.1 Estruturas Suportadas
- Variáveis e tipos básicos (int, float)
- Operações aritméticas (+, -, *, /)
- Operações de comparação (==, !=, <, >, <=, >=)
- Estruturas de controle:
- if/else
- for in range()
- while
- Funções (definição e chamada)
- Comando print para saída
2.2 Análise Léxica (Scanner)
- Reconhecimento de tokens:
- Palavras-chave (if, else, for, while, in, range, print, def)
- Identificadores
- Números (inteiros e flutuantes)
- Operadores
- Delimitadores
2.3 Análise Sintática (Parser)
- Gramática livre de contexto para o subconjunto Python
- Construção da AST (Árvore Sintática Abstrata)
- Tratamento de precedência de operadores
- Gerenciamento de escopo
2.4 Geração de Código
- Tradução direta para código C
- Mapeamento de estruturas Python para C
- Gerenciamento de tipos
- Tratamento de funções
3. Problemas e Soluções
3.1 Integração Flex/Bison
- Problema: Dificuldades em relação a conflitos do parser, do tipo:
parser.y: warning: x shift/reduce conflicts [-Wconflicts-sr] parser.y: warning: x reduce/reduce conflict [-Wconflicts-rr]
- Solução: Estudo e aplicação do error verbose do Bison, além de ajustes na gramática para reduzir conflitos
3.2 Compatibilidade macOS
- Problema: Dificuldades específicas no ambiente macOS
- Solução: Ajustes na configuração e uso do arquivo de cabeçalho do Bison
3.3 Compilação GCC
- Problema: Erros de compilação com funções não definidas
- Solução: Inclusão da biblioteca -lfl e ajustes no comando de compilação
3.4 Parser e AST
- Problema: Complexidade na construção e vinculação dos nós da AST
- Solução: Refinamento das regras gramaticais e mecanismos de construção dinâmica
3.5 Gerenciamento de Escopo
- Problema: Conflitos entre variáveis em diferentes contextos
- Solução: Implementação de sistema de escopo hierárquico
3.6 Interpretação de toda a linguagem sem delimitação de bloco
- Problema: Dificuldade em interpretar corretamente o código sem delimitação de bloco
- Solução: ...
4. Decisões Técnicas
4.1 Ferramentas
- Flex para análise léxica
- Bison para análise sintática
- GCC para compilação
- MkDocs para documentação
4.2 Estrutura do Projeto
- Organização modular em diretórios específicos
- Controle de versão com Git
- Branches organizados por funcionalidade
4.3 Padrões de Código
- Nomenclatura consistente
- Comentários explicativos
- Tratamento de erros robusto
5. Estado Atual do Projeto
5.1 Funcionalidades Completas
- Análise léxica
- Análise sintática básica
- Geração de código para estruturas fundamentais
- Tabela de símbolos
- Gerenciamento de escopo
- Árvore sintática abstrata (AST)
5.2 Limitações
- Sem suporte a arrays/listas
- Sem suporte a strings em todas operações
- Funções sem parâmetros
- Sem suporte a módulos/imports
- Tratamento de erros limitado
- Sem suporte a classes e objetos
- Sem suporte a exceções
- Sem suporte a operadores lógicos (and, or, not)
- Sem suporte a operadores bitwise
6. Compilação e Uso
6.1 Requisitos
- Flex e Bison instalados
- GCC
- Make (opcional)
6.2 Comandos de Compilação
flex scanner.l
bison -d parser.y
gcc -o compilador parser.tab.c lex.yy.c ast.c tabela.c -lfl
6.3 Execução
./compilador < entrada.py > saida.c
gcc saida.c -o programa
./programa
7. Documentação
A documentação completa do projeto está organizada nos seguintes diretórios:
- /docs/problemas_e_solucoes/
: Registro de problemas encontrados e soluções
- /docs/decisoes/
: Documentação das decisões técnicas
- /docs/Projeto_Final/
: Especificação final do projeto