use std::env;
use regexp::Regexp;
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 Regexp::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<String> = env::args().collect();
match args[1].as_str() {
"test" => test(),
"match" => {
let r = match Regexp::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 Regexp::new(&args[2].to_string()) {
Ok(r) => r.determinize().reduce().normalize(),
Err(e) => {
panic!("ERROR: {e}");
}
};
let r2 = match Regexp::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\" or \"test\".")
}
}
}