view README.md @ 4:ba01d60dd2fc draft

Implement many more smaller combinators, and improve documentation.
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 19 May 2019 13:33:49 +0200
parents 57092e2bbe6c
children 26f8bc28ebfa
line wrap: on
line source

# pcombinators

Working on parser combinators for Python, in an understandable manner. I've
always been fascinated by them, so I wanted to try if I can implement them :-)

For example:

```python

import pcombinators.combinators as c

st = c.ParseState('Hello, World!')
p = c.String('Hello') + c.Regex('([,.]) +') + c.String('World') + c.Regex('[.,?!]')

p.parse(st)
# >> (['Hello', ',', 'World', '!'], ParseState(Hello, World!<>))<Paste>

(Float() + String(" ") + NonEmptyString()).parse(ParseState('1.22 abc'))
# >> ([1.22, ' ', 'abc'], ParseState(1.22 abc<>))

def upper(s):
    return s.upper()

# You can transform parser results with the >> (right shift) operator, and
# repeat parsers with the * (multiplication) operator.

# Parse two non-whitespace strings, converting them to uppercase, and a float,
# multiplying the latter by 2.
(
 (NonEmptyString() >> upper) * 2 +
 (Float() >> (lambda f: f * 2))
).parse(ParseState("hello world 2.2"))
# >> (['HELLO', 'WORLD', 4.4], ParseState(hello world 2.2<>))
```