adds much doc
This commit is contained in:
parent
d063ebbac6
commit
b6be039b5e
1 changed files with 170 additions and 4 deletions
|
@ -24,6 +24,15 @@ def regex(pattern: str):
|
||||||
|
|
||||||
|
|
||||||
def just(word: str):
|
def just(word: str):
|
||||||
|
"""
|
||||||
|
## Just word
|
||||||
|
Parses this word and stops. Producing a string containing that word.
|
||||||
|
```py
|
||||||
|
parser = just("arbre")
|
||||||
|
parsed = parser.parse("arbre")
|
||||||
|
assert parsed == "arbre"
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(JustTransform(word))
|
return Parser(JustTransform(word))
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,6 +48,9 @@ class Parser(Generic[P]):
|
||||||
inner: "Transformer[P]"
|
inner: "Transformer[P]"
|
||||||
|
|
||||||
def parse(self, stream: str) -> P:
|
def parse(self, stream: str) -> P:
|
||||||
|
"""
|
||||||
|
Parses a string until the end into the produced type P.
|
||||||
|
"""
|
||||||
parser = self.and_(end()).map(lambda value : value[0])
|
parser = self.and_(end()).map(lambda value : value[0])
|
||||||
parsed = parser.inner.parse(stream, 0)
|
parsed = parser.inner.parse(stream, 0)
|
||||||
if isinstance(parsed, Failure):
|
if isinstance(parsed, Failure):
|
||||||
|
@ -46,48 +58,202 @@ class Parser(Generic[P]):
|
||||||
return parsed.value
|
return parsed.value
|
||||||
|
|
||||||
def and_(self, other: "Parser[T]"):
|
def and_(self, other: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## P and T
|
||||||
|
Parses this, and then other ; producing a tuple of both types.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").and_(just("mort"))
|
||||||
|
parsed = parser.parse("arbremort")
|
||||||
|
assert parsed == ("arbre", "mort")
|
||||||
|
```
|
||||||
|
Shorthand operator is `&` :
|
||||||
|
```py
|
||||||
|
just("arbre") & just("mort")
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(AndTransform(self.inner, other.inner))
|
return Parser(AndTransform(self.inner, other.inner))
|
||||||
|
|
||||||
def or_(self, other: "Parser[T]"):
|
def or_(self, other: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## P Or T
|
||||||
|
Parses this, or else other ; producing a union of both types.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").or_(just("mort"))
|
||||||
|
parsed = parser.parse("mort")
|
||||||
|
assert parsed == "mort"
|
||||||
|
```
|
||||||
|
Shorthand operator is `|` :
|
||||||
|
```py
|
||||||
|
just("arbre") | just("mort")
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(OrTransform(self.inner, other.inner))
|
return Parser(OrTransform(self.inner, other.inner))
|
||||||
|
|
||||||
def or_not(self):
|
def or_not(self):
|
||||||
|
"""
|
||||||
|
## P Or not
|
||||||
|
Parses this, or else `None` ; producing an optional of P.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").or_not()
|
||||||
|
parsed = parser.parse("mort")
|
||||||
|
assert parsed == None
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(OptionTransform(self.inner))
|
return Parser(OptionTransform(self.inner))
|
||||||
|
|
||||||
def repeat(self):
|
def repeat(self):
|
||||||
|
"""
|
||||||
|
## Repeat P
|
||||||
|
Parses P zero or more times ; producing a list of P.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").repeat()
|
||||||
|
parsed = parser.parse("arbrearbre")
|
||||||
|
assert parsed == ["arbre", "arbre"]
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(ListTransform(self.inner))
|
return Parser(ListTransform(self.inner))
|
||||||
|
|
||||||
def map(self, transform: Callable[[P], O]):
|
def map(self, transform: Callable[[P], O]):
|
||||||
|
"""
|
||||||
|
## Maps P into O
|
||||||
|
Parses P and then converts it into an O using the provided transform.
|
||||||
|
Produces an O.
|
||||||
|
```py
|
||||||
|
parser = just("ar").repeat().map(lambda w: len(w))
|
||||||
|
parsed = parser.parse("ararar")
|
||||||
|
assert parsed == 3
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(MapTransform(self.inner, transform))
|
return Parser(MapTransform(self.inner, transform))
|
||||||
|
|
||||||
def set(self, value: T) -> "Parser[T]":
|
def set(self, value: T) -> "Parser[T]":
|
||||||
|
"""
|
||||||
|
## Sets P to T
|
||||||
|
Parses P and then sets its value to the passed T.
|
||||||
|
Produces a T.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").set("1") | just("mort").set("2")
|
||||||
|
parsed = parser.parse("arbre")
|
||||||
|
assert parsed == 1
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(ValueTransform(self.inner, value))
|
return Parser(ValueTransform(self.inner, value))
|
||||||
|
|
||||||
def sep_by(self, sep: "Parser[T]"):
|
def sep_by(self, sep: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## Separate Ps with Ts
|
||||||
|
Parses a list of `P` separated by one `T` between each two `P`.
|
||||||
|
Produces a list of P and discards the Ts.
|
||||||
|
```py
|
||||||
|
parser = just("a").sep_by(",")
|
||||||
|
parsed = parser.parse("a,a,a")
|
||||||
|
assert parsed == ["a", "a", "a"]
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(SepListTransform(self.inner, sep.inner))
|
return Parser(SepListTransform(self.inner, sep.inner))
|
||||||
|
|
||||||
def join(self: "Parser[list[str]]", join: str = ""):
|
def join(self: "Parser[list[str]]", join: str = ""):
|
||||||
|
"""
|
||||||
|
## Joins a list of str
|
||||||
|
Parses a list of `str` and joins the elements of the list by filling gaps with a given join value (defaults to `""`).
|
||||||
|
Produces a single `str`.
|
||||||
|
```py
|
||||||
|
parser = just("a").sep_by(",").join()
|
||||||
|
parsed = parser.parse("a,a,a")
|
||||||
|
assert parsed == "aaa"
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(JoinTransform(self.inner, join))
|
return Parser(JoinTransform(self.inner, join))
|
||||||
|
|
||||||
def concat(self: "Parser[tuple[str,str]]", join: str = ""):
|
def concat(self: "Parser[tuple[str,str]]", join: str = ""):
|
||||||
|
"""
|
||||||
|
## Concatenates P[0] and P[1]
|
||||||
|
Parses a tuple of (`str`, `str`) and joins the left, and right `str` with a given join value (defaults to `""`).
|
||||||
|
Produces a single str.
|
||||||
|
```py
|
||||||
|
parser = (just("a") & just("b")).concat("@")
|
||||||
|
parsed = parser.parse("ab")
|
||||||
|
assert parsed == "a@b"
|
||||||
|
```
|
||||||
|
Shorthand operator is `+` :
|
||||||
|
```py
|
||||||
|
just("a") + just("b")
|
||||||
|
```
|
||||||
|
"""
|
||||||
return Parser(ConcatTransform(self.inner, join))
|
return Parser(ConcatTransform(self.inner, join))
|
||||||
|
|
||||||
# |
|
|
||||||
def __or__(self, other: "Parser[T]"):
|
|
||||||
return self.or_(other)
|
|
||||||
|
|
||||||
# &
|
# &
|
||||||
def __and__(self, other: "Parser[T]"):
|
def __and__(self, other: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## P and T
|
||||||
|
Parses this, and then other ; producing a tuple of both types.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").and_(just("mort"))
|
||||||
|
parsed = parser.parse("arbremort")
|
||||||
|
assert parsed == ("arbre", "mort")
|
||||||
|
```
|
||||||
|
Shorthand operator is `&` :
|
||||||
|
```py
|
||||||
|
just("arbre") & just("mort")
|
||||||
|
```
|
||||||
|
"""
|
||||||
return self.and_(other)
|
return self.and_(other)
|
||||||
|
|
||||||
|
# |
|
||||||
|
def __or__(self, other: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## P Or T
|
||||||
|
Parses this, or else other ; producing a union of both types.
|
||||||
|
```py
|
||||||
|
parser = just("arbre").or_(just("mort"))
|
||||||
|
parsed = parser.parse("mort")
|
||||||
|
assert parsed == "mort"
|
||||||
|
```
|
||||||
|
Shorthand operator is `|` :
|
||||||
|
```py
|
||||||
|
just("arbre") | just("mort")
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
return self.or_(other)
|
||||||
|
|
||||||
# >>
|
# >>
|
||||||
def __rshift__(self, other: "Parser[T]"):
|
def __rshift__(self, other: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## P and T
|
||||||
|
Parses this, then other and discards the left value, producing a T.
|
||||||
|
```py
|
||||||
|
parser = just("arbre") >> just("mort")
|
||||||
|
parsed = parser.parse("arbremort")
|
||||||
|
assert parsed == "mort"
|
||||||
|
"""
|
||||||
return self.and_(other).map(lambda v: v[1])
|
return self.and_(other).map(lambda v: v[1])
|
||||||
|
|
||||||
# <<
|
# <<
|
||||||
def __lshift__(self, other: "Parser[T]"):
|
def __lshift__(self, other: "Parser[T]"):
|
||||||
|
"""
|
||||||
|
## P and T
|
||||||
|
Parses this, then other and discards the right value, producing a P.
|
||||||
|
```py
|
||||||
|
parser = just("arbre") << just("mort")
|
||||||
|
parsed = parser.parse("arbremort")
|
||||||
|
assert parsed == "arbre"
|
||||||
|
"""
|
||||||
return self.and_(other).map(lambda v: v[0])
|
return self.and_(other).map(lambda v: v[0])
|
||||||
|
|
||||||
# +
|
# +
|
||||||
def __add__(self: "Parser[str]", other: "Parser[str]"):
|
def __add__(self: "Parser[str]", other: "Parser[str]"):
|
||||||
|
"""
|
||||||
|
## Concatenates P[0] and P[1]
|
||||||
|
Parses a tuple of (`str`, `str`) and joins the left, and right `str` with a given join value (defaults to `""`).
|
||||||
|
Produces a single str.
|
||||||
|
```py
|
||||||
|
parser = (just("a") & just("b")).concat("@")
|
||||||
|
parsed = parser.parse("ab")
|
||||||
|
assert parsed == "a@b"
|
||||||
|
```
|
||||||
|
Shorthand operator is `+` :
|
||||||
|
```py
|
||||||
|
just("a") + just("b")
|
||||||
|
```
|
||||||
|
"""
|
||||||
return self.and_(other).concat()
|
return self.and_(other).concat()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue