Resumo compacto do projeto: implementa as etapas clássicas de um compilador (leitura de arquivo .252, análise léxica, gerenciamento de símbolos, checagem sintática básica e geração de relatórios .LEX e .TAB). Entrada principal: main.py. Versão empacotada: main.exe (quando gerada).
Conteúdo rápido
- Visão geral
- Diagrama da estrutura do projeto
- Módulos principais
- Quick start (exe e Python)
- Build
- Testes e troubleshooting
- Licença
O compilador realiza as etapas clássicas:
- Leitura do arquivo-fonte (.252)
- Análise léxica (tokenização)
- Gerenciamento de símbolos (tabelas fixas e dinâmicas)
- Verificações sintáticas básicas
- Geração de relatórios:
.LEX(léxico) e.TAB(tabela de símbolos)
Há uma interface interativa no main.py e uma versão empacotada (main.exe) para Windows (quando gerada pelo processo de build).
Compilador/
├── main.py # interface/entrypoint interativo
├── readme.md # este arquivo
├── requirements.txt # dependências
├── build/ # artefatos do empacotamento (pyz, toc, etc.)
├── dist/ # normalmente contém o main.exe após empacotamento
├── compiler/ # núcleo do compilador
│ ├── __init__.py # exporta função/entrada pública (ex: compile())
│ ├── controller.py # orquestra leitura -> lexer -> parser -> gravação
│ ├── errors/ # tratamento específico de erros léxicos/lexemas
│ │ ├── __init__.py
│ │ ├── unclosed_comment.py # erro: comentário não fechado
│ │ └── unclosed_string.py # erro: string não fechada
│ ├── io/
│ │ ├── read_file.py # leitura do arquivo-fonte (.252)
│ │ └── write_file.py # grava os relatórios (.LEX, .TAB)
│ ├── lexer_analyser/
│ │ ├── __init__.py
│ │ ├── lexer.py # analisador léxico (tokenização)
│ │ └── lex_report.py # transformação para o formato .LEX
│ ├── parser/
│ │ ├── __init__.py
│ │ ├── parser.py # análises sintáticas básicas
│ │ └── context.py # estruturas/enumerações usadas pelo parser
│ ├── reserved_symbols/
│ │ ├── reserved_symbols_table.py # símbolos reservados estáticos
│ │ └── symbol.py # modelo de símbolo reservado
│ └── symbol_table/
│ ├── table.py # tabela de símbolos dinâmica
│ └── symbol.py # modelo de símbolo dinâmico
├── tests/ # testes unitários por módulo
└── utils/
└── files_for_tests/ # arquivos de teste (.252) usados pelos testes
-
compiler.__init__.py:- Ponto de exportação do pacote; geralmente expõe uma função
compile(file_path)usada pelomain.py.
- Ponto de exportação do pacote; geralmente expõe uma função
-
compiler.controller.py:- Orquestra o fluxo: carrega o arquivo, chama o lexer e parser, solicita gravação dos relatórios.
-
compiler/errors/:- Contém classes específicas de exceção/erro usadas pelo analisador léxico e outras etapas.
unclosed_comment.py: exceção/report para comentário não fechado.unclosed_string.py: exceção/report para string não fechada.- Essas classes permitem mensagens de erro mais informativas e controle localizado de falhas léxicas.
-
compiler/io/read_file.pyecompiler/io/write_file.py:read_file.py: abre e devolve o conteúdo do.252.write_file.py: escreve os arquivos de saída (.LEXe.TAB), seguindo o formato do projeto.
-
compiler/lexer_analyser/lexer.pyelex_report.py:lexer.py: lógica que percorre caracteres e produz lexemas/tokens; também lança/explora erros do móduloerrors.lex_report.py: monta o relatório legível.LEXa partir dos tokens.
-
compiler/parser/parser.pyecontext.py:- Implementam verificações sintáticas de alto nível e mantêm contexto de análise (pilha, escopos, etc.).
-
compiler/reserved_symbols/:- Contém a lista de palavras e símbolos reservados usados pelo lexer e parser.
-
compiler/symbol_table/:- Implementa a tabela de símbolos (inserção, busca, truncagem quando necessário).
Executável (Windows)
- Localize o
main.exe(procure emdist/) - Execute o arquivo como um executável normal. Abrirá um prompt de comando
- No prompt do executável informe o caminho base do arquivo fonte (pode omitir
.252). Saídas geradas:arquivo_base.LEXearquivo_base.TABno mesmo diretório.
Executar com Python
python main.py- Instale PyInstaller:
pip install pyinstaller - Gerar exe:
pyinstaller main.py --onefile - Resultado em
dist/main(ajustar flags conforme necessidade de incluir recursos).
Execute a suíte de testes com pytest na raiz do repositório:
pytestou
python run_tests.pyExecutar testes de um subdiretório (ex.: lexer):
pytest tests/lexerArquivos de teste de exemplo ficam em utils/files_for_tests/.