3个版本

0.1.2 2023年2月4日
0.1.1 2023年2月4日
0.1.0 2023年2月4日

#709编程语言

Download history 49/week @ 2024-03-11 37/week @ 2024-03-18 74/week @ 2024-03-25 122/week @ 2024-04-01 43/week @ 2024-04-08 43/week @ 2024-04-15 48/week @ 2024-04-22 53/week @ 2024-04-29 48/week @ 2024-05-06 67/week @ 2024-05-13 53/week @ 2024-05-20 41/week @ 2024-05-27 32/week @ 2024-06-03 69/week @ 2024-06-10 42/week @ 2024-06-17 59/week @ 2024-06-24

每月688次下载
11 个crate中使用了(通过 hvm1

MIT 协议

22KB
541 代码行

高阶解析器

HOP 是 Rust 中的一个轻量级、高阶解析器。

Hi-Parser 提供了一种更类似于 Haskell 的解析器风格,并探讨了 ? 语法中的 Result,以实现类似 do-block 的单调记法。这并不像正确的 do 记法那样好,但可以避免缩进问题。例如,在函数式语言中,一个λ演算表达式可以解析为

// Parses a λ-term in the syntax: `λx => body`
pub fn parse_lam(state: parser::State) -> parser::Answer<Option<Box<Term>>> {
  let (state, _)    = parser::there_take_exact("λ")?;
  let (state, name) = parser::there_nonempty_name(state)?;
  let (state, _)    = parser::there_take_exact("=>")?;
  let (state, body) = parse_term(state)?;
  Ok((state, Box::new(Term::Lam { name, body })))
}

解析器被简单地定义为

Answer<A> = Result<(State, A), String>
Parser<A> = Fn(State) -> Answer<A>>

即解析器是一个接收 State 并返回 Answer 的函数。该答案要么是更新后的状态和解析结果(如果成功),要么是错误消息,以简单的字符串形式,如果失败。请注意,有两种失败方式

1. 可恢复。返回包含 BoolOptionOk

- Ok((new_state, Some(result))) if it succeeds
- Ok((old_state, None))         if it fails

这会回溯,可以用来实现替代。例如,如果你正在解析一个AST,"Animal",具有2个构造函数,dog和cat,那么你可以实现

parse_dog    : Parser<Option<Animal>>
parse_cat    : Parser<Option<Animal>>
parse_animal : Parser<Animal>

2. 不可恢复。返回包含消息的 Err

- Err(error_message)

这将中止整个解析器,就像一个 "throw",并返回错误消息。当你知道只有一条解析分支可以到达这个位置,而源代码有误时,请使用此方法。


此解析器由 HVM 使用。

注意:此解析器处于非常早期阶段,提供的功能非常有限。

待办事项:添加示例,改进文档。

依赖项

~16KB