def test_matches_zero_or_more(self): nfa = from_ast(ZeroOrMore(Char('a'))) self.assertTrue(nfa.matches('')) self.assertTrue(nfa.matches('a')) self.assertTrue(nfa.matches('aa')) self.assertTrue(nfa.matches('aaaaaaa')) self.assertFalse(nfa.matches('b'))
def test_matching_str(self): REGEX_TO_TEST = 25 MATCHING_STR_TO_TEST = 100 for _ in range(REGEX_TO_TEST): ast = generators.ast() nfa_ = nfa.from_ast(ast) dfa_ = dfa.from_nfa(nfa_) if PRINT_TESTS: print('-----TEST: matching_str-----') for _ in range(MATCHING_STR_TO_TEST): matching_str = generators.matching_str(ast) if PRINT_TESTS: print(ast.to_regex() + ' against ' + matching_str) self.assertTrue( ast.matches(matching_str), "Regex: '{0}' and String: '{1}' ".format( ast.to_regex(), matching_str) + "were generated as a matching pair, but they were determined not to match by the derivative method." ) self.assertTrue( nfa_.matches(matching_str), "Regex: '{0}' and String: '{1}' ".format( ast.to_regex(), matching_str) + "were generated as a matching pair, but they were determined not to match by the NFA method." ) self.assertTrue( dfa_.matches(matching_str), "Regex: '{0}' and String: '{1}' ".format( ast.to_regex(), matching_str) + "were generated as a matching pair, but they were determined not to match by the DFA method." )
def test_matches_sequence(self): nfa = from_ast(Sequence(Char('a'), Char('b'))) self.assertTrue(nfa.matches('ab')) self.assertFalse(nfa.matches('a')) self.assertFalse(nfa.matches('b')) self.assertFalse(nfa.matches('abb')) self.assertFalse(nfa.matches('aab'))
def test_matches_complex_1(self): nfa = from_ast(parse_regex('a?b*(c|d)')) self.assertTrue(nfa.matches('abc')) self.assertTrue(nfa.matches('abd')) self.assertTrue(nfa.matches('bc')) self.assertTrue(nfa.matches('bd')) self.assertTrue(nfa.matches('c')) self.assertTrue(nfa.matches('d')) self.assertTrue(nfa.matches('bbbc')) self.assertTrue(nfa.matches('bbbd'))
def test_matches_char_class(self): nfa = from_ast(CharClass(invert=False, strs_or_char_ranges=['b', CharRange('c', 'e')])) self.assertTrue(nfa.matches('b')) self.assertTrue(nfa.matches('c')) self.assertTrue(nfa.matches('d')) self.assertTrue(nfa.matches('e')) self.assertFalse(nfa.matches('a')) self.assertFalse(nfa.matches('f')) self.assertFalse(nfa.matches('')) self.assertFalse(nfa.matches('bb')) nfa = from_ast(CharClass(invert=True, strs_or_char_ranges=['b', CharRange('c', 'e')])) self.assertFalse(nfa.matches('b')) self.assertFalse(nfa.matches('c')) self.assertFalse(nfa.matches('d')) self.assertFalse(nfa.matches('e')) self.assertTrue(nfa.matches('a')) self.assertTrue(nfa.matches('f')) self.assertFalse(nfa.matches('')) self.assertFalse(nfa.matches('bb'))
def test_matches_complex_2(self): nfa = from_ast(parse_regex('(ab)?(cde)*')) self.assertTrue(nfa.matches('')) self.assertTrue(nfa.matches('ab')) self.assertTrue(nfa.matches('cde')) self.assertTrue(nfa.matches('abcde')) self.assertTrue(nfa.matches('abcdecde')) self.assertTrue(nfa.matches('abcdecdecde')) self.assertFalse(nfa.matches('a')) self.assertFalse(nfa.matches('c')) self.assertFalse(nfa.matches('cd')) self.assertFalse(nfa.matches('de'))
def test_full_process(self): for i in range(100): ast = parse_regex('o|oa') nfa_ = nfa.from_ast(ast) dfa_ = dfa.from_nfa(nfa_) assert dfa_.matches('o'), 'full_process attempt: {0}'.format(i)
def test_dfa_from_nfa(self): ast = parse_regex('o|oa') nfa_ = nfa.from_ast(ast) for i in range(100): dfa_ = dfa.from_nfa(nfa_) assert dfa_.matches('o'), 'dfa.from_nfa attempt: {0}'.format(i)
def test_nfa_from_ast(self): ast = parse_regex('o|oa') for i in range(100): nfa_ = nfa.from_ast(ast) assert nfa_.matches('o'), 'nfa.from_ast attempt: {0}'.format(i)
def __init__(self, unittest, regex): self.regex = regex self.ast = parse_regex(regex) self.nfa = nfa.from_ast(self.ast) self.dfa = dfa.from_nfa(self.nfa) self.unittest = unittest
def test_matches_epsilon(self): nfa = from_ast(Epsilon()) self.assertTrue(nfa.matches('')) self.assertFalse(nfa.matches(' ')) self.assertFalse(nfa.matches('a'))
def test_matches_char(self): nfa = from_ast(Char('c')) self.assertTrue(nfa.matches('c')) self.assertFalse(nfa.matches('b')) self.assertFalse(nfa.matches('cc')) self.assertFalse(nfa.matches(''))
def test_matches_any_char(self): nfa = from_ast(AnyChar()) self.assertTrue(nfa.matches('a')) self.assertTrue(nfa.matches('b')) self.assertFalse(nfa.matches('')) self.assertFalse(nfa.matches('ab'))
def test_matches_optional(self): nfa = from_ast(Optional(Char('a'))) self.assertTrue(nfa.matches('')) self.assertTrue(nfa.matches('a')) self.assertFalse(nfa.matches('aa')) self.assertFalse(nfa.matches('b'))
def test_matches_or(self): nfa = from_ast(Or(Char('a'), Char('b'))) self.assertTrue(nfa.matches('a')) self.assertTrue(nfa.matches('b')) self.assertFalse(nfa.matches('c')) self.assertFalse(nfa.matches(''))
#!/usr/bin/env python3 import parser import sys import nfa import dfa from utils import constructor_str if len(sys.argv) != 3: print('Usage: main.py "<regular expression>" "<string to match>"') sys.exit(1) regex_str = sys.argv[1] match_str = sys.argv[2] print('InputRegex: ' + regex_str) ast = parser.parse_regex(regex_str) print('ParsedRegex: ' + ast.to_regex()) print('AST: ' + constructor_str(ast)) print('English: ' + ast.to_str_english()) print('Full match (derivative): ' + str(ast.matches(match_str))) nfa_ = nfa.from_ast(ast) print('Full match (NFA): ' + str(nfa_.matches(match_str))) dfa_ = dfa.from_nfa(nfa_) print('Full match (DFA): ' + str(dfa_.matches(match_str))) print('Subsets matched: ' + str(dfa_.find_subset_matches(match_str)))