Data update
This commit is contained in:
parent
0df55f9f24
commit
aec8ed51b6
1045 changed files with 18889 additions and 2777 deletions
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue