GitXplorerGitXplorer
j

comb

public
0 stars
0 forks
0 issues

Commits

List of commits on branch master.
Unverified
018e9baa916e97d747a4814657e742d05d96e6e0

don't allocate in Sequence if the first item doesn't match

jjakebailey committed 8 years ago
Unverified
01d0c49798c1a9dd817df49c3b9310960da562ec

move helpers to error file

jjakebailey committed 8 years ago
Unverified
e761acb4d8194b23c3e0774019d93048ab9e1b00

fix example

jjakebailey committed 8 years ago
Unverified
9451556a12ba154fdaff2a73ab7084c9f7958d92

update docs with different tooling

jjakebailey committed 8 years ago
Unverified
d373ffeec3de327ab8a26ce433fe046f73e4f616

combext docs

jjakebailey committed 8 years ago
Unverified
07664dd2a73cab058bf90b7caa4c4020bec3175d

indention

jjakebailey committed 8 years ago

README

The README file for this repository.

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.

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:

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.