A pure-PHP toolkit for building custom lexers and LALR(1) parsers โ fast, type-safe, and dependency-free.
Dissect is a pure-PHP library for lexical and syntactical analysis โ the foundational building blocks for any language tooling: expression evaluators, template engines, DSL interpreters, query parsers, and more.
It powers the GoAOP framework, where it parses pointcut DSL expressions into an AST for aspect-oriented programming.
Input String
โ
โผ
โโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ Lexer โ โโโโถ โ TokenStream โ โโโโถ โ LALR(1) Parser โ โโโโถ Result / AST
โโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โฒ
Grammar (rules
+ callbacks)
| Lexer | Description |
|---|---|
SimpleLexer |
Fluent builder API โ define tokens with strings or regex, mark skippable tokens |
StatefulLexer |
Context-aware tokenization with explicit state transitions (e.g. for string interpolation) |
RegexLexer |
Abstract base class adapted from Doctrine โ ultra-fast single-pass regex lexing |
left(), right(), nonassoc() declarationsCommonNode โ ready-to-use tree node with named children and arbitrary attributescomposer require goaop/dissect
use Dissect\Lexer\SimpleLexer;
use Dissect\Parser\Grammar;
use Dissect\Parser\LALR1\Parser;
// 1. Define a lexer
$lexer = new SimpleLexer();
$lexer->regex('INT', '/[0-9]+/')
->token('PLUS', '+')
->token('MINUS', '-')
->regex('WS', '/\s+/')
->skip('WS');
// 2. Define a grammar
$grammar = new Grammar();
$grammar('Expr')
->is('Expr', 'PLUS', 'Expr')
->call(fn($l, $_, $r) => $l + $r)
->is('Expr', 'MINUS', 'Expr')
->call(fn($l, $_, $r) => $l - $r)
->is('INT')
->call(fn($t) => (int) $t->getValue());
$grammar->operators('PLUS', 'MINUS')->left()->prec(1);
$grammar->start('Expr');
// 3. Parse!
$parser = new Parser($grammar);
$result = $parser->parse($lexer->lex('3 + 5 - 2')); // โ 6
| Topic | Description |
|---|---|
| Lexical analysis | SimpleLexer, StatefulLexer, RegexLexer, performance tips |
| Writing a grammar | Productions, callbacks, operator precedence, conflict resolution |
| Building an AST | CommonNode, tree traversal |
| Common patterns | Lists, comma-separated sequences, expression grammars |
| CLI tool | Precomputing parse tables, exporting automaton graphs |
# Run tests
composer test
# Run tests with coverage
composer test-coverage
# Static analysis (PHPStan level 10)
composer phpstan
Originally created by @jakubledl, extended by @WalterWoshid, maintained by the GoAOP team.
Give a โญ if Dissect saved you from writing a parser by hand!
How can I help you explore Laravel packages today?