Verified Commit 53896eaf authored by Vladimír Štill's avatar Vladimír Štill
Browse files

CFL: Add a parser test

parent ca2c891e
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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, "\
+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


@@ -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()