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'
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
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'}
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'}
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')
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')
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')
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() )
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'}