73 lines
2.5 KiB
Markdown
73 lines
2.5 KiB
Markdown
# PR-11.2 - PBS Expr Parser Control-Flow Subparsers
|
|
|
|
## Briefing
|
|
|
|
As formas de expressao com maior branching em `PbsExprParser` sao `if`, `switch`, `handle` e `else`.
|
|
|
|
Esta PR extrai essas construcoes para subparsers dedicados, mantendo a mesma sintaxe, mesmos diagnosticos e o mesmo AST.
|
|
|
|
## Motivation
|
|
|
|
### Dor atual que esta PR resolve
|
|
|
|
1. `if/switch/handle` compartilham recovery, parsing de blocos e recursion, elevando bastante a complexidade local.
|
|
2. Essas formas sao semanticamente coesas e podem viver fora do parser principal de precedence.
|
|
3. Sem essa extracao, `PbsExprParser` continua grande mesmo apos separar a fundacao.
|
|
|
|
## Target
|
|
|
|
Separar parsing de expressoes de controle de fluxo:
|
|
|
|
1. `handle`,
|
|
2. `else`,
|
|
3. `if expression`,
|
|
4. `switch expression`.
|
|
|
|
## Dependencies
|
|
|
|
Prerequisito direto:
|
|
|
|
1. `PR-11.1`
|
|
|
|
## Scope
|
|
|
|
1. Extrair `parseHandle`, `parseHandlePattern`, `parseElse`, `parseIfExpression`, `parseIfExpressionFromToken`, `parseSwitchExpression`, `parseSwitchPattern`.
|
|
2. Preservar uso de `parseSurfaceBlock` para blocos de expressao.
|
|
3. Manter exatamente a precedence atual dessas superficies.
|
|
|
|
## Non-Goals
|
|
|
|
1. Nao alterar a regra de `if expression` exigir `else`.
|
|
2. Nao alterar curingas de `switch`.
|
|
3. Nao alterar formatos aceitos de `handle` e remapeamento de erro.
|
|
|
|
## Method
|
|
|
|
### O que deve ser feito explicitamente
|
|
|
|
1. Introduzir subparsers pequenos por familia de construcao.
|
|
2. Reusar o contexto compartilhado da PR anterior.
|
|
3. Garantir que `parseExpression()` continue entrando pela mesma superficie sintatica.
|
|
4. Proteger a equivalencia com testes focados em control-flow expressions.
|
|
|
|
## Acceptance Criteria
|
|
|
|
1. A logica de `if/switch/handle/else` nao fica mais centralizada em `PbsExprParser`.
|
|
2. ASTs gerados para essas construcoes permanecem equivalentes.
|
|
3. Diagnosticos de formas invalidas continuam com o mesmo contrato observavel.
|
|
|
|
## Tests
|
|
|
|
1. `:prometeu-compiler:frontends:prometeu-frontend-pbs:test --tests *PbsExprParserTest*`
|
|
2. `:prometeu-compiler:frontends:prometeu-frontend-pbs:test --tests *PbsParserStatementsTest*`
|
|
3. `:prometeu-compiler:frontends:prometeu-frontend-pbs:test --tests *PbsSemanticsResultFlowRulesTest*`
|
|
4. `:prometeu-compiler:frontends:prometeu-frontend-pbs:test`
|
|
|
|
## Affected Documents
|
|
|
|
1. Nenhum documento normativo.
|
|
|
|
## Open Questions
|
|
|
|
1. `else` deve viver junto do control-flow parser ou continuar na espinha de precedence. A recomendacao e movê-lo junto porque a associatividade e as mensagens de erro fazem parte do mesmo cluster conceitual.
|