Changeset - f0b3b1bd87f4
[Not reviewed]
default
0 2 0
Laman - 10 months ago 2024-06-29 17:06:32

a basic command line interface
2 files changed with 50 insertions and 2 deletions:
0 comments (0 inline, 0 general)
regexp.py
Show inline comments
 
import math
 
import itertools
 
import argparse
 
from abc import abstractmethod
 
from collections import deque
 

	
 
@@ -380,7 +381,7 @@ class RegexpDFA:
 
		return (rules, end_states)
 

	
 

	
 
if __name__ == "__main__":
 
def test():
 
	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)", "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"]:
 
		print("#", pattern)
 
@@ -393,3 +394,30 @@ if __name__ == "__main__":
 
		for t in tests:
 
			print(t, r.match(t))
 
		print()
 

	
 

	
 
if __name__ == "__main__":
 
	parser = argparse.ArgumentParser()
 
	subparsers = parser.add_subparsers()
 
	
 
	test_parser = subparsers.add_parser("test")
 
	test_parser.set_defaults(name="test")
 

	
 
	match_parser = subparsers.add_parser("match")
 
	match_parser.add_argument("pattern")
 
	match_parser.add_argument("string")
 
	match_parser.set_defaults(name="match")
 

	
 
	args = parser.parse_args()
 

	
 
	if args.name == "test":
 
		test()
 
	elif args.name == "match":
 
		try:
 
			r = RegexpDFA.create(args.pattern).reduce().normalize()
 
		except ParsingError as e:
 
			print("Failed to parse the regexp:")
 
			print(e)
 
		print(r.match(args.string))
 
	else:
 
		parser.print_help()
 
\ No newline at end of file
src/main.rs
Show inline comments
 
use std::env;
 
use regexp::Regexp;
 

	
 
fn main() {
 
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)", "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"] {
 
		println!("# {pattern}");
 
@@ -17,3 +18,22 @@ fn main() {
 
		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()));
 
		}
 
		s => {
 
			println!("An unknown command: \"{s}\". Use \"match\" or \"test\".")
 
		}
 
	}
 
}
0 comments (0 inline, 0 general)