| @@ -0,0 +1,114 @@ | |||
| import json | |||
| import unittest | |||
| from unittest import TestCase | |||
| from lark import Lark | |||
| from lark.reconstruct import Reconstructor | |||
| common = """ | |||
| %import common (WS_INLINE, NUMBER, WORD) | |||
| %ignore WS_INLINE | |||
| """ | |||
| class TestReconstructor(TestCase): | |||
| def reconstruct(self, grammar, code): | |||
| parser = Lark(grammar, parser='lalr') | |||
| tree = parser.parse(code) | |||
| new = Reconstructor(parser).reconstruct(tree) | |||
| self.assertEqual(code.replace(' ', ''), new.replace(' ', '')) | |||
| def test_starred_rule(self): | |||
| g = """ | |||
| start: item* | |||
| item: NL | |||
| | rule | |||
| rule: WORD ":" NUMBER | |||
| NL: /(\\r?\\n)+\s*/ | |||
| """ + common | |||
| code = """ | |||
| Elephants: 12 | |||
| """ | |||
| self.reconstruct(g, code) | |||
| def test_starred_group(self): | |||
| g = """ | |||
| start: (rule | _NL)* | |||
| rule: WORD ":" NUMBER | |||
| _NL: /(\\r?\\n)+\s*/ | |||
| """ + common | |||
| code = """ | |||
| Elephants: 12 | |||
| """ | |||
| self.reconstruct(g, code) | |||
| def test_alias(self): | |||
| g = """ | |||
| start: line* | |||
| line: NL | |||
| | rule | |||
| | "hello" -> hi | |||
| rule: WORD ":" NUMBER | |||
| NL: /(\\r?\\n)+\s*/ | |||
| """ + common | |||
| code = """ | |||
| Elephants: 12 | |||
| hello | |||
| """ | |||
| self.reconstruct(g, code) | |||
| def test_json_example(self): | |||
| test_json = ''' | |||
| { | |||
| "empty_object" : {}, | |||
| "empty_array" : [], | |||
| "booleans" : { "YES" : true, "NO" : false }, | |||
| "numbers" : [ 0, 1, -2, 3.3, 4.4e5, 6.6e-7 ], | |||
| "strings" : [ "This", [ "And" , "That", "And a \\"b" ] ], | |||
| "nothing" : null | |||
| } | |||
| ''' | |||
| json_grammar = r""" | |||
| ?start: value | |||
| ?value: object | |||
| | array | |||
| | string | |||
| | SIGNED_NUMBER -> number | |||
| | "true" -> true | |||
| | "false" -> false | |||
| | "null" -> null | |||
| array : "[" [value ("," value)*] "]" | |||
| object : "{" [pair ("," pair)*] "}" | |||
| pair : string ":" value | |||
| string : ESCAPED_STRING | |||
| %import common.ESCAPED_STRING | |||
| %import common.SIGNED_NUMBER | |||
| %import common.WS | |||
| %ignore WS | |||
| """ | |||
| json_parser = Lark(json_grammar, parser='lalr') | |||
| tree = json_parser.parse(test_json) | |||
| new_json = Reconstructor(json_parser).reconstruct(tree) | |||
| self.assertEqual(json.loads(new_json), json.loads(test_json)) | |||
| if __name__ == '__main__': | |||
| unittest.main() | |||