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
moon add Ljh684/MoonParse@0.1.4
Download zip
Author
Version
0.1.4
License
Apache-2.0
Last updated
9 days ago
Downloads
20
README

#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)?