S-expressions: Difference between revisions

Content added Content deleted
m (→‎Python :: Functional: (factored out a helper function))
m (→‎Python :: Functional: (Disaggregated the expression parser))
Line 5,320: Line 5,320:
unparsed tokens that remain.
unparsed tokens that remain.
'''
'''
def finished(xr):
r = xr[1]
return (not r) or (r[0] == ")")

def parseToken(xsr):
xs, r = xsr
h, *t = r
if "(" == h:
expr, rest = parseExpr(t)
return xs + [expr], rest[1:]
else:
return (xs, t) if ")" == h else (
xs + [atom(h)], t
)

return until(finished)(parseToken)(
return until(finished)(parseToken)(
([], tokens)
([], tokens)
)
)



# finished :: ([Expr], [String]) -> Bool
def finished(xr):
'''True if no tokens remain,
or the next token is a closing bracket.
'''
r = xr[1]
return (not r) or (r[0] == ")")


# parseToken :: ([Expr], [String]) -> ([Expr], [String])
def parseToken(xsr):
'''A tuple of an expanded expression
and a reduced token list.
'''
xs, r = xsr
h, *t = r
if "(" == h:
expr, rest = parseExpr(t)
return xs + [expr], rest[1:]
else:
return (xs, t) if ")" == h else (
xs + [atom(h)], t
)


# --------------------- ATOM PARSER ----------------------
# --------------------- ATOM PARSER ----------------------