Data update

This commit is contained in:
Ingy dot Net 2024-04-19 16:56:29 -07:00
parent 0df55f9f24
commit aec8ed51b6
1045 changed files with 18889 additions and 2777 deletions

View file

@ -6,19 +6,23 @@
const expr = [
"((data \"quoted data\" 123 4.5)",
" (data (!@# (4.5) \"(more\" \"data)\")))"
].join("\n");
]
.join("\n");
const [parse, residue] = parseExpr(
tokenized(expr)
);
return 0 < residue.length ? (
`Unparsed tokens: ${JSON.stringify(residue)}`
) : 0 < parse.length ? ([
JSON.stringify(parse, null, 2),
"Reserialized from parse:",
parse.map(serialized).join(" ")
].join("\n\n")) : "Could not be parsed";
return 0 < residue.length
? `Unparsed tokens: ${JSON.stringify(residue)}`
: 0 < parse.length
? [
JSON.stringify(parse, null, 2),
"Reserialized from parse:",
parse.map(serialized).join(" ")
]
.join("\n\n")
: "Could not be parsed";
};
// ---------------- EXPRESSION PARSER ----------------
@ -47,28 +51,28 @@
// An open bracket introduces recursion over
// a sub-expression to define a sub-list.
return "(" === token ? (() => {
const [expr, rest] = parseExpr(ts);
return "(" === token
? (() => {
const [expr, rest] = parseExpr(ts);
return [xs.concat([expr]), rest.slice(1)];
})() : ")" === token ? (
[xs, token]
) : [xs.concat(atom(token)), ts];
return [xs.concat([expr]), rest.slice(1)];
})()
: ")" === token
? [xs, token]
: [xs.concat(atom(token)), ts];
};
// ------------------- ATOM PARSER -------------------
// atom :: String -> Expr
const atom = s =>
0 < s.length ? (
isNaN(s) ? (
"\"'".includes(s[0]) ? (
s.slice(1, -1)
) : {
name: s
}
) : parseFloat(s, 10)
) : "";
0 < s.length
? isNaN(s)
? "\"'".includes(s[0])
? s.slice(1, -1)
: {name: s}
: parseFloat(s, 10)
: "";
// ------------------ TOKENIZATION -------------------
@ -77,11 +81,11 @@
const tokenized = s =>
// Brackets and quoted or unquoted atomic strings.
quoteTokens("\"")(s).flatMap(
segment => "\"" !== segment[0] ? (
segment.replace(/([()])/gu, " $1 ")
segment => "\"" !== segment[0]
? segment.replace(/([()])/gu, " $1 ")
.split(/\s+/u)
.filter(Boolean)
) : [segment]
: [segment]
);
@ -89,11 +93,11 @@
const quoteTokens = q =>
// Alternating unquoted and quoted segments.
s => s.split(q).flatMap(
(k, i) => even(i) ? (
Boolean(k) ? (
[k]
) : []
) : [`${q}${k}${q}`]
(k, i) => even(i)
? 0 < k.length
? [k]
: []
: [`${q}${k}${q}`]
);
// ------------------ SERIALIZATION ------------------
@ -102,15 +106,15 @@
const serialized = e => {
const t = typeof e;
return "number" === t ? (
`${e}`
) : "string" === t ? (
`"${e}"`
) : "object" === t ? (
Array.isArray(e) ? (
`(${e.map(serialized).join(" ")})`
) : e.name
) : "?";
return "number" === t
? `${e}`
: "string" === t
? `"${e}"`
: "object" === t
? Array.isArray(e)
? `(${e.map(serialized).join(" ")})`
: e.name
: "?";
};
@ -129,7 +133,9 @@
// that result returns true for the predicate p.
f => {
const go = x =>
p(x) ? x : go(f(x));
p(x)
? x
: go(f(x));
return go;
};