15个版本 (6个稳定版)

4.0.0 2020年12月14日
3.0.2 2019年3月21日
3.0.1 2018年8月23日
2.0.0 2016年10月20日
0.5.0 2015年7月17日

#153 in 解析工具

MIT 许可证

44KB
1K SLoC

combine-language

Build Status Docs v2 Docs Gitter

这是一个提供构建解析器简单方法的crate,这些解析器可以轻松解析各种编程语言。它具有与Text.Parsec.Token 相似的API,但为了适应Rust的所有权模型,它们在其它方面略有不同。该crate是combine crate的扩展。

示例

extern crate combine;
extern crate combine_language;
use combine::{satisfy, EasyParser, Parser};
use combine::parser::char::{alpha_num, letter, string};
use combine_language::{Identifier, LanguageEnv, LanguageDef};
fn main() {
    let env = LanguageEnv::new(LanguageDef {
        ident: Identifier {
            start: letter(),
            rest: alpha_num(),
            reserved: ["if", "then", "else", "let", "in", "type"].iter()
                                                                 .map(|x| (*x).into())
                                                                 .collect(),
        },
        op: Identifier {
            start: satisfy(|c| "+-*/".chars().any(|x| x == c)),
            rest: satisfy(|c| "+-*/".chars().any(|x| x == c)),
            reserved: ["+", "-", "*", "/"].iter().map(|x| (*x).into()).collect()
        },
        comment_start: string("/*").map(|_| ()),
        comment_end: string("*/").map(|_| ()),
        comment_line: string("//").map(|_| ()),
    });
    let id = env.identifier();//An identifier parser
    let integer = env.integer();//An integer parser
    let result = (id, integer).easy_parse("this /* Skips comments */ 42");
    assert_eq!(result, Ok(((String::from("this"), 42), "")));
}

combine

依赖项

~0.6–1MB
~18K SLoC