Esempio n. 1
0
 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."
                )
Esempio n. 3
0
 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'))
Esempio n. 4
0
 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'))
Esempio n. 5
0
    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'))
Esempio n. 6
0
 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)
Esempio n. 10
0
 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
Esempio n. 11
0
 def test_matches_epsilon(self):
     nfa = from_ast(Epsilon())
     self.assertTrue(nfa.matches(''))
     self.assertFalse(nfa.matches(' '))
     self.assertFalse(nfa.matches('a'))
Esempio n. 12
0
 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(''))
Esempio n. 13
0
 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'))
Esempio n. 14
0
 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'))
Esempio n. 15
0
 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(''))
Esempio n. 16
0
#!/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)))