Nom-like parser combinators for MoonBit.
///| Example: parse an integer with optional whitespace
fn parse_int_ws(input : StringView) -> @nom.IResult[StringView, Int] {
let parser = @nom.delimited(
@nom/str.space0,
@nom/str.int,
@nom/str.space0,
)
parser(input)
}
///|
test "parse int with ws" {
let input = " 123 "[:]
match parse_int_ws(input) {
Ok((value, rest)) => {
assert_eq(value, 123)
assert_true(rest.is_empty())
}
Err(_) => fail("parse failed")
}
}///| Example: streaming string buffer
let parser = @nom/str.tag("abc"[:])
let stream0 = @nom/str.Stream::new()
let stream1 = stream0.feed("a"[:])
let (res1, stream1b) = stream1.parse(parser)
// res1 is Err::Incomplete(_)
let stream2 = stream1b.feed("bc"[:])
let (res2, stream3) = stream2.parse(parser)
// res2 is Ok(("abc", "")) and stream3 is now empty| case | MoonBit (µs) | Rust/nom (µs) | ratio |
|---|---|---|---|
| calc short | 0.66 | 0.259 | 2.55x |
| calc long | 3.82 | 1.718 | 2.22x |
| calc complex short | 1.59 | 0.815 | 1.95x |
| calc complex long | 4.07 | 2.145 | 1.90x |
| assignments unicode short | 0.90 | 0.591 | 1.52x |
| assignments unicode long | 3.71 | 2.617 | 1.42x |
pub trait InputLen {
length(Self) -> Int
}fn[I : InputLen, O] all_consuming(parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O] alt(parsers : Array[(I) -> Result[(O, I), Err[ParseError[I]]]]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O] alt2(first : (I) -> Result[(O, I), Err[ParseError[I]]], second : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O] complete(parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O] context(label : String, parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O] cut(parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O1, O2, O3] delimited(open : (I) -> Result[(O1, I), Err[ParseError[I]]], inner : (I) -> Result[(O2, I), Err[ParseError[I]]], close : (I) -> Result[(O3, I), Err[ParseError[I]]]) -> ((I) -> Result[(O2, I), Err[ParseError[I]]])fn[I : InputLen, O, R] fold_many0(parser : (I) -> Result[(O, I), Err[ParseError[I]]], init : () -> R, fold : (R, O) -> R) -> ((I) -> Result[(R, I), Err[ParseError[I]]])fn[I : InputLen, O, R] fold_many1(parser : (I) -> Result[(O, I), Err[ParseError[I]]], init : (O) -> R, fold : (R, O) -> R) -> ((I) -> Result[(R, I), Err[ParseError[I]]])fn[I : InputLen, O] many0(parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(Array[O], I), Err[ParseError[I]]])fn[I : InputLen, O] many1(parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(Array[O], I), Err[ParseError[I]]])fn[I, O, O2] map(parser : (I) -> Result[(O, I), Err[ParseError[I]]], f : (O) -> O2) -> ((I) -> Result[(O2, I), Err[ParseError[I]]])fn[I, O] map_err(parser : (I) -> Result[(O, I), Err[ParseError[I]]], f : (ParseError[I]) -> ParseError[I]) -> ((I) -> Result[(O, I), Err[ParseError[I]]])fn[I, O, O2, E2] map_res(parser : (I) -> Result[(O, I), Err[ParseError[I]]], f : (O) -> Result[O2, E2], kind : ErrorKind) -> ((I) -> Result[(O2, I), Err[ParseError[I]]])fn[I, O] opt(parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O?, I), Err[ParseError[I]]])fn[I, O1, O2] pair(first : (I) -> Result[(O1, I), Err[ParseError[I]]], second : (I) -> Result[(O2, I), Err[ParseError[I]]]) -> ((I) -> Result[((O1, O2), I), Err[ParseError[I]]])fn[I, O1, O2] preceded(first : (I) -> Result[(O1, I), Err[ParseError[I]]], second : (I) -> Result[(O2, I), Err[ParseError[I]]]) -> ((I) -> Result[(O2, I), Err[ParseError[I]]])fn[I : InputLen, O, S] separated_list0(sep : (I) -> Result[(S, I), Err[ParseError[I]]], parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(Array[O], I), Err[ParseError[I]]])fn[I : InputLen, O, S] separated_list1(sep : (I) -> Result[(S, I), Err[ParseError[I]]], parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(Array[O], I), Err[ParseError[I]]])fn[I, O1, O2] terminated(first : (I) -> Result[(O1, I), Err[ParseError[I]]], second : (I) -> Result[(O2, I), Err[ParseError[I]]]) -> ((I) -> Result[(O1, I), Err[ParseError[I]]])fn[I, O, O2] value(v : O2, parser : (I) -> Result[(O, I), Err[ParseError[I]]]) -> ((I) -> Result[(O2, I), Err[ParseError[I]]])Nom-like parser combinators for MoonBit.