4 个版本

0.1.4 2024年6月28日
0.1.3 2024年6月28日
0.1.2 2024年4月29日
0.1.1 2023年11月26日

10#bnf

43 每月下载量
用于 bnf_rules

MIT 许可

67KB
1.5K SLoC

bnf_rules!

LR(1)解析生成器

在编译时生成LR(1)解析器。

use bnf_rules::bnf_rules_macro::bnf_rules;

// Grammar
bnf_rules!(
    source   ::= expr
    expr     ::= factor { "+" factor }
    factor   ::= "-" primary | primary
    primary  ::= "(" expr ")" | number
    number   ::= fn (number_tokenizer) // custom tokenizer with function
);

/// Custom tokenizer for numeric literal
fn number_tokenizer(source: &Vec<char>, mut current_position: usize) -> usize {
    let mut iteration_count = 0;
    loop {
        let current_char = match source.get(current_position) {
            Some(ch) => ch.clone(),
            _ => break
        };
        if !current_char.is_numeric() {
            break;
        }
        iteration_count += 1;
        current_position += 1;
    }
    return iteration_count; // 0 means 'rejected', other means 'accepted' and 'length of token'.
}

pub fn parse() {

    // A function named "parse_source" is automatically generated.
    let ast_node: Result<ASTNode, ParseError> = parse_source("(100 + 200) + -100");
    dbg!(ast_node.unwrap());

}

用法

bnf_rules = "0.1.2"

扩展BNF

形式 语义
整个输入源。
ident 名为 "ident" 的非终结符符号。
"something" 文本的终结符符号。
fn (function_name) 具有用户函数的定制分词器。[^1]
{ pattern } "pattern" 的零次或多次重复。
[ pattern ] "pattern" 或 null。
pattern1 | pattern2 "pattern1" 或 "pattern2"。
( patterns ) 一组模式。

[^1]: 也可用泛型参数。

示例 1: https://github.com/bea4dev/bnf_rules/blob/master/src/lib.rs

示例 2: https://github.com/bea4dev/catla/blob/master/catla_parser/src/grammar.rs

依赖项

~3.5–5MB
~93K SLoC