| Crates.io | bnf_rules |
| lib.rs | bnf_rules |
| version | 0.1.7 |
| created_at | 2023-11-26 14:30:05.965203+00 |
| updated_at | 2025-06-14 09:48:28.77897+00 |
| description | LR(1) parser generator |
| homepage | |
| repository | https://github.com/bea4dev/bnf_rules |
| max_upload_size | |
| id | 1049151 |
| size | 24,052 |
LR(1) parser generator
use bnf_rules::bnf_rules_macro::bnf_rules;
// Grammar
bnf_rules!(
source ::= expr
expr ::= factor { "+" factor }
factor ::= "-" primary | primary
primary ::= "(" expr ")" | number
number ::= r"\d+" // regex
);
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.7"
| Form | Semantic |
|---|---|
| source | An entire input source. |
| ident | A non-terminal symbol named "ident". |
| "something" | A terminal symbol for text. |
| r"\d+" | A terminal symbol for regex. |
| fn (function_name) | A custom tokenizer with user function.1 |
| { pattern } | Zero or more repetitions of "pattern". |
| [ pattern ] | "pattern" or null. |
| pattern1 | pattern2 | "pattern1" or "pattern2". |
| ( patterns ) | A group of patterns. |
Example 1: https://github.com/bea4dev/bnf_rules/blob/master/src/lib.rs
Example 2: https://github.com/bea4dev/catla/blob/master/catla_parser/src/grammar.rs
Generic parameters are also available. ↩