Skip to content

Commit 0489e23

Browse files
committed
add regex
1 parent e46e733 commit 0489e23

9 files changed

Lines changed: 143 additions & 165 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bnf_rules"
3-
version = "0.1.4"
3+
version = "0.1.5"
44
edition = "2021"
55
repository = "https://github.com/bea4dev/bnf_rules"
66
description = "LR(1) parser generator"
@@ -13,6 +13,6 @@ members = [
1313
]
1414

1515
[dependencies]
16-
bnf_rules_parser = { path = "./bnf_rules_parser", version = "0.1.4" }
17-
bnf_rules_macro = { path = "./bnf_rules_macro", version = "0.1.4" }
16+
bnf_rules_parser = { path = "./bnf_rules_parser", version = "0.1.5" }
17+
bnf_rules_macro = { path = "./bnf_rules_macro", version = "0.1.5" }
1818
regex = "^1.7.1"

README.md

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,9 @@ bnf_rules!(
1414
expr ::= factor { "+" factor }
1515
factor ::= "-" primary | primary
1616
primary ::= "(" expr ")" | number
17-
number ::= fn (number_tokenizer) // custom tokenizer with function
17+
number ::= r"\d+" // regex
1818
);
1919

20-
/// Custom tokenizer for numeric literal
21-
fn number_tokenizer(source: &Vec<char>, mut current_position: usize) -> usize {
22-
let mut iteration_count = 0;
23-
loop {
24-
let current_char = match source.get(current_position) {
25-
Some(ch) => ch.clone(),
26-
_ => break
27-
};
28-
if !current_char.is_numeric() {
29-
break;
30-
}
31-
iteration_count += 1;
32-
current_position += 1;
33-
}
34-
return iteration_count; // 0 means 'rejected', other means 'accepted' and 'length of token'.
35-
}
36-
3720
pub fn parse() {
3821

3922
// A function named "parse_source" is automatically generated.
@@ -45,7 +28,7 @@ pub fn parse() {
4528

4629
### Usage
4730
```toml
48-
bnf_rules = "0.1.4"
31+
bnf_rules = "0.1.5"
4932
```
5033

5134
### Extended BNF
@@ -54,6 +37,7 @@ bnf_rules = "0.1.4"
5437
| source | An entire input source. |
5538
| ident | A non-terminal symbol named "ident". |
5639
| "something" | A terminal symbol for text. |
40+
| r"\d+" | A terminal symbol for regex. |
5741
| fn (function_name) | A custom tokenizer with user function.[^1] |
5842
| { pattern } | Zero or more repetitions of "pattern". |
5943
| \[ pattern \] | "pattern" or null. |
@@ -64,4 +48,4 @@ bnf_rules = "0.1.4"
6448

6549
> Example 1: https://github.com/bea4dev/bnf_rules/blob/master/src/lib.rs
6650
67-
> Example 2: https://github.com/bea4dev/catla/blob/master/catla_parser/src/grammar.rs
51+
> Example 2: https://github.com/bea4dev/catla/blob/master/catla_parser/src/grammar.rs

bnf_rules_macro/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bnf_rules_macro"
3-
version = "0.1.4"
3+
version = "0.1.5"
44
edition = "2021"
55
repository = "https://github.com/bea4dev/bnf_rules"
66
description = "LR(1) parser generator"

bnf_rules_macro/src/lib.rs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,9 @@ use syn::parse_macro_input;
2020
/// expr ::= factor { "+" factor }
2121
/// factor ::= "-" primary | primary
2222
/// primary ::= "(" expr ")" | number
23-
/// number ::= fn (number_tokenizer) // custom tokenizer with function
23+
/// number ::= r"\d+" // regex
2424
/// );
2525
///
26-
/// /// Custom tokenizer for numeric literal
27-
/// fn number_tokenizer(source: &Vec<char>, mut current_position: usize) -> usize {
28-
/// let mut iteration_count = 0;
29-
/// loop {
30-
/// let current_char = match source.get(current_position) {
31-
/// Some(ch) => ch.clone(),
32-
/// _ => break
33-
/// };
34-
/// if !current_char.is_numeric() {
35-
/// break;
36-
/// }
37-
/// iteration_count += 1;
38-
/// current_position += 1;
39-
/// }
40-
/// return iteration_count; // 0 means 'rejected', other means 'accepted' and 'length of token'.
41-
/// }
42-
///
4326
/// pub fn parse() {
4427
///
4528
/// // A function named "parse_source" is automatically generated.
@@ -58,4 +41,3 @@ pub fn bnf_rules(input: TokenStream) -> TokenStream {
5841
let mut generator = ParserGenerator::new(map);
5942
return generator.generate(generate_code).unwrap().parse().unwrap();
6043
}
61-

bnf_rules_parser/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bnf_rules_parser"
3-
version = "0.1.4"
3+
version = "0.1.5"
44
edition = "2021"
55
repository = "https://github.com/bea4dev/bnf_rules"
66
description = "LR(1) parser generator"

0 commit comments

Comments
 (0)