prometeu-studio/docs/pbs/pull-requests/PR-001-pbs-lexer-core-syntax-alignment.md
2026-03-24 13:42:19 +00:00

39 lines
2.1 KiB
Markdown

# PR-001 - PBS Lexer Core Syntax Alignment
## Briefing
O lexer atual cobre apenas uma parte pequena da superficie definida em `3. Core Syntax Specification.md`.
Este PR fecha o contrato lexico minimo de v1 para que parser, semantica e diagnosticos trabalhem sobre um conjunto estavel de tokens.
## Target
- Specs:
- `docs/pbs/specs/3. Core Syntax Specification.md` (secoes 4.1, 4.2, 4.4, 4.5, 10)
- `docs/pbs/specs/11. AST Specification.md` (secao 7: atribuicao estavel)
- Codigo:
- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/lexer/PbsTokenKind.java`
- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/lexer/PbsLexer.java`
- `prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/lexer/LexErrors.java`
## Method
1. Expandir `PbsTokenKind` para todos os keywords ativos de v1 e operadores/pontuacao usados na gramatica.
2. Adicionar tokens para `COMMENT` e para operadores compostos ausentes (`->`, `+=`, `-=`, `*=`, `/=`, `%=`).
3. Suportar aliases lexicos (`and/or/not`) sem quebrar `&&/||/!`.
4. Preservar spans estaveis em todos os tokens emitidos.
5. Manter rejeicao deterministica para caracteres invalidos e strings nao terminadas.
## Acceptance Criteria
- Lexer emite classes obrigatorias: `identifiers`, `keywords`, `literals`, `punctuation`, `operators`, `comments`, `EOF`.
- Keywords reservados nao entram como `IDENTIFIER`.
- `and/or/not` e `&&/||/!` sao tokenizados de forma consistente.
- `->` nao e decomposto em dois tokens (`-` e `>`).
- Comentarios de linha sao representados como token e nao perdem a continuidade do stream.
- Todos os tokens carregam `start/end` corretos no arquivo.
## Tests
- `PbsLexerTest`:
- caso feliz com arquivo contendo imports, declaracoes, controle de fluxo e operadores compostos;
- caso de comentarios em multiplas linhas;
- caso de palavras reservadas vs identificadores parecidos;
- caso de string nao terminada (`E_LEX_UNTERMINATED_STRING`);
- caso de caractere invalido (`E_LEX_INVALID_CHAR`).
- Fixtures de regressao para `->`, `and/or/not` e atribuicoes compostas.