Example #1
0
 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"]))
Example #2
0
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