|
|
@@ -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() |