def test_to_cfg(self): regex = Regex("a") cfg = regex.to_cfg() self.assertTrue(cfg.contains(["a"])) regex = Regex("a|b") cfg = regex.to_cfg() self.assertTrue(cfg.contains(["b"])) regex = Regex("a b") cfg = regex.to_cfg() self.assertTrue(cfg.contains(["a", "b"])) regex = Regex("a*") cfg = regex.to_cfg() self.assertTrue(cfg.contains([])) self.assertTrue(cfg.contains(["a"])) self.assertTrue(cfg.contains(["a", "a"])) regex = Regex("epsilon") cfg = regex.to_cfg() self.assertTrue(cfg.contains([])) regex = Regex("") cfg = regex.to_cfg() self.assertTrue(cfg.is_empty()) regex = Regex("(a|b)* c") cfg = regex.to_cfg() self.assertTrue(cfg.contains(["c"])) self.assertTrue(cfg.contains(["a", "c"])) self.assertTrue(cfg.contains(["a", "b", "c"]))
def read_cfgrammar(name): file = open(name, 'r') s = '' cfg_from_regex = [] for line in file: if 'regexp' in line: line = line.replace('regexp', "") head = line.split(" -> ")[0] regex = Regex(line.split(" -> ")[1][:-1]) cfg_from_regex.append(regex.to_cfg(starting_symbol=head)) else: s += line file.close() cfg = CFG.from_text(s) for c in cfg_from_regex: cfg = CFG(cfg.variables.union(c.variables), cfg.terminals.union(c.terminals), cfg.start_symbol, cfg.productions.union(c.productions)) return cfg