The modern PEG parser combinator for python
Project description
# Trishula - The modern parser combinator for Python 3
Trishula is a parser combinator library extended PEG syntaxes, inspired by Parsimmon(ES) and boost::spirit::qi(C++).
Trishula supports python version >= 3.7.0
## Examples
```python
grammar = (
Value("aaa")
>> (Value("bbb") | Value("ccc"))
>> (+Value("eee") >= (lambda x: "modified"))
>> -Value("f")
>> Value("g")
>> Regexp(r"a+")
>> Not(Value("hhh"))
)
# This works
print(vars(Parser().parse(grammar, "aaaccceeeeeeeeeeeefgaaa")))
# {
# 'status': <Status.SUCCEED: 1>,
# 'index': 23,
# 'value': [[[[[['aaa', 'ccc'], 'modified'], 'f'], 'g'], 'aaa'], None]
# }
```
You can see examples in ["example" directory](https://github.com/minamorl/trishula/blob/master/example) (execute it under example directory).
## Description
Grammers can be defined by **Value** and **Regexp** primitive and operators. Below we describe operators.
## Operators
As mentioned above, Trishula uses many operator overloads to make definition of parsers be easier.
| operator | result |
----|----
| >> | Sequence |
| \| | OrderedChoise |
| ~ | ZeroOrMore |
| + | OneOrMore |
| - | Optional |
| >= | Map |
| @ | NamedParser |
and we have classes named **Not** and **And**, which are made for prediction.
## Recursion
Trishula supports recursion with `Ref`. Recursion can be written like this:
```python
def grammar():
return (
(Value("[]") >= (lambda x: [])) |
((
Value("[") >>
Ref(grammar) >>
Value("]")
) >= (lambda x: [x[0][1]]))
)
def main():
result = Parser().parse(grammar(), "[[[]]]")
print(vars(result))
# => {'status': <Status.SUCCEED: 1>, 'index': 6, 'value': [[[]]]}
```
Be aware that `Ref` executes function only once so that parser can be memorized.
## Namespace
Namespace is one of Trishula's powerful features. You can name your parser and retrieve values with map (as dict).
Usage is simple. Mark the parser with `@` operator like `parser @ "name"` and surround with `Namespace(parser)`. Then you can grab values with `Namespace(parser) => fn`. fn is a callable taking dict type and returns new value.
```python
import trishula as T
def main():
grammar = T.Namespace(
T.Value("[") >> (T.Regexp(r"[0-9]+") >= (float)) @ "value" >> T.Value("]")
) >= (lambda a_dict: a_dict["value"])
result = T.Parser().parse(grammar, "[12345]")
print(vars(result))
# ==> {'status': <Status.SUCCEED: 1>, 'index': 7, 'value': 12345.0, 'namespace': {}}
main()
```
Note that after mapped function called, internal namespace is cleaned up with empty dict.
Trishula is a parser combinator library extended PEG syntaxes, inspired by Parsimmon(ES) and boost::spirit::qi(C++).
Trishula supports python version >= 3.7.0
## Examples
```python
grammar = (
Value("aaa")
>> (Value("bbb") | Value("ccc"))
>> (+Value("eee") >= (lambda x: "modified"))
>> -Value("f")
>> Value("g")
>> Regexp(r"a+")
>> Not(Value("hhh"))
)
# This works
print(vars(Parser().parse(grammar, "aaaccceeeeeeeeeeeefgaaa")))
# {
# 'status': <Status.SUCCEED: 1>,
# 'index': 23,
# 'value': [[[[[['aaa', 'ccc'], 'modified'], 'f'], 'g'], 'aaa'], None]
# }
```
You can see examples in ["example" directory](https://github.com/minamorl/trishula/blob/master/example) (execute it under example directory).
## Description
Grammers can be defined by **Value** and **Regexp** primitive and operators. Below we describe operators.
## Operators
As mentioned above, Trishula uses many operator overloads to make definition of parsers be easier.
| operator | result |
----|----
| >> | Sequence |
| \| | OrderedChoise |
| ~ | ZeroOrMore |
| + | OneOrMore |
| - | Optional |
| >= | Map |
| @ | NamedParser |
and we have classes named **Not** and **And**, which are made for prediction.
## Recursion
Trishula supports recursion with `Ref`. Recursion can be written like this:
```python
def grammar():
return (
(Value("[]") >= (lambda x: [])) |
((
Value("[") >>
Ref(grammar) >>
Value("]")
) >= (lambda x: [x[0][1]]))
)
def main():
result = Parser().parse(grammar(), "[[[]]]")
print(vars(result))
# => {'status': <Status.SUCCEED: 1>, 'index': 6, 'value': [[[]]]}
```
Be aware that `Ref` executes function only once so that parser can be memorized.
## Namespace
Namespace is one of Trishula's powerful features. You can name your parser and retrieve values with map (as dict).
Usage is simple. Mark the parser with `@` operator like `parser @ "name"` and surround with `Namespace(parser)`. Then you can grab values with `Namespace(parser) => fn`. fn is a callable taking dict type and returns new value.
```python
import trishula as T
def main():
grammar = T.Namespace(
T.Value("[") >> (T.Regexp(r"[0-9]+") >= (float)) @ "value" >> T.Value("]")
) >= (lambda a_dict: a_dict["value"])
result = T.Parser().parse(grammar, "[12345]")
print(vars(result))
# ==> {'status': <Status.SUCCEED: 1>, 'index': 7, 'value': 12345.0, 'namespace': {}}
main()
```
Note that after mapped function called, internal namespace is cleaned up with empty dict.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
trishula-0.0.7.tar.gz
(3.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trishula-0.0.7.tar.gz.
File metadata
- Download URL: trishula-0.0.7.tar.gz
- Upload date:
- Size: 3.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24a0959e424c778cd1bd81471c804fb053b432e0e6cfbebf21e398c7809a659a
|
|
| MD5 |
ad9a8ff50c85d85f54413d132f1b25ef
|
|
| BLAKE2b-256 |
d07a1d00e9401c4dac945c32732ff6fba15c7414741f0e4ec620e0e2d3e76ad6
|
File details
Details for the file trishula-0.0.7-py3-none-any.whl.
File metadata
- Download URL: trishula-0.0.7-py3-none-any.whl
- Upload date:
- Size: 3.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb40448a3285b5a7d82c8f18ed98cd4ec14a1da09d7f9319085579272444c31a
|
|
| MD5 |
c3186567dae593822fc66571b24e565a
|
|
| BLAKE2b-256 |
09ebaf1d4030d87a32529bd41d8b46601dc9acee2ec51616aae4a3b9b4e81ff0
|