Exemple #1
0
def test_epsilon():
    grammar = """
        S ::= "b" A "d"
        A ::= "c"
            |
    """
    lrp = LRParser(grammar, 1)
    assert lrp.check("b c d") == True
    assert lrp.check("b d") == True
Exemple #2
0
def test_epsilon2():
    grammar = """
        S ::= A B "c"
        A ::= "a"
        B ::= "b"
            |
    """
    lrp = LRParser(grammar, LR0)
    assert lrp.check("a b c") == True
    assert lrp.check("a c") == True
    assert lrp.check("a b b") == False

    lrp = LRParser(grammar, LALR)
    assert lrp.check("a b c") == True
    assert lrp.check("a c") == True
    assert lrp.check("a b b") == False
Exemple #3
0
def test_calc2():
    grammar = """
        E ::= T
            | E "+" T
        T ::= P
            | T "*" P
        P ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
    """
    lrp = LRParser(grammar, 0)
    assert lrp.check("1 + 2") == True
    assert lrp.check("1 + 2 * 3") == True
    assert lrp.check("1 * 2 * 3 + 4") == True

    lrp = LRParser(grammar, 1)
    assert lrp.check("1 + 2") == True
    assert lrp.check("1 + 2 * 3") == True
    assert lrp.check("1 * 2 * 3 + 4") == True
Exemple #4
0
def notest_small_language():
    grammar = """
        program ::= ws class program

        ws ::= ws ws_char
                     |
        ws_char ::= "\n" | "\t" | "\r"

        id ::= id_char id
             |

        id_char ::= "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|"y"|"z"
                  |

        class ::= "class" ws id ws "{" functions "}"
        functions ::= ws function ws functions
                    |
        function ::= "function" ws id ws "{" func_body "}"
        func_body ::= ws
    """

    lrp = LRParser(grammar, LR0)
    assert lrp.check("""class test { function hello { } }""") == True

    lrp = LRParser(grammar, LALR)
    assert lrp.check("""
        class test {
            function hello {
            }
        }
    """) == True
Exemple #5
0
def test_calc1():
    grammar = """
        E ::= P
            | E "+" P
        P ::= "1" | "2"
    """
    lrp = LRParser(grammar, 0)
    assert lrp.check("1") == True
    assert lrp.check("1 + 2") == True
    print("NOW WITH LR(1)")
    lrp = LRParser(grammar, 1)
    assert lrp.check("1 + 2") == True
Exemple #6
0
def notest_ast():
    lrp = LRParser(grammar)
    lrp.check("1 + 2 * 3")
    ast = lrp.get_ast()

    AST(
        Node(E, [
            Node(E, [Node(T, [Node(P, [n1])])]),
            Node(plus, []),
            Node(T, [
                Node(T, [Node(P, [n2])]),
                Node(mul, []),
                Node(P, [n3])
            ])
        ])
    ) == ast

    lrp.check("1 + 2 * 1")
    ast2 = lrp.get_ast()
Exemple #7
0
def test_input2():
    lrp = LRParser(grammar, 1)
    assert lrp.check("a b d") == True
    assert lrp.check("a c d") == True
    assert lrp.check("a a d") == False
Exemple #8
0
def test_recursion2():
    grammar = """
        S ::= "b" A
        A ::= S
            |
    """
    lrp = LRParser(grammar, LR0)
    assert lrp.check("b b b b b b b b b b b") == True
    assert lrp.check("b b") == True
    assert lrp.check("b") == True
    assert lrp.check("") == False

    lrp = LRParser(grammar, LALR)
    assert lrp.check("b b b b b b b b b b b") == True
    assert lrp.check("b b") == True
    assert lrp.check("b") == True
    assert lrp.check("") == False