1个不稳定版本

0.1.0 2023年2月4日

#1 in #succeed

MIT 许可证

22KB
537

高阶解析器

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

Hi-Parser 提供了更类似于 Haskell 的解析风格,并探索了 ?Result 语法,以拥有类似 do 块的 monadic 表达式。这并不像正确的 do 语法那样好,但它避免了缩进地狱。例如,在函数式语言中,一个 lambda 可以被解析为

// 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

这将回溯,并且可以用来实现替代项。例如,如果你正在解析一个具有 2 个构造函数(狗和猫)的 AST “Animal”,那么你可以实现

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

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

- Err(error_message)

这将像“throw”一样终止整个解析器,并返回错误信息。当你知道只有一个解析分支可以到达这个位置,但源代码是错误的时候,使用这个。


此解析器由 HVM 使用。

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

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

依赖项

~16KB