Skip to main content

basic_parsing/
basic_parsing.rs

1//! # Basic Parsing
2//!
3//! This example shows the fundamentals: parsing a pattern and inspecting the
4//! resulting AST node variants.
5//!
6//! Run with:
7//!   cargo run -p re-parser --example basic_parsing
8
9use re_parser::ast::Regex;
10use re_parser::parse;
11
12fn main() {
13    // ── 1. A single literal ──────────────────────────────────────────────────
14    let ast = parse("a").unwrap();
15    println!("Pattern: \"a\"");
16    println!("AST:     {ast:?}\n");
17
18    // ── 2. A concatenation of literals ───────────────────────────────────────
19    let ast = parse("hello").unwrap();
20    println!("Pattern: \"hello\"");
21    match &ast {
22        Regex::Concat(nodes) => println!("AST:     Concat of {} nodes", nodes.len()),
23        other => println!("AST:     {other:?}"),
24    }
25    println!();
26
27    // ── 3. Alternation (a|b|c) ───────────────────────────────────────────────
28    let ast = parse("cat|dog|bird").unwrap();
29    println!("Pattern: \"cat|dog|bird\"");
30    match &ast {
31        Regex::Alternation(branches) => {
32            println!("AST:     Alternation with {} branches:", branches.len());
33            for branch in branches {
34                println!("           {branch:?}");
35            }
36        }
37        other => println!("AST:     {other:?}"),
38    }
39    println!();
40
41    // ── 4. Any character and anchors ─────────────────────────────────────────
42    for pattern in [".", "^", "$", r"\b"] {
43        let ast = parse(pattern).unwrap();
44        println!("Pattern: {pattern:?}  =>  {ast:?}");
45    }
46    println!();
47
48    // ── 5. Error handling ────────────────────────────────────────────────────
49    let patterns = ["(unclosed", r"\z"];
50    for p in patterns {
51        match parse(p) {
52            Ok(ast) => println!("Pattern: {p:?}  =>  {ast:?}"),
53            Err(e) => println!("Pattern: {p:?}  =>  ERROR: {e}"),
54        }
55    }
56}