# # This demonstrates example-driven error reporting with the LALR parser # from lark import Lark, UnexpectedInput from .json_parser import json_grammar # Using the grammar from the json_parser example json_parser = Lark(json_grammar, parser='lalr') class JsonSyntaxError(SyntaxError): def __str__(self): context, line, column = self.args return '%s at line %s, column %s.\n\n%s' % (self.label, line, column, context) class JsonMissingValue(JsonSyntaxError): label = 'Missing Value' class JsonMissingOpening(JsonSyntaxError): label = 'Missing Opening' class JsonMissingClosing(JsonSyntaxError): label = 'Missing Closing' class JsonMissingComma(JsonSyntaxError): label = 'Missing Comma' class JsonTrailingComma(JsonSyntaxError): label = 'Trailing Comma' def parse(json_text): try: j = json_parser.parse(json_text) except UnexpectedInput as u: exc_class = u.match_examples(json_parser.parse, { JsonMissingOpening: ['{"foo": ]}', '{"foor": }}', '{"foo": }'], JsonMissingClosing: ['{"foo": [}', '{', '{"a": 1', '[1'], JsonMissingComma: ['[1 2]', '[false 1]', '["b" 1]', '{"a":true 1:4}', '{"a":1 1:4}', '{"a":"b" 1:4}'], JsonTrailingComma: ['[,]', '[1,]', '[1,2,]', '{"foo":1,}', '{"foo":false,"bar":true,}'] }) if not exc_class: raise raise exc_class(u.get_context(json_text), u.line, u.column) def test(): try: parse('{"example1": "value"') except JsonMissingClosing as e: print(e) try: parse('{"example2": ] ') except JsonMissingOpening as e: print(e) if __name__ == '__main__': test()