MoonParse

    MoonBit 解析器组合子库 — 与生态中其他 combinator 不同:(1)内置完整 JSON 解析器(JsonValue 枚举+双向序列化)和 TOML 解析器,开箱即用;(2)支持二进制解析(u8-u64/LEB128/计数字符串),覆盖 Protobuf 等场景;(3)11 种格式化输出(ANSI/Syslog RFC5424/GELF/JSON/XML);(4)行列号位置追踪+ErrorContext 累积错误上下文。零依赖

    parser
    combinator
    parsing
    json
    toml
    csv
    binary
    leb128
    protobuf
    Download zip
    Author
    Version
    0.1.4
    License
    Apache-2.0
    Last updated
    last month
    Downloads
    44

    #MoonParse

    纯 MoonBit 解析器组合子库,通过组合小解析器构建复杂解析逻辑。

    #安装

    moon add Ljh684/MoonParse

    #许可证

    Apache-2.0

    ErrorContext

    pub(all) struct ErrorContext {
    expected : Array[String]
    errors : Array[ParseError]
    }

    ErrorContext::add_error

    fn ErrorContext::add_error(self : ErrorContext, err : ParseError) -> ErrorContext

    ErrorContext::add_expected

    fn ErrorContext::add_expected(self : ErrorContext, label : String) -> ErrorContext

    ErrorContext::format

    fn ErrorContext::format(self : ErrorContext) -> String

    ErrorContext::new

    JsonValue

    pub(all) enum JsonValue {
    Null
    Bool(Bool)
    Number(Float)
    String(String)
    Array(Array[JsonValue])
    Object(Array[(String, JsonValue)])
    }

    ParseError

    pub(all) struct ParseError {
    message : String
    input : ParseInput
    }

    ParseError::format

    fn ParseError::format(self : ParseError) -> String

    ParseError::new

    fn ParseError::new(msg : String, input : ParseInput) -> ParseError

    ParseInput

    pub(all) struct ParseInput {
    source : String
    pos : Int
    line : Int
    col : Int
    } derive(Eq,
    Debug
    )

    ParseInput::advance

    fn ParseInput::advance(self : ParseInput) -> ParseInput

    ParseInput::advance_by

    fn ParseInput::advance_by(self : ParseInput, n : Int) -> ParseInput

    ParseInput::current

    fn ParseInput::current(self : ParseInput) -> String

    ParseInput::is_eof

    fn ParseInput::is_eof(self : ParseInput) -> Bool

    ParseInput::new

    fn ParseInput::new(source : String) -> ParseInput

    ParseInput::position

    fn ParseInput::position(self : ParseInput) -> String

    ParseInput::remaining

    fn ParseInput::remaining(self : ParseInput) -> String

    ParseInput::slice

    fn ParseInput::slice(self : ParseInput, start_pos : Int, end_pos : Int) -> String

    ParseInput::source_len

    fn ParseInput::source_len(self : ParseInput) -> Int

    alpha

    fn alpha(input : ParseInput) -> (ParseInput, String)?

    alphanumeric

    fn alphanumeric(input : ParseInput) -> (ParseInput, String)?

    alt

    fn[T] alt(p1 : (ParseInput) -> (ParseInput, T)?, p2 : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, T)?

    any_char

    fn any_char(input : ParseInput) -> (ParseInput, String)?

    c_string

    fn c_string(input : ParseInput) -> (ParseInput, String)?

    cond

    fn[T] cond(b : Bool, parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, T)?

    config_comment

    fn config_comment(input : ParseInput) -> (ParseInput, String)?

    counted_string

    fn counted_string(input : ParseInput) -> (ParseInput, String)?

    csv_comma

    fn csv_comma(input : ParseInput) -> (ParseInput, String)?

    csv_field

    fn csv_field(input : ParseInput) -> (ParseInput, String)?

    csv_newline

    fn csv_newline(input : ParseInput) -> (ParseInput, String)?

    delimited

    fn[T, U, V] delimited(left : (ParseInput) -> (ParseInput, T)?, parser : (ParseInput) -> (ParseInput, U)?, right : (ParseInput) -> (ParseInput, V)?, input : ParseInput) -> (ParseInput, U)?

    digit

    fn digit(input : ParseInput) -> (ParseInput, String)?

    eof

    fn eof(input : ParseInput) -> (ParseInput, String)?

    f32_le

    fn f32_le(input : ParseInput) -> (ParseInput, Float)?

    f64_le

    fn f64_le(input : ParseInput) -> (ParseInput, Double)?

    fail

    fn[T] fail(input : ParseInput) -> (ParseInput, T)?

    hex_digit

    fn hex_digit(input : ParseInput) -> (ParseInput, String)?

    http_header_name

    fn http_header_name(input : ParseInput) -> (ParseInput, String)?

    http_header_value

    fn http_header_value(input : ParseInput) -> (ParseInput, String)?

    http_version

    fn http_version(input : ParseInput) -> (ParseInput, String)?

    identifier

    fn identifier(input : ParseInput) -> (ParseInput, String)?

    ini_key

    fn ini_key(input : ParseInput) -> (ParseInput, String)?

    ini_section_name

    fn ini_section_name(input : ParseInput) -> (ParseInput, String)?

    ini_value

    fn ini_value(input : ParseInput) -> (ParseInput, String)?

    json_false_parse

    fn json_false_parse(input : ParseInput) -> (ParseInput, String)?

    json_null_parse

    fn json_null_parse(input : ParseInput) -> (ParseInput, String)?

    json_number_parse

    fn json_number_parse(input : ParseInput) -> (ParseInput, String)?

    json_parse

    fn json_parse(input : ParseInput) -> (ParseInput, JsonValue)?

    json_string_parse

    fn json_string_parse(input : ParseInput) -> (ParseInput, String)?

    json_true_parse

    fn json_true_parse(input : ParseInput) -> (ParseInput, String)?

    json_value_to_string

    fn json_value_to_string(val : JsonValue) -> String

    keyword

    fn keyword(kw : String, input : ParseInput) -> (ParseInput, String)?

    leb128_s

    fn leb128_s(input : ParseInput) -> (ParseInput, Int)?

    leb128_u

    fn leb128_u(input : ParseInput) -> (ParseInput, Int)?

    many0

    fn[T] many0(parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, Array[T])

    many1

    fn[T] many1(parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, Array[T])?

    many_n

    fn[T] many_n(parser : (ParseInput) -> (ParseInput, T)?, n : Int, input : ParseInput) -> (ParseInput, Array[T])?

    many_till

    fn[T, U] many_till(parser : (ParseInput) -> (ParseInput, T)?, end : (ParseInput) -> (ParseInput, U)?, input : ParseInput) -> (ParseInput, (Array[T], U))?

    map

    fn[T, U] map(parser : (ParseInput) -> (ParseInput, T)?, f : (T) -> U, input : ParseInput) -> (ParseInput, U)?

    multispace0

    fn multispace0(input : ParseInput) -> ParseInput

    multispace1

    fn multispace1(input : ParseInput) -> (ParseInput, String)?

    newline

    fn newline(input : ParseInput) -> (ParseInput, String)?

    none_of

    fn none_of(chars : String, input : ParseInput) -> (ParseInput, String)?

    not_parser

    fn[T] not_parser(parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, String)?

    one_of

    fn one_of(chars : String, input : ParseInput) -> (ParseInput, String)?

    opt

    fn[T] opt(parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, String)?

    parse_bool

    fn parse_bool(input : ParseInput) -> (ParseInput, Bool)?

    parse_float

    fn parse_float(input : ParseInput) -> (ParseInput, Float)?

    parse_hex_int

    fn parse_hex_int(input : ParseInput) -> (ParseInput, Int)?

    parse_int

    fn parse_int(input : ParseInput) -> (ParseInput, Int)?

    parse_scientific

    fn parse_scientific(input : ParseInput) -> (ParseInput, Float)?

    parse_u64

    fn parse_u64(input : ParseInput) -> (ParseInput, Int)?

    peek

    fn[T] peek(parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, T)?

    preceded

    fn[T, U] preceded(prefix : (ParseInput) -> (ParseInput, T)?, parser : (ParseInput) -> (ParseInput, U)?, input : ParseInput) -> (ParseInput, U)?

    quoted_string

    fn quoted_string(input : ParseInput) -> (ParseInput, String)?

    recognize

    fn[T] recognize(parser : (ParseInput) -> (ParseInput, T)?, input : ParseInput) -> (ParseInput, String)?

    rest

    fn rest(input : ParseInput) -> (ParseInput, String)?

    satisfy

    fn satisfy(pred : (String) -> Bool, input : ParseInput) -> (ParseInput, String)?

    separated_list

    fn[T, S] separated_list(parser : (ParseInput) -> (ParseInput, T)?, sep : (ParseInput) -> (ParseInput, S)?, input : ParseInput) -> (ParseInput, Array[T])

    separated_list1

    fn[T, S] separated_list1(parser : (ParseInput) -> (ParseInput, T)?, sep : (ParseInput) -> (ParseInput, S)?, input : ParseInput) -> (ParseInput, Array[T])?

    skip_while

    fn skip_while(pred : (String) -> Bool, input : ParseInput) -> ParseInput

    space

    fn space(input : ParseInput) -> (ParseInput, String)?

    space0

    fn space0(input : ParseInput) -> ParseInput

    space1

    fn space1(input : ParseInput) -> (ParseInput, String)?

    sql_identifier

    fn sql_identifier(input : ParseInput) -> (ParseInput, String)?

    sql_keyword_from

    fn sql_keyword_from(input : ParseInput) -> (ParseInput, String)?

    sql_keyword_select

    fn sql_keyword_select(input : ParseInput) -> (ParseInput, String)?

    sql_keyword_where

    fn sql_keyword_where(input : ParseInput) -> (ParseInput, String)?

    sql_number_value

    fn sql_number_value(input : ParseInput) -> (ParseInput, String)?

    sql_star

    fn sql_star(input : ParseInput) -> (ParseInput, String)?

    sql_string_value

    fn sql_string_value(input : ParseInput) -> (ParseInput, String)?

    success

    fn[T] success(val : T, input : ParseInput) -> (ParseInput, T)?

    tag

    fn tag(expected : String, input : ParseInput) -> (ParseInput, String)?

    tag_ci

    fn tag_ci(expected : String, input : ParseInput) -> (ParseInput, String)?

    take_bytes

    fn take_bytes(n : Int, input : ParseInput) -> (ParseInput, String)?

    take_until

    fn take_until(tag_str : String, input : ParseInput) -> (ParseInput, String)?

    take_while

    fn take_while(pred : (String) -> Bool, input : ParseInput) -> (ParseInput, String)

    take_while1

    fn take_while1(pred : (String) -> Bool, input : ParseInput) -> (ParseInput, String)?

    terminated

    fn[T, U] terminated(parser : (ParseInput) -> (ParseInput, T)?, suffix : (ParseInput) -> (ParseInput, U)?, input : ParseInput) -> (ParseInput, T)?

    toml_array

    fn toml_array(input : ParseInput) -> (ParseInput, Array[String])?

    toml_array_table_header

    fn toml_array_table_header(input : ParseInput) -> (ParseInput, String)?

    toml_bare_key

    fn toml_bare_key(input : ParseInput) -> (ParseInput, String)?

    toml_bool

    fn toml_bool(input : ParseInput) -> (ParseInput, Bool)?

    toml_comment

    fn toml_comment(input : ParseInput) -> (ParseInput, String)?

    toml_dotted_key

    fn toml_dotted_key(input : ParseInput) -> (ParseInput, String)?

    toml_float

    fn toml_float(input : ParseInput) -> (ParseInput, Float)?

    toml_integer

    fn toml_integer(input : ParseInput) -> (ParseInput, Int)?

    toml_key

    fn toml_key(input : ParseInput) -> (ParseInput, String)?

    toml_string

    fn toml_string(input : ParseInput) -> (ParseInput, String)?

    toml_table_header

    fn toml_table_header(input : ParseInput) -> (ParseInput, String)?

    triple_quoted_string

    fn triple_quoted_string(input : ParseInput) -> (ParseInput, String)?

    tuple2

    fn[T, U] tuple2(p1 : (ParseInput) -> (ParseInput, T)?, p2 : (ParseInput) -> (ParseInput, U)?, input : ParseInput) -> (ParseInput, (T, U))?

    tuple3

    fn[T, U, V] tuple3(p1 : (ParseInput) -> (ParseInput, T)?, p2 : (ParseInput) -> (ParseInput, U)?, p3 : (ParseInput) -> (ParseInput, V)?, input : ParseInput) -> (ParseInput, (T, U, V))?

    u16_le

    fn u16_le(input : ParseInput) -> (ParseInput, Int)?

    Read an unsigned 16-bit integer in little-endian byte order.

    u32_le

    fn u32_le(input : ParseInput) -> (ParseInput, Int)?

    Read an unsigned 32-bit integer in little-endian byte order.

    u64_le

    fn u64_le(input : ParseInput) -> (ParseInput, Int)?

    Read an unsigned 64-bit integer in little-endian byte order.
    fn u8(input : ParseInput) -> (ParseInput, Int)?

    Read a single unsigned byte.

    url_fragment

    fn url_fragment(input : ParseInput) -> (ParseInput, String)?

    url_host

    fn url_host(input : ParseInput) -> (ParseInput, String)?

    url_path

    fn url_path(input : ParseInput) -> (ParseInput, String)?

    url_query

    fn url_query(input : ParseInput) -> (ParseInput, String)?

    url_scheme

    fn url_scheme(input : ParseInput) -> (ParseInput, String)?

    url_separator

    fn url_separator(input : ParseInput) -> (ParseInput, String)?

    whitespace_line

    fn whitespace_line(input : ParseInput) -> (ParseInput, String)?