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. |
||
until(finished)(readToken)( |
|||
Tuple([])(tokens) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
// finished :: ([Expr], [String]) -> Bool |
|||
⚫ | |||
⚫ | |||
⚫ | |||
0 === tkns.length || ")" === tkns[0]; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
// readToken :: ([Expr], [String]) -> ([Expr], [String]) |
|||
// Other tokens are appended leaves. |
|||
const readToken = ([exprs, tkns]) => |
|||
0 < tkns.length ? (() => { |
|||
const [t, ...ts] = tkns; |
|||
})() : Tuple(exprs)(tkns); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
return until(finished)(readToken)( |
|||
Tuple([])(tokens) |
|||
⚫ | |||
}; |
|||
// ------------------- ATOM PARSER ------------------- |
// ------------------- ATOM PARSER ------------------- |