#parser-combinator #run-time #portable #require #language

无 std honeycomb

一个不需要运行时的便携式解析器组合库

5 个版本

0.1.4 2019 年 8 月 23 日
0.1.3 2019 年 8 月 22 日
0.1.2 2019 年 8 月 22 日
0.1.1 2019 年 8 月 22 日
0.1.0 2019 年 8 月 22 日

#331 in 解析器工具

每月 28 次下载

Apache-2.0

33KB
641 行代码

honeycomb

一个不需要运行时的便携式解析器组合库

文档

您可以在这里找到 honeycomb 的文档。

依赖项

没有!Honeycomb 甚至不需要标准库!

您只需要一个可以运行 Rust 的设备,就可以开始使用了。

JSON 解析器

以下是一个 JSON 解析器的示例。

基本上,我们定义函数,从小的原子解析器创建更大的解析器。我们创建解析布尔值、字符串、数字和 null 值的解析器,然后使用这些解析器构建解析数组、对象定义的解析器。

extern crate honeycomb;
use honeycomb::{
    atoms::{rec, seq_no_ws},
    language,
    transform::{to_btree, to_number},
    Parser,
};

use std::collections::BTreeMap;

#[derive(Debug, Clone, PartialEq)]
pub enum JsonValue {
    Null,
    Bool(bool),
    Str(String),
    Num(f64),
    Array(Vec<JsonValue>),
    Object(BTreeMap<String, JsonValue>),
}

fn boolean() -> Parser<JsonValue> {
    (seq_no_ws("true").map(|_| JsonValue::Bool(true)))
        | (seq_no_ws("false").map(|_| JsonValue::Bool(false)))
}

fn string() -> Parser<String> {
    language::string()
}

fn number() -> Parser<JsonValue> {
    language::number()
        .map(to_number)
        .map(JsonValue::Num)
}

fn null() -> Parser<JsonValue> {
    seq_no_ws("null")
        .map(|_| JsonValue::Null)
}

fn array() -> Parser<JsonValue> {
    language::array("[", json(), "]")
        .map(JsonValue::Array)
}

fn object() -> Parser<JsonValue> {
    language::array("{", string().suffix(seq_no_ws(":")) & rec(json), "}")
        .map(to_btree).map(JsonValue::Object)
}

fn json() -> Parser<JsonValue> {
    null() | boolean() | number() | (string() - JsonValue::Str) | rec(array) | rec(object)
}

fn main() {
    println!(
        "{:#?}",
        json().parse(
            r#"
{
    "testing" : null,
    "recursion" : {
        "WOW": 1.2345
    },
    "array": [1, 2, {"test": "123"}, 4],
    "test": "testing"
}
"#
        )
    );
}

编程语言分词器

这使用了一个内置的解析器,称为 token。

token 解析器返回一个字符串向量,表示标识符、字符串、数字和符号。

在这里,我们使用 token 解析器创建一个接受任意数量标记的解析器。

extern crate honeycomb;
use honeycomb::language::token;

fn main() {
    println!(
        "{:?}",
        (token().repeat(..)).parse(
            r#"

struct Point {
    x: i32, y: i32
}


fn testing() {
    println("hello world!");
}

fn main() {

}
"#
        )
    );
}

无运行时依赖项