~/bend-docscommunity

parse.bend checks

raw source on the hub · import 0x154e0a68ef9a0223bacaacefc589cad8/parse.bend as Parse

Parser combinators over text, with positioned errors. Source: https://github.com/paymog/bend-kit/tree/main/parse

1 import
import Base

Types

type Cur source · line 10 · raw

Data

left is the length of s: loops use it as fuel. Build a Cur with start.

type Res source · line 14 · raw

@-A:Data -> Data

off is the char offset of the failure; want names what was expected there.

type Step source · line 19 · raw

@-A:Data -> @-F:Data -> Data

One step of rec: a finished value, or a frame that wants a child value.

Definitions

def Both source · line 24 · raw

@-A:Data -> @-B:Data -> Data

A reusable pair (a, b); A & B is not Data.

def start source · line 27 · raw

@+s:String -> Cur

def off source · line 30 · raw

@c:Cur -> U32

def fuel source · line 35 · raw

@c:Cur -> Nat

def dec source · line 40 · raw

@n:Nat -> Nat

def quote source · line 47 · raw

@s:String -> String

def satisfy.if source · line 53 · raw

@ok:Bool -> @+h:U32 -> @t:String -> @+o:U32 -> @n:Nat -> @want:String -> Res<U32>

def char source · line 71 · raw

@+w:U32 -> @c:Cur -> Res<U32>

The char w.

def lit.if source · line 80 · raw

@ok:Bool -> @+w:String -> @+s:String -> @+o:U32 -> @n:Nat -> Res<String>

def lit source · line 89 · raw

@+w:String -> @c:Cur -> Res<String>

The string w.

def eof source · line 120 · raw

@c:Cur -> Res<Unit>

def pure source · line 132 · raw

@-A:Data -> @v:A -> @c:Cur -> Res<A>

def fail source · line 135 · raw

@-A:Data -> @want:String -> @c:Cur -> Res<A>

def seq.b source · line 159 · raw

@-A:Data -> @-B:Data -> @v:A -> @r:Res<B> -> Res<Both(A, B)>

def keep.b source · line 177 · raw

@-A:Data -> @-B:Data -> @v:A -> @r:Res<B> -> Res<A>

def alt.join source · line 206 · raw

@same:Bool -> @w1:String -> @w2:String -> String

def alt.pick source · line 214 · raw

@-A:Data -> @k:Cmp -> @+o1:U32 -> @+w1:String -> @+o2:U32 -> @+w2:String -> Res<A>

The error that got further wins; at the same offset, both wants join.

def alt.e source · line 223 · raw

@-A:Data -> @+o1:U32 -> @+w1:String -> @r:Res<A> -> Res<A>

def opt.r source · line 241 · raw

@-A:Data -> @c:Cur -> @r:Res<A> -> Res<Maybe<&2, A>>

def progress.if source · line 252 · raw

@-A:Data -> @ok:Bool -> @v:A -> @c:Cur -> @+o:U32 -> Res<A>

def progress source · line 260 · raw

@-A:Data -> @+o:U32 -> @r:Res<A> -> Res<A>

A success that took no input fails, so loops end.

def cons.r source · line 282 · raw

@-A:Data -> @v:A -> @r:Res<List<&2, A>> -> Res<List<&2, A>>

def text.r source · line 300 · raw

@-A:Data -> @+s:String -> @+o:U32 -> @r:Res<A> -> Res<String>

def nil.r source · line 324 · raw

@-A:Data -> @c:Cur -> @r:Res<List<&2, A>> -> Res<List<&2, A>>

def res.off source · line 335 · raw

@-A:Data -> @r:Res<A> -> U32

Templates

template satisfy source · line 61 · raw

@-f:(@+c:U32 -> Bool) -> @want:String -> @c:Cur -> Res<U32>

One char c with f(c); the value is its code.

template take_while.go source · line 95 · raw

@-f:(@+c:U32 -> Bool) -> @t:String -> @+h:U32 -> @+o:U32 -> @n:Nat -> @acc:String -> @ok:Bool -> Res<String>

h is the next char and t the text after it; ok is f(h).

template take_while source · line 111 · raw

@-f:(@+c:U32 -> Bool) -> @c:Cur -> Res<String>

The longest run of chars with f; it can be empty.

template map.r source · line 138 · raw

@-A:Data -> @-B:Data -> @-f:(@_:A -> B) -> @r:Res<A> -> Res<B>

