Loading grammars_cfg.py +1 −1 Original line number Original line Diff line number Diff line Loading @@ -160,7 +160,7 @@ class CFG: def _check(self) -> None: def _check(self) -> None: assert self.init in self.nonterminals,\ assert self.init in self.nonterminals,\ "Initial nonterminal {self.init.name} must be in nonterminals" f"Initial nonterminal {self.init.name} must be in nonterminals" for nterm, prod in self.productions(): for nterm, prod in self.productions(): assert nterm in self.nonterminals,\ assert nterm in self.nonterminals,\ f"A rule for {nterm.name} exists, "\ f"A rule for {nterm.name} exists, "\ Loading test_cfl_cfg.py +19 −6 Original line number Original line Diff line number Diff line from common import Nonterminal, Terminal, Eps from common import Nonterminal, Terminal, Eps from parser import Parser import cfl import cfl from copy import deepcopy from copy import deepcopy S = Nonterminal("S") S, A, B, C = tuple(Nonterminal(x) for x in "SABC") A = Nonterminal("A") a, b, c = tuple(Terminal(x) for x in "abc") B = Nonterminal("B") C = Nonterminal("C") a = Terminal("a") b = Terminal("b") Rules = cfl.CFG.Rules Rules = cfl.CFG.Rules Loading Loading @@ -133,3 +130,19 @@ def test_equal(): assert not r assert not r print(r.__dict__) print(r.__dict__) def test_parser(): parser = Parser() pg0 = parser.str_to_cfg("S -> aA | ε | aBC | <foo>C; " "A -> a; " "B -> b; " "C -> c\n" "<foo> -> aaa") assert pg0.terminals == {a, b, c} assert pg0.nonterminals == {S, A, B, C, Nonterminal("<foo>")} assert pg0.generates("") assert pg0.generates("aa") assert pg0.generates("abc") assert pg0.generates("aaac") assert pg0.is_epsilon_normal_form() Loading
grammars_cfg.py +1 −1 Original line number Original line Diff line number Diff line Loading @@ -160,7 +160,7 @@ class CFG: def _check(self) -> None: def _check(self) -> None: assert self.init in self.nonterminals,\ assert self.init in self.nonterminals,\ "Initial nonterminal {self.init.name} must be in nonterminals" f"Initial nonterminal {self.init.name} must be in nonterminals" for nterm, prod in self.productions(): for nterm, prod in self.productions(): assert nterm in self.nonterminals,\ assert nterm in self.nonterminals,\ f"A rule for {nterm.name} exists, "\ f"A rule for {nterm.name} exists, "\ Loading
test_cfl_cfg.py +19 −6 Original line number Original line Diff line number Diff line from common import Nonterminal, Terminal, Eps from common import Nonterminal, Terminal, Eps from parser import Parser import cfl import cfl from copy import deepcopy from copy import deepcopy S = Nonterminal("S") S, A, B, C = tuple(Nonterminal(x) for x in "SABC") A = Nonterminal("A") a, b, c = tuple(Terminal(x) for x in "abc") B = Nonterminal("B") C = Nonterminal("C") a = Terminal("a") b = Terminal("b") Rules = cfl.CFG.Rules Rules = cfl.CFG.Rules Loading Loading @@ -133,3 +130,19 @@ def test_equal(): assert not r assert not r print(r.__dict__) print(r.__dict__) def test_parser(): parser = Parser() pg0 = parser.str_to_cfg("S -> aA | ε | aBC | <foo>C; " "A -> a; " "B -> b; " "C -> c\n" "<foo> -> aaa") assert pg0.terminals == {a, b, c} assert pg0.nonterminals == {S, A, B, C, Nonterminal("<foo>")} assert pg0.generates("") assert pg0.generates("aa") assert pg0.generates("abc") assert pg0.generates("aaac") assert pg0.is_epsilon_normal_form()