https://github.com/jakebailey/comb
Parser combinator framework
https://github.com/jakebailey/comb
Last synced: 9 days ago
JSON representation
Parser combinator framework
- Host: GitHub
- URL: https://github.com/jakebailey/comb
- Owner: jakebailey
- License: mit
- Created: 2017-03-19T06:54:09.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-03-28T16:26:43.000Z (about 9 years ago)
- Last Synced: 2025-11-12T22:31:53.019Z (7 months ago)
- Language: Go
- Size: 647 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# comb parser combinator framework
comb is an efficient parser combinator framework.
comb offers various useful parsers, including nonterminals such as
characters, character ranges, tokens, and regular expressions. Also
included are sequences, repetitions, and optional parsers.
For example, here is a parser that recognizes the decimal, octal,
and hex integers accepted in Go.
```go
var integerParser = comb.SequenceRunes(
comb.Maybe(
comb.Char('-'),
),
comb.Or(
comb.SequenceRunes(
comb.Token("0x", "0X"),
comb.OnePlusRunes(
comb.Or(
comb.CharRange('a', 'z'),
comb.CharRange('a', 'z'),
combext.Digit(),
),
),
),
combext.Digits(),
),
)
```
(Though, this is more succinctly expressed with a regular expression,
giving a moderate performance gain.)
comb uses a scanner which traverses a rune slice. All builtin parsers
return results that are simply slices of the original data, keeping copying
to a minimum.
The `combext` package offers other general-use parsers (such as alpha-numeric
characters, whitespace, etc) that may be frequently needed, though not always
used.
## Examples
In the `_examples` directory, you can find examples of comb in use, including
a recursive expression calculator.
## Other libraries
comb takes inspiration from the following Go parser combinator libraries:
- [jmikkola/parsego](https://github.com/jmikkola/parsego)
- [prataprc/goparsec](https://github.com/prataprc/goparsec)
I tried both of these while writing a parser for another project.
They both offer some amount of good usability and performance,
but not enough to my liking. I thought the changes I would
make would be too breaking to turn into a reasonable PR, so here we are.