5 个版本
0.1.4 | 2024年6月28日 |
---|---|
0.1.3 | 2024年6月28日 |
0.1.2 | 2024年4月29日 |
0.1.1 | 2023年11月26日 |
0.1.0 | 2023年11月26日 |
#101 in 解析工具
85KB
2K 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.4"
扩展 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
~94K SLoC