template map source · line 145 · raw

@-A:Data -> @-B:Data -> @-f:(@_:A -> B) -> @-p:(@_:Cur -> Res<A>) -> @c:Cur -> Res<B>

template bind.r source · line 148 · raw

@-A:Data -> @-B:Data -> @-k:(@_:A -> @_:Cur -> Res<B>) -> @r:Res<A> -> Res<B>

template bind source · line 156 · raw

@-A:Data -> @-B:Data -> @-p:(@_:Cur -> Res<A>) -> @-k:(@_:A -> @_:Cur -> Res<B>) -> @c:Cur -> Res<B>

p, then the parser k picks from p's value.

template seq.a source · line 166 · raw

@-A:Data -> @-B:Data -> @-q:(@_:Cur -> Res<B>) -> @r:Res<A> -> Res<Both(A, B)>

template seq source · line 174 · raw

@-A:Data -> @-B:Data -> @-p:(@_:Cur -> Res<A>) -> @-q:(@_:Cur -> Res<B>) -> @c:Cur -> Res<Both(A, B)>

p, then q; both values.

template keep.a source · line 184 · raw

@-A:Data -> @-B:Data -> @-q:(@_:Cur -> Res<B>) -> @r:Res<A> -> Res<A>

template left source · line 192 · raw

@-A:Data -> @-B:Data -> @-p:(@_:Cur -> Res<A>) -> @-q:(@_:Cur -> Res<B>) -> @c:Cur -> Res<A>

p, then q; p's value.

template skip.a source · line 195 · raw

@-A:Data -> @-B:Data -> @-q:(@_:Cur -> Res<B>) -> @r:Res<A> -> Res<B>

template alt.r source · line 230 · raw

@-A:Data -> @-q:(@_:Cur -> Res<A>) -> @c:Cur -> @r:Res<A> -> Res<A>

template alt source · line 238 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @-q:(@_:Cur -> Res<A>) -> @+c:Cur -> Res<A>

p; if it fails, q from the same place.

template opt source · line 249 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @+c:Cur -> Res<Maybe<&2, A>>

p, or None with no input taken.

template many.go source · line 267 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @fuel:Nat -> @c:Cur -> @acc:List<&2, A> -> @r:Res<A> -> Res<List<&2, A>>

template many source · line 279 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @+c:Cur -> Res<List<&2, A>>

p zero or more times, until it fails or takes no input.

template many1.r source · line 289 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @r:Res<A> -> Res<List<&2, A>>

template many1 source · line 297 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @c:Cur -> Res<List<&2, A>>

p one or more times.

template text source · line 308 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @c:Cur -> Res<String>

p; the value is the text p took.

template sep_by1.r source · line 313 · raw

@-A:Data -> @-S:Data -> @-p:(@_:Cur -> Res<A>) -> @-sep:(@_:Cur -> Res<S>) -> @r:Res<A> -> Res<List<&2, A>>

template sep_by1 source · line 321 · raw

@-A:Data -> @-S:Data -> @-p:(@_:Cur -> Res<A>) -> @-sep:(@_:Cur -> Res<S>) -> @c:Cur -> Res<List<&2, A>>

p one or more times, with sep between.

template sep_by source · line 332 · raw

@-A:Data -> @-S:Data -> @-p:(@_:Cur -> Res<A>) -> @-sep:(@_:Cur -> Res<S>) -> @+c:Cur -> Res<List<&2, A>>

p zero or more times, with sep between.

template rec.go source · line 342 · raw

@-A:Data -> @-F:Data -> @-open:(@_:Cur -> Res<Step<A, F>>) -> @-next:(@_:F -> @_:A -> @_:Cur -> Res<Step<A, F>>) -> @fuel:Nat -> @r:Res<Step<A, F>> -> @stack:List<&2, F> -> Res<A>

template rec source · line 366 · raw

@-A:Data -> @-F:Data -> @-open:(@_:Cur -> Res<Step<A, F>>) -> @-next:(@_:F -> @_:A -> @_:Cur -> Res<Step<A, F>>) -> @+c:Cur -> Res<A>

A nested value. At a value, open gives a Leaf, or an Open frame that wants a child. When a child v ends inside frame f, next(f, v) gives the finished container as a Leaf, or the frame for the next child as an Open. Each step must take input.

template run source · line 372 · raw

@-A:Data -> @-p:(@_:Cur -> Res<A>) -> @+s:String -> Res<A>

p over all of s.