3个版本
0.1.2 | 2023年2月4日 |
---|---|
0.1.1 | 2023年2月4日 |
0.1.0 | 2023年2月4日 |
764 在 编程语言 中排名
688 每月下载次数
在 11 个crate中使用(通过 hvm1)
22KB
541 行
高阶解析器
HOP 是Rust中的轻量级、高阶解析器。
Hi-Parser提供更类似Haskell的解析风格,并探索了?
语法中的Result
,以实现类似do-block的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. 可恢复。返回一个带有Bool
或Option
的Ok
- 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