Skip to content

Commit 9577efb

Browse files
committed
Make precedences fallback
1 parent 74f4ce9 commit 9577efb

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

parse.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export let idx, cur,
3636
seek = n => idx = n,
3737

3838
// a + b - c
39-
expr = (prec = 0, end) => {
39+
expr = (p = 0, end) => {
4040
let cc, token, newNode, fn, prevReserved = parse.reserved, nl;
4141
if (end) parse.asi && (parse.newline = false);
4242
parse.reserved = 0;
@@ -46,8 +46,8 @@ export let idx, cur,
4646
(nl = parse.newline, 1) &&
4747
cc !== end &&
4848
(newNode =
49-
((fn = lookup[cc]) && fn(token, prec)) ??
50-
(token && nl && parse.asi?.(token, prec, expr)) ??
49+
((fn = lookup[cc]) && fn(token, p)) ??
50+
(token && nl && parse.asi?.(token, p, expr)) ??
5151
(!token && !parse.reserved && next(parse.id))
5252
)
5353
) token = newNode, parse.reserved = 0;
@@ -84,7 +84,7 @@ export let idx, cur,
8484
// operator lookup table
8585
lookup = [],
8686

87-
// precedence registry - features register, others can read/override
87+
// precedence registry - features register via token(), others can read
8888
prec = {},
8989

9090
// create operator checker/mapper
@@ -97,7 +97,7 @@ export let idx, cur,
9797
prev = lookup[c],
9898
word = op.toUpperCase() !== op,
9999
matched, r
100-
) => (prec[op] = p, lookup[c] = (a, curPrec, curOp, from = idx) =>
100+
) => (p = prec[op] = !prev && prec[op] || p, lookup[c] = (a, curPrec, curOp, from = idx) =>
101101
(matched = curOp,
102102
(curOp ?
103103
op == curOp :
@@ -108,16 +108,16 @@ export let idx, cur,
108108
) ||
109109
prev?.(a, curPrec, matched)),
110110

111-
binary = (op, prec, right = false) => token(op, prec, (a, b) => a && (b = expr(prec - (right ? .5 : 0))) && [op, a, b]),
111+
binary = (op, p, right = false) => token(op, p, (a, b) => a && (b = expr(p - (right ? .5 : 0))) && [op, a, b]),
112112

113-
unary = (op, prec, post) => token(op, prec, a => post ? (a && [op, a]) : (!a && (a = expr(prec - .5)) && [op, a])),
113+
unary = (op, p, post) => token(op, p, a => post ? (a && [op, a]) : (!a && (a = expr(p - .5)) && [op, a])),
114114

115115
literal = (op, val) => token(op, 200, a => !a && [, val]),
116116

117-
nary = (op, prec, right) => {
118-
token(op, prec,
117+
nary = (op, p, right) => {
118+
token(op, p,
119119
(a, b) => (
120-
b = expr(prec - (right ? .5 : 0)),
120+
b = expr(p - (right ? .5 : 0)),
121121
(
122122
(a?.[0] !== op) && (a = [op, a || null]),
123123
b?.[0] === op ? a.push(...b.slice(1)) : a.push(b || null),
@@ -126,9 +126,9 @@ export let idx, cur,
126126
)
127127
},
128128

129-
group = (op, prec) => token(op[0], prec, a => (!a && [op, expr(0, op.charCodeAt(1)) || null])),
129+
group = (op, p) => token(op[0], p, a => (!a && [op, expr(0, op.charCodeAt(1)) || null])),
130130

131-
access = (op, prec) => token(op[0], prec, a => (a && [op, a, expr(0, op.charCodeAt(1)) || null]));
131+
access = (op, p) => token(op[0], p, a => (a && [op, a, expr(0, op.charCodeAt(1)) || null]));
132132

133133
// === Compile: AST → Evaluator ===
134134

0 commit comments

Comments
 (0)