Jump to content

S-expressions: Difference between revisions

m
→‎Python :: Functional: (Disaggregated the expression parser)
m (→‎Python :: Functional: (factored out a helper function))
m (→‎Python :: Functional: (Disaggregated the expression parser))
Line 5,320:
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)(
([], 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 ----------------------
9,655

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.