Skip to content

Project 3 - Interpreter and Type-checker for Switch Statement#11

Open
PauloV1 wants to merge 14 commits into
rbonifacio:mainfrom
PauloV1:interpreter/type-checker
Open

Project 3 - Interpreter and Type-checker for Switch Statement#11
PauloV1 wants to merge 14 commits into
rbonifacio:mainfrom
PauloV1:interpreter/type-checker

Conversation

@PauloV1

@PauloV1 PauloV1 commented Jun 14, 2026

Copy link
Copy Markdown

Descrição Geral

Este PR implementa o suporte completo à estrutura condicional switch na linguagem MiniC. A implementação abrange desde a validação semântica (Type-Checker), execução de código (Interpreter) e uma ampla suíte de testes de integração.


Detalhes das Implementações

1. Type-Checker (src/semantic/type_checker.rs)

Implementação de regras semânticas estritas para o nó Statement::Switch:

  • Validação do Alvo (target): O tipo da expressão avaliada deve ser estritamente Type::Int ou Type::Bool.
  • Compatibilidade de Tipos: O tipo do literal de cada case deve coincidir ou ser compatível com o tipo do target.
  • Detecção de Duplicados: Retorna um erro semântico caso existam rótulos (case) duplicados.
  • Isolamento de Escopo Léxico: Cada bloco de instruções de um case e do default é analisado dentro de um escopo isolado utilizando o mecanismo de env.snapshot() e env.restore(). Isso impede:
    • Vazamento de variáveis declaradas dentro de um case para o escopo externo.
    • Poluição ou colisão de nomes entre diferentes ramos do switch.

2. Interpretador (src/interpreter/exec_stmt.rs)

Execução em tempo de execução da instrução switch:

  • Validação em runtime de unicidade dos cases (gerando RuntimeError para duplicados).
  • Avaliação da expressão alvo (target) e busca linear pelo case correspondente. Se nenhum corresponder, o bloco default é selecionado.
  • Gerenciamento de Escopo em Execução:
    • As variáveis declaradas em um ramo do switch são isoladas usando env.names() no início e env.remove_new() na saída do bloco.
    • Caso ocorra um return antecipado de dentro de um case, o escopo é limpo corretamente antes de propagar o valor de retorno.

Cobertura de Testes

Os testes implementados cobrem todos os cenários de sucesso e caminhos de erro esperados.

Testes do Type-Checker (tests/type_checker.rs)

  • test_type_check_switch_int_ok: Validação bem-sucedida de chaves inteiras.
  • test_type_check_switch_bool_ok: Validação bem-sucedida de chaves booleanas.
  • test_type_check_switch_mismatched_case_type: Erro ao usar um case bool em um switch int.
  • test_type_check_switch_unsupported_target_type: Erro ao tentar usar float como target.
  • test_type_check_switch_duplicate_case_labels: Detecção de case duplicado.
  • test_type_check_switch_cross_branch_pollution_err: Garante que variáveis declaradas em um ramo não sejam vistas em outro.
  • test_type_check_switch_independent_branches_ok: Permite redefinição da mesma variável em ramos paralelos distintos.
  • test_type_check_switch_scope_leak_err: Garante que variáveis internas não vazem para o escopo que sucede o switch.

Testes do Interpretador (tests/interpreter.rs)

  • test_switch_exec_match_case: Desvio de fluxo correto para o case correspondente.
  • test_switch_exec_match_default: Execução do default quando não há correspondência.
  • test_switch_exec_early_return: Retorno de valor a partir de funções contendo um switch.
  • test_switch_exec_scoping: Validação em tempo de execução de que variáveis declaradas no switch deixam de existir após o bloco.
  • test_switch_exec_duplicate_error: Erro em tempo de execução ao encontrar labels duplicadas.
  • test_switch_exec_bool_cases: Execução com chaves booleanas.
  • test_switch_exec_complex_target: Avaliação dinâmica do target utilizando expressões (ex: switch a + b).

PauloV1 and others added 14 commits April 16, 2026 23:37
- Add scripts/minic wrapper script for convenient access to mini_c binary
- Add .envrc configuration for automatic direnv activation
- Allows using 'minic' command as documented in README
Introduce the  variant in  to represent switch-case control flow, including a target expression, literal cases with their bodies, and a default branch.
Parse switch statements in statements.rs, including the target expression, one or more case branches (integer and boolean literals), and a mandatory default block. Ensure each case and default contains at least one statement.
Add todo!() stubs for Statement::Switch in both type checking and evaluation phases to satisfy exhaustive pattern matching and keep the project compiling.
Replaced the mutable closures case_parse and default_parse with declarative nom combinators (tuple and map) inside the switch parser. This removes the need for mutable state in sub-parsers and makes the parsing logic more idiomatic and cohesive.
Implement type checker and interpreter for Switch statement
- Implement semantic check to reject duplicate cases in a switch block
- fix: make literal pattern matching exhaustive by returning a TypeError for unsupported types
- Implement runtime/evaluation check for duplicate labels in switch cases
- fix: import  from AST module to resolve scope compilation error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants