39 lines
2.1 KiB
Markdown
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.
|