use std::env; use regexp::RegexpNFA; fn test() { let tests = ["", "a", "ab", "aabb", "abab", "abcd", "abcbcdbcd"]; for pattern in ["a(b|c)", "a*b*", "(ab)*", "a((bc)*d)*", "(a|b)*a(a|b)(a|b)(a|b)", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"] { println!("# {pattern}"); let r = match RegexpNFA::new(&pattern.to_string()) { Ok(r1) => r1.determinize().reduce().normalize(), Err(e) => { println!("{e}"); continue; } }; for &t in tests.iter() { println!("{t} {}", r.eval(t.to_string())); } println!(); } } fn main() { let args: Vec = env::args().collect(); match args[1].as_str() { "test" => test(), "match" => { let r = match RegexpNFA::new(&args[2].to_string()) { Ok(r1) => r1.determinize().reduce().normalize(), Err(e) => { panic!("ERROR: {e}"); } }; println!("{}", r.eval(args[3].to_string())); }, "compare" => { let r1 = match RegexpNFA::new(&args[2].to_string()) { Ok(r) => r.determinize().reduce().normalize(), Err(e) => { panic!("ERROR: {e}"); } }; let r2 = match RegexpNFA::new(&args[3].to_string()) { Ok(r) => r.determinize().reduce().normalize(), Err(e) => { panic!("ERROR: {e}"); } }; println!("{}", r1.find_distinguishing_string(&r2).unwrap_or("None".to_string())); }, s => { println!("An unknown command: \"{s}\". Use \"match\", \"compare\" or \"test\".") } } }