diff --git a/regexp.py b/regexp.py --- a/regexp.py +++ b/regexp.py @@ -1,5 +1,6 @@ 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