Skip to content

Instantly share code, notes, and snippets.

@apg
Created April 11, 2011 20:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save apg/914324 to your computer and use it in GitHub Desktop.
Save apg/914324 to your computer and use it in GitHub Desktop.
def charorquoted(strn):
c = anychar(strn)
if c[0] == '"':
return None
elif c[0] == '\\':
c2 = anychar(c[1])
if c2[0] in ('\\', '"'):
return (c[0] + c2[0], c2[1])
else:
return c
def wsed(p):
def _(strn):
w = repeat0(whitespace)(strn)
if w:
pres = p(w[1])
if pres:
w2 = repeat0(whitespace)(pres[1])
if w2:
return (pres[0], w2[1])
return None
return _
class Forward(object):
def __init__(self):
self.p = None
def __call__(self, *args, **kwargs):
return self.p(*args, **kwargs)
anint = sequence(optional(matchchr("-")), repeat(digit))
astring = betweenchrs(repeat0(charorquoted), left='"', right='"')
acolon = matchchr(':')
acomma = matchchr(',')
akey = wsed(alt(anint, astring))
avalue = Forward() #wsed(alt(anint, astring))
akeyvaluepair = sequence(akey, acolon, avalue)
def commaseparated(p):
def _(strn):
r = repeat0(sequence(p, acomma))(strn)
if r:
r2 = repeat0(p)(r[1])
if r2:
return (r[0] + r2[0], r2[1])
return None
return _
adict = betweencurlies(commaseparated(akeyvaluepair))
alist = betweenbrackets(commaseparated(avalue))
avalue.p = alt(wsed(adict), wsed(alist), wsed(anint), wsed(astring))
json = alt(adict, alist)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment