PHPackages                             vanderlee/comprehend - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. vanderlee/comprehend

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

vanderlee/comprehend
====================

Framework for building BNF LR(1) parsers

1.0.2(7y ago)8172[2 issues](https://github.com/vanderlee/Comprehend/issues)MITPHPPHP &gt;=7.0.0

Since Sep 26Pushed 2y ago2 watchersCompare

[ Source](https://github.com/vanderlee/Comprehend)[ Packagist](https://packagist.org/packages/vanderlee/comprehend)[ Docs](https://github.com/vanderlee/Comprehend)[ RSS](/packages/vanderlee-comprehend/feed)WikiDiscussions master Synced 2w ago

READMEChangelogDependencies (3)Versions (4)Used By (0)

Comprehend - a PHP \*BNF parser framework
=========================================

[](#comprehend---a-php-bnf-parser-framework)

Build object oriented [LR(1)](https://en.wikipedia.org/wiki/Canonical_LR_parser) lexer, tokenizers and parsers in PHP using BNF-based syntax.

[![Packagist](https://camo.githubusercontent.com/249d5baad305399bf92a6b41e208ae50eb5bb9428bd1ba67cc84c0c1372fd69e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f76616e6465726c65652f636f6d70726568656e642e737667)](https://packagist.org/packages/vanderlee/comprehend)[![PHP from Packagist](https://camo.githubusercontent.com/fa000befa84e216e3c3e26b34651104eefd8bc01c6ff3ca33e5a6247387a3028/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f76616e6465726c65652f636f6d70726568656e642e737667)](http://php.net/supported-versions.php)[![Packagist](https://camo.githubusercontent.com/a8e079ead498f068b735af29d32b73ffd1059ef63937ee3adb2672cdf5f25cac/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f76616e6465726c65652f636f6d70726568656e642e737667)](http://www.opensource.org/licenses/mit-license.php)

[![Scrutinizer Code Quality](https://camo.githubusercontent.com/b5291d41830722bf62d337c728253c669d41ab0d8af94eaf5ac704e07451b625/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f76616e6465726c65652f436f6d70726568656e642f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/vanderlee/Comprehend/?branch=master)[![Build Status](https://camo.githubusercontent.com/18c7eeafbbf55a0a81c8ee23bfffa4ff8c26ff5cd3cc6068471c843926da6b4c/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f76616e6465726c65652f436f6d70726568656e642f6261646765732f6275696c642e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/vanderlee/Comprehend/build-status/master)[![Code Coverage](https://camo.githubusercontent.com/9e5b8e7a5cca5ba197799de0bfc193f9eb1a1cc9f4e8b5f07e2cf99f8aca6b41/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f76616e6465726c65652f436f6d70726568656e642f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/vanderlee/Comprehend/?branch=master)[![Codacy Badge](https://camo.githubusercontent.com/88d3c117f67026af6e52d3e0c130baf41249209118e3f294a90595de5ec048a7/68747470733a2f2f6170692e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6330363531353463306635323464353562363736376636656438613138363537)](https://www.codacy.com/app/vanderlee/Comprehend?utm_source=github.com&utm_medium=referral&utm_content=vanderlee/Comprehend&utm_campaign=Badge_Grade)[![Travis (.org)](https://camo.githubusercontent.com/89c2d2356b31351897f8ed664f7e4cf6448a7c77cdb67ac2d235050d2a0553e5/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f76616e6465726c65652f436f6d70726568656e642e7376673f6c6162656c3d5472617669732d4349)](https://camo.githubusercontent.com/89c2d2356b31351897f8ed664f7e4cf6448a7c77cdb67ac2d235050d2a0553e5/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f76616e6465726c65652f436f6d70726568656e642e7376673f6c6162656c3d5472617669732d4349)[![Maintainability](https://camo.githubusercontent.com/1bd9f4d6a3b2c5a231fd2854ac213f2307446534f0f92948a66d4000dd966953/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f33626433386562613766343931326266326636362f6d61696e7461696e6162696c697479)](https://codeclimate.com/github/vanderlee/Comprehend/maintainability)

Copyright © 2011-2024 Martijn W. van der Lee [Toyls.com](https://toyls.com), MIT license applies.

Features
--------

[](#features)

- Closely follows BNF syntax using objects as operands.
- Includes various pre-defined RFC syntax rules.
- Whitespace skipping.
- Support for tokenizing.
- Add your own custom parsers.
- Create full sets of rules.
- Optional case (in)sensitivity.

Example
-------

[](#example)

### ABNF

[](#abnf)

```
word	= [A-Za-z]+
list	= word *[ ',' word ]

```

### Comprehend, using objects:

[](#comprehend-using-objects)

```
$word	= new Repeat(new Regex('/[a-z][A-Z]/'), 1);
$list	= new Sequence($word, new Repeat(new Sequence(',', $word)));

```

### Comprehend, using objects and array notation:

[](#comprehend-using-objects-and-array-notation)

```
$word	= new Repeat(new Regex('/[a-z][A-Z]/'), 1);
$list	= new Sequence($word, new Repeat([',', $word]));

```

### Comprehend, using library functions:

[](#comprehend-using-library-functions)

```
$word	= plus(regex('/[a-z][A-Z]/'));
$list	= s($word, star([',', $word]));

```

### Comprehend, using Ruleset constructor

[](#comprehend-using-ruleset-constructor)

```
$list   = new Ruleset([
    'word'           => plus(regex('/[a-z][A-Z]/')),
    Ruleset::ROOT => s($word, star([',', $word])),
]);

```

###  Health Score

27

—

LowBetter than 47% of packages

Maintenance15

Infrequent updates — may be unmaintained

Popularity13

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~3 days

Total

3

Last Release

2828d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/59428f021d3985e299ebd676bbe50fa592430f8dd1d57af38df8833b19079ee8?d=identicon)[vanderlee](/maintainers/vanderlee)

---

Top Contributors

[![vanderlee](https://avatars.githubusercontent.com/u/649240?v=4)](https://github.com/vanderlee "vanderlee (76 commits)")

---

Tags

parserlexertokenizerastbnfabnf

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/vanderlee-comprehend/health.svg)

```
[![Health](https://phpackages.com/badges/vanderlee-comprehend/health.svg)](https://phpackages.com/packages/vanderlee-comprehend)
```

###  Alternatives

[doctrine/lexer

PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.

11.2k942.7M153](/packages/doctrine-lexer)[cerbero/json-parser

Zero-dependencies pull parser to read large JSON from any source in a memory-efficient way.

804588.3k5](/packages/cerbero-json-parser)[jakubledl/dissect

Lexing and parsing in pure PHP

2244.7M11](/packages/jakubledl-dissect)[creof/geo-parser

Parser for geography coordinate strings

624.6M15](/packages/creof-geo-parser)[creof/wkt-parser

Parser for well-known text (WKT) object strings

545.0M16](/packages/creof-wkt-parser)[tmilos/lexer

Lexical analyzer with individual token definition with regular expressions

211.9M2](/packages/tmilos-lexer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
