#tokenizer #line-column #parser #tracking #backtracking #tiny #no-alloc

不使用 std simple-tokenizer

一个轻量级的无_std 分词器,具有行和列跟踪功能

5 个不稳定版本

0.4.2 2024 年 6 月 27 日
0.4.1 2024 年 2 月 24 日
0.4.0 2024 年 2 月 22 日
0.2.0 2023 年 12 月 30 日
0.1.0 2023 年 12 月 17 日

#68 in 解析工具

MIT 许可协议

25KB
351

simple-tokenizer

一个轻量级的无_std 分词器,具有行和列跟踪功能。

目标:

  • no_std,无分配和零/最小依赖。
  • 易于使用。
  • 行/列跟踪。
  • 允许跳转到源代码的任意位置。
  • 默认回溯,即如果函数失败,它不会消耗任何输入。

这不是一个解析器组合库,它永远不会成为。已经有了很多其他选择。

示例

use simple_tokenizer::*;

// A small parser that would parse function calls with number/ident arguments.
let source = r"function(123, other_argument, 456)";

let mut tokens = source.as_tokens(); // AsTokens is implemented for any AsRef<str>

let fn_name = tokens.take_while(|ch| ch.is_ascii_alphabetic() || ch == '_').to_string();

// Empty => there was nothing matching a function name
if fn_name.is_empty() {
    // use better error handling youself
    panic!("error at {}", tokens.position());
}

tokens.take_while(char::is_whitespace); // skip whitespace

let mut args = Vec::new();

if !tokens.token("(") {
    panic!("error at {}", tokens.position());
}

// if the call succeeded, than '(' is consumed
    
tokens.take_while(char::is_whitespace); // skip whitespace

// for the sake of simplicity, I'm gonna stop checking for empty strings
args.push(tokens.take_while(|ch| ch.is_ascii_alphanumeric() || ch == '_').to_string());
tokens.take_while(char::is_whitespace); // skip whitespace

while tokens.token(",") {
    tokens.take_while(char::is_whitespace); // skip whitespace
        
    args.push(tokens.take_while(|ch| ch.is_ascii_alphanumeric() || ch == '_').to_string());

    tokens.take_while(char::is_whitespace); // skip whitespace
}

if !tokens.token(")") {
    panic!("error at {}", tokens.position());
}

assert!(tokens.is_at_end());
assert_eq!(fn_name, "function");
assert_eq!(args.as_slice(), &["123", "other_argument", "456"]);

Cargo 功能

  • yap (默认关闭): 添加了一个对实现 yap::TokensTokens<'_> 的包装器。

依赖关系

~29KB