Skip to content

Parser

O parser do Oxc foi feito para ser o mais rápido e o mais aderente à especificação entre parsers JavaScript e TypeScript. Contribuir com o parser exige entender tanto os detalhes de implementação quanto a infraestrutura extensa de testes.

Visão geral da arquitetura

O parser segue o modelo clássico de frontend de compilador:

Source Text → Lexer → Tokens → Parser → AST

Componentes principais

  • Lexer: transforma o texto-fonte em tokens estruturados
  • Parser: parser recursivo descendente que monta a AST
  • AST: árvore sintática abstrata eficiente em memória
  • Recuperação de erros: tratamento avançado de erros e recuperação
  • Análise semântica: resolução de símbolos e gestão de escopo

Metas de desenho

Queremos ser o parser em Rust mais rápido e pronto para produção, com:

  • Velocidade: ~3x mais rápido que SWC, ~5x que Biome
  • Conformidade: 100% Test262, 99%+ compatível com Babel/TypeScript
  • Memória: alocação em arena, pouco uso de heap
  • Qualidade dos erros: mensagens úteis com recuperação

Fluxo de desenvolvimento

Configuração

bash
# Run parser tests
cargo test -p oxc_parser

# Run conformance tests
just c  # or `just coverage`

Estrutura do projeto

crates/oxc_parser/
├── src/
│   ├── lib.rs              # Public API
│   ├── lexer/              # Tokenization
│   ├── parser/             # Parsing logic
│   ├── cursor.rs           # Token stream management
│   └── diagnostics.rs      # Error handling
├── tests/                  # Unit tests
└── examples/               # Usage examples

Arquivos centrais do parser

  • parser/mod.rs: entrada principal do parser
  • parser/statement.rs: parsing de statements
  • parser/expression.rs: parsing de expressões
  • parser/typescript.rs: parsing específico de TypeScript
  • parser/jsx.rs: parsing de JSX

Testes de conformidade

Rodar testes de conformidade

bash
just c

Isso executa as suítes de conformidade com o runner em tasks/coverage:

Test262 — conformidade ECMAScript

JavaScript tem a suíte de testes ECMAScript, o Test262. O objetivo é cobrir todo comportamento observável da especificação.

A conformidade do parser usa os testes da fase parse.

Estado atual: 43765/43765 (100.00%)

Testes do parser Babel

Quando surgem recursos novos na linguagem, o Babel costuma implementar primeiro. O Babel tem testes de parser abrangentes para o que há de mais novo.

Estado atual: 2093/2101 (99.62%)

Conformidade TypeScript

Os testes de conformidade do TypeScript estão aqui.

Estado atual: 6470/6479 (99.86%)

Ver resultados

Os resultados ficam em snapshots para acompanhar mudanças: