|
|
|
|
@ -16,70 +16,72 @@ Little reminder: here's the grammar
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JSONLexer(Lexer): |
|
|
|
|
tokens = {"FLOAT", "INTEGER", "STRING"} |
|
|
|
|
class JsonLexer(Lexer): |
|
|
|
|
tokens = {STRING, NUMBER, TRUE, FALSE, NULL} |
|
|
|
|
ignore = ' \t\n\r' |
|
|
|
|
literals = {'{', '}', '[', ']', ':', ','} |
|
|
|
|
|
|
|
|
|
literals = {'{', '}', '[', ']', ',', ':'} |
|
|
|
|
ignore = " \t\n" |
|
|
|
|
@_(r'-?(0|[1-9][0-9]*)(\.[0-9]+)?([Ee][+-]?[0-9]+)?') |
|
|
|
|
def NUMBER(self, t): |
|
|
|
|
t.value = float(t.value) |
|
|
|
|
return t |
|
|
|
|
|
|
|
|
|
@_(r"\".*?\"") |
|
|
|
|
@_(r'"([ !#-\[\]-\U0010ffff]+|\\(["\/\\bfnrt]|u[0-9A-Fa-f]{4}))*"') |
|
|
|
|
def STRING(self, t): |
|
|
|
|
t.value = t.value.strip("\"") |
|
|
|
|
t.value = json_unescape(t.value) |
|
|
|
|
return t |
|
|
|
|
|
|
|
|
|
@_(r"\d+\.\d*") |
|
|
|
|
def FLOAT(self, t): |
|
|
|
|
t.value = float(t.value) |
|
|
|
|
@_(r'true') |
|
|
|
|
def TRUE(self, t): |
|
|
|
|
t.value = True |
|
|
|
|
return t |
|
|
|
|
|
|
|
|
|
@_(r"\d+") |
|
|
|
|
def INTEGER(self, t): |
|
|
|
|
t.value = int(t.value) |
|
|
|
|
@_(r'false') |
|
|
|
|
def FALSE(self, t): |
|
|
|
|
t.value = False |
|
|
|
|
return t |
|
|
|
|
|
|
|
|
|
@_(r'null') |
|
|
|
|
def NULL(self, t): |
|
|
|
|
t.value = None |
|
|
|
|
return t |
|
|
|
|
|
|
|
|
|
class JSONParser(Parser): |
|
|
|
|
tokens = JSONLexer.tokens |
|
|
|
|
start = "json" |
|
|
|
|
|
|
|
|
|
@_('object', |
|
|
|
|
'array') |
|
|
|
|
def json(self, p): |
|
|
|
|
return p[0] |
|
|
|
|
class JsonParser(Parser): |
|
|
|
|
tokens = JsonLexer.tokens |
|
|
|
|
start = 'value' |
|
|
|
|
|
|
|
|
|
@_('"{" members "}"') |
|
|
|
|
def object(self, p): |
|
|
|
|
return {key: value for key, value in p.members} |
|
|
|
|
|
|
|
|
|
@_('pair') |
|
|
|
|
def members(self, p): |
|
|
|
|
return [p.pair] |
|
|
|
|
@_(r'"{" [ pairs ] "}"') |
|
|
|
|
def value(self, p): |
|
|
|
|
if p.pairs: |
|
|
|
|
return dict(p.pairs) |
|
|
|
|
else: |
|
|
|
|
return {} |
|
|
|
|
|
|
|
|
|
@_('pair "," members') |
|
|
|
|
def members(self, p): |
|
|
|
|
return [p.pair] + p.members |
|
|
|
|
@_(r'pair { "," pair }') |
|
|
|
|
def pairs(self, p): |
|
|
|
|
return [p.pair0] + p.pair1 |
|
|
|
|
|
|
|
|
|
@_('STRING ":" value') |
|
|
|
|
@_(r'STRING ":" value') |
|
|
|
|
def pair(self, p): |
|
|
|
|
return p.STRING, p.value |
|
|
|
|
return (p.STRING, p.value) |
|
|
|
|
|
|
|
|
|
@_('"[" elements "]"') |
|
|
|
|
def array(self, p): |
|
|
|
|
return p.elements |
|
|
|
|
|
|
|
|
|
@_('value') |
|
|
|
|
def elements(self, p): |
|
|
|
|
return [p.value] |
|
|
|
|
@_(r'"[" [ items ] "]"') |
|
|
|
|
def value(self, p): |
|
|
|
|
if p.items: |
|
|
|
|
return p.items |
|
|
|
|
else: |
|
|
|
|
return [] |
|
|
|
|
|
|
|
|
|
@_('value "," elements') |
|
|
|
|
def elements(self, p): |
|
|
|
|
return [p.value] + p.elements |
|
|
|
|
@_(r'value { "," value }') |
|
|
|
|
def items(self, p): |
|
|
|
|
return [p.value0] + p.value1 |
|
|
|
|
|
|
|
|
|
@_('STRING', |
|
|
|
|
'INTEGER', |
|
|
|
|
'FLOAT', |
|
|
|
|
'object', |
|
|
|
|
'array') |
|
|
|
|
'NUMBER', |
|
|
|
|
'TRUE', |
|
|
|
|
'FALSE', |
|
|
|
|
'NULL') |
|
|
|
|
def value(self, p): |
|
|
|
|
return p[0] |
|
|
|
|
|
|
|
|
|
|