示例#1
0
def test_missing_rule():
    grammar = '''
        @@grammar::TestGrammar
          block = test ;
    '''
    try:
        parse(grammar, 'abc')
    except GrammarError as e:
        assert str(e) == 'Unknown rules, no parser generated:\ntest'
示例#2
0
    def test_leftrec_with_void(self):
        left_grammar = '''
            @@left_recursion :: True
            @@nameguard :: False

            start = A | () ;
            A = | A 'a' | 'a' ;
        '''

        assert (('a', 'a'), 'a') == parse(left_grammar, 'aaa')
        assert parse(left_grammar, '') is None
示例#3
0
def test_alert_interpolation():
    input = '42 69'
    grammar = '''
            start = a:number b: number i:^`"seen: {a}, {b}"` $ ;
            number = /\d+/ ;
    '''
    assert parse(grammar, input) == {'a': '42', 'b': '69', 'i': 'seen: 42, 69'}
示例#4
0
def test_constant_interpolation_free():
    input = '42 69'
    grammar = '''
            start = a:number b: number i:`seen: {a}, {b}` $ ;
            number = /\d+/ ;
    '''
    assert parse(grammar, input) == {'a': '42', 'b': '69', 'i': 'seen: 42, 69'}
示例#5
0
    def test_nullable_void(self):
        left_grammar = '''
            @@left_recursion :: True
            @@nameguard :: False

            start = A $ ;
            A = | A 'a' | () ;
        '''

        assert (('a', 'a'), 'a') == parse(left_grammar, 'aaa')
示例#6
0
    def test_peg_associativity(self):
        left_grammar = '''
            @@left_recursion :: True
            @@nameguard :: False

            start = A $ ;
            A = | A 'a' | 'a' A | 'a' ;
        '''

        assert [['a', 'a'], 'a'] == parse(left_grammar, 'aaa')

        right_grammar = '''
            @@left_recursion :: True
            @@nameguard :: False

            start = A $ ;
            A = | 'a' A | A 'a' | 'a' ;
        '''

        assert ['a', ['a', 'a']] == parse(right_grammar, 'aaa')
示例#7
0
    def test_associativity(self):
        left_grammar = '''
            @@left_recursion :: True
            @@nameguard :: False

            start = A $ ;
            A = | A 'a' | 'a' ;
        '''

        assert (('a', 'a'), 'a') == parse(left_grammar, 'aaa')

        right_grammar = '''
            @@left_recursion :: True
            @@nameguard :: False

            start = A $ ;
            A = | 'a' A | 'a' ;
        '''

        assert ('a', ('a', 'a')) == parse(right_grammar, 'aaa')
示例#8
0
    def test_not_at_top_level(self):
        grammar = r"""
            identifier = /\w+/ ;

            type = (vector_type | leaf_type) ;
            vector_type = base:type '[]' ;
            leaf_type = id:identifier ;

            decl = type:type name:identifier ;
        """
        self.assertEquals(
            {'type': {'id': 'int'}, 'name': 'x'},
            parse(grammar, 'int x', start='decl').asjson()
        )
示例#9
0
def test_constant_interpolation_multiline():
    input = '42 69'
    grammar = '''
            start = a:number b: number
            i:```
            seen:
            {a}
            {b}
            ``` $ ;
            number = /\d+/ ;
    '''

    result = parse(grammar, input)
    print(result)
    assert result == {'a': '42', 'b': '69', 'i': 'seen:\n42\n69\n'}