S-expressions: Difference between revisions

Content added Content deleted
m (→‎{{header|Haskell}}: (disaggregated expression parser))
m (→‎JavaScript :: Functional: (disaggregated expression parser))
Line 3,789: Line 3,789:


// parseExpr [String] -> ([Expr], [String])
// parseExpr [String] -> ([Expr], [String])
const parseExpr = tokens => {
const parseExpr = tokens =>
// A tuple of (parsed trees, residual tokens)
// A tuple of (parsed trees, residual tokens)
// derived from a list of tokens.
// derived from a list of tokens.
const finished = ([, tkns]) =>
until(finished)(readToken)(
0 === tkns.length || ")" === tkns[0];
Tuple([])(tokens)
);


const readToken = ([exprs, tkns]) =>
0 < tkns.length ? (() => {
const [t, ...ts] = tkns;


// finished :: ([Expr], [String]) -> Bool
// Subforests are introduced by brackets,
const finished = ([, tkns]) =>
return "(" === t ? (
bimap(
0 === tkns.length || ")" === tkns[0];
xs => exprs.concat([xs])
)(
tail
)(
parseExpr(ts)
)


// and conclude where brackets close.
) : ")" === t ? (
Tuple(exprs)(ts)


// readToken :: ([Expr], [String]) -> ([Expr], [String])
// Other tokens are appended leaves.
) : Tuple(
const readToken = ([exprs, tkns]) =>
exprs.concat(atom(t))
0 < tkns.length ? (() => {
)(ts);
const [t, ...ts] = tkns;

})() : Tuple(exprs)(tkns);
// Subforests are introduced by brackets,
return "(" === t ? (
bimap(
xs => exprs.concat([xs])
)(tail)(parseExpr(ts))

// and conclude where brackets close.
) : ")" === t ? (
Tuple(exprs)(ts)

// Other tokens are appended leaves.
) : Tuple(
exprs.concat(atom(t))
)(ts);
})() : Tuple(exprs)(tkns);


return until(finished)(readToken)(
Tuple([])(tokens)
);
};


// ------------------- ATOM PARSER -------------------
// ------------------- ATOM PARSER -------------------