DEV Community

CrabPascal
CrabPascal

Posted on

Audit Deep Dive: Parser, AST, Semantic | Auditoria: parser, AST, semântica

Bilingual post · Post bilíngue

Jump to: English · Português


English {#english}

Audit Deep Dive: Parser, AST, Semantic

Mintlify docs tour — after Lucas's backend audit, Bruno's front-end audit completes the compiler pipeline picture.

Lucas mapped run/build divergence. Bruno audited parser, AST, spans, and semantic validation — the phases that decide whether Delphi source becomes a trustworthy program tree. Full report: Audit (Bruno) — Parser.

Audit scope

Files examined:

  • src/parser/mod.rs — Delphi syntax surface
  • src/ast/* — program representation
  • src/semantic/mod.rs — type checking and diagnostics
  • Cross-check against Sprint 1–8 review docs (read-only)

Goal: find where real Delphi code would parse incorrectly or lose AST information silently.

TD-PARSER-001: multiple fields per declaration

Evidence: parse_field_declaration (~2442–2456) — for A, B: Integer, only names[0] enters the AST; comment says // TODO: Handle multiple fields.

Impact: Common class/record declarations lose fields. Runtime may appear to work until missing fields cause subtle bugs.

Fix: Sprint 11 (v2.19.0) — closed per backlog.

Test: fixture record Test; A,B: Integer; end. passes check.

TD-PARSER-002: implemented interfaces

Evidence: parse_class_definitioninterfaces: Vec::new(), // TODO - parsear interfaces implementadas.

Impact: class(TBase, I1, I2) not represented; dispatch and semantic checks cannot enforce interface contracts.

Fix: Sprint 11 — interfaces populated in AST.

TD-PARSER-004: explicit out parameters

Evidence: parse_parameters (~858–871) accepts var and const but no Token::Out branch.

Impact: Modern Delphi signatures like procedure P(out N: Integer) fail or parse wrong.

Fix: Sprint 11 — out token treated as var for compatibility.

TD-PARSER-003: generic parameters on classes (still open)

Evidence: generic_parameters: Vec::new(), // TODO in class parsing.

Impact: type TFoo<T> = class unavailable in AST for instantiation.

Target: Sprint 15 (v2.23.0) or earlier partial support.

TD-PARSER-005: published section (P2)

Evidence: comment // Published não tem token, skip in class parsing.

Impact: RTTI/serialization scenarios lose visibility metadata. Lower priority than field/interface gaps.

TD-SEMANTIC-001: broken test baseline

Evidence: test_undefined_variable in src/semantic/mod.rs (~1370–1381) expected "Undefined variable" but cargo test failed the assert.

Impact: CI not trustworthy for semantic changes.

Fix: Sprint 9 (v2.17.0) — message alignment and green baseline.

Panic safety note

Audit found panic!/unwrap() mainly in #[cfg(test)] blocks — parser tests and AST unit tests — not in production parse paths. TD-PARSER-008 tracks continuous vigilance: zero panics on user syntax errors; return Result with spans instead.

What already worked (S6/S7)

Positive findings matter too:

  • property parsing with read/write identifiers — parse_property_declaration (~1574–1629)
  • Visibility sections: private/public/protected with default public
  • Generic expressions like TDictionary<String,Integer> — Sprint 7

The front-end is not uniformly broken — gaps are specific Delphi surface features common in enterprise codebases.

Recommended tests from audit

Test ID Fixture Validates
TST-PARSER-MULTI-FIELDS-001 A,B: Integer TD-PARSER-001
TST-PARSER-OUT-001 procedure P(out N: Integer) TD-PARSER-004
TST-PARSER-INTERFACES-001 class(TBase, I1, I2) TD-PARSER-002

Run after changes:

cargo test --lib parser
crab-pascal check tests/fixtures/your_new_fixture.pas
Enter fullscreen mode Exit fullscreen mode

Contributor path

Parser fixes are ideal good first sprint work: isolated, test-driven, visible in check output. Reference Bruno's audit ID in PRs; update backlog status when merged.

Next in series (052): Helena's RTL/Unicode/properties audit — the runtime layer Delphi developers feel every day.


Português {#portugus}

Auditoria: parser, AST, semântica

Tour Mintlify — depois da auditoria backend de Lucas, a auditoria front-end de Bruno completa o quadro do pipeline do compilador.

Lucas mapeou divergência run/build. Bruno auditou parser, AST, spans e validação semântica — fases que decidem se fonte Delphi vira árvore de programa confiável. Relatório completo: Auditoria (Bruno) — Parser.

Escopo da auditoria

Arquivos examinados:

  • src/parser/mod.rs — superfície sintática Delphi
  • src/ast/* — representação do programa
  • src/semantic/mod.rs — type checking e diagnósticos
  • Cross-check com docs de review Sprints 1–8 (somente leitura)

Objetivo: achar onde código Delphi real parsearia incorretamente ou perderia informação na AST silenciosamente.

TD-PARSER-001: múltiplos fields por declaração

Evidência: parse_field_declaration (~2442–2456) — para A, B: Integer, só names[0] entra na AST; comentário // TODO: Handle multiple fields.

Impacto: Declarações comuns de class/record perdem fields. Runtime pode parecer OK até fields faltantes causarem bugs sutis.

Fix: Sprint 11 (v2.19.0) — fechado no backlog.

Teste: fixture record Test; A,B: Integer; end. passa no check.

TD-PARSER-002: interfaces implementadas

Evidência: parse_class_definitioninterfaces: Vec::new(), // TODO - parsear interfaces implementadas.

Impacto: class(TBase, I1, I2) não representado; dispatch e checks semânticos não impõem contratos de interface.

Fix: Sprint 11 — interfaces populadas na AST.

TD-PARSER-004: parâmetros out explícitos

Evidência: parse_parameters (~858–871) aceita var e const mas sem branch Token::Out.

Impacto: Assinaturas Delphi modernas como procedure P(out N: Integer) falham ou parseiam errado.

Fix: Sprint 11 — token out tratado como var para compatibilidade.

TD-PARSER-003: parâmetros genéricos em classes (ainda aberto)

Evidência: generic_parameters: Vec::new(), // TODO no parse de class.

Impacto: type TFoo<T> = class indisponível na AST para instanciação.

Alvo: Sprint 15 (v2.23.0) ou suporte parcial antes.

TD-PARSER-005: seção published (P2)

Evidência: comentário // Published não tem token, skip no parse de class.

Impacto: Cenários RTTI/serialização perdem metadado de visibilidade. Prioridade menor que gaps de field/interface.

TD-SEMANTIC-001: baseline de testes quebrada

Evidência: test_undefined_variable em src/semantic/mod.rs (~1370–1381) esperava "Undefined variable" mas cargo test falhou no assert.

Impacto: CI não confiável para mudanças semânticas.

Fix: Sprint 9 (v2.17.0) — alinhamento de mensagem e baseline verde.

Nota sobre segurança de panic

Auditoria encontrou panic!/unwrap() principalmente em blocos #[cfg(test)] — testes do parser e unitários de AST — não em paths de parse de produção. TD-PARSER-008 rastreia vigilância contínua: zero panics em erros de sintaxe do usuário; retornar Result com spans.

O que já funcionava (S6/S7)

Achados positivos também importam:

  • Parse de property com identificadores read/writeparse_property_declaration (~1574–1629)
  • Seções de visibilidade: private/public/protected com default public
  • Expressões genéricas como TDictionary<String,Integer> — Sprint 7

O front-end não está uniformemente quebrado — gaps são features específicas de superfície Delphi comuns em codebases enterprise.

Testes recomendados da auditoria

ID teste Fixture Valida
TST-PARSER-MULTI-FIELDS-001 A,B: Integer TD-PARSER-001
TST-PARSER-OUT-001 procedure P(out N: Integer) TD-PARSER-004
TST-PARSER-INTERFACES-001 class(TBase, I1, I2) TD-PARSER-002

Rode após mudanças:

cargo test --lib parser
crab-pascal check tests/fixtures/your_new_fixture.pas
Enter fullscreen mode Exit fullscreen mode

Caminho do contribuidor

Fixes de parser são trabalho ideal de good first sprint: isolados, test-driven, visíveis no output do check. Referencie ID da auditoria de Bruno em PRs; atualize status no backlog ao mergear.

Próximo na série (052): auditoria RTL/Unicode/properties de Helena — camada de runtime que desenvolvedores Delphi sentem todo dia.


Published on dev.to/@crabpascal · Código em CrabPascal

Top comments (0)