subscript 7.0.6 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,8 +76,6 @@ script.set('===', 9, (a, b) => a===b)
76
76
  // add literals
77
77
  script.set('true', 20, [a => ['',true], a => ctx => a[1]])
78
78
  script.set('false', 20, [a => ['',false], a => ctx => a[1]])
79
-
80
- script(`true === false`)() // false
81
79
  ```
82
80
 
83
81
  See [subscript.js](subscript.js) or [justin.js](./justin.js) for examples.
package/compile.js CHANGED
@@ -1,9 +1,13 @@
1
1
  // build optimized evaluator for the tree
2
- export const compile = (node) => !Array.isArray(node) ? ctx => ctx?.[node] : operator[node[0]](...node.slice(1)),
2
+ export const compile = (node) => !Array.isArray(node) ? ctx => ctx?.[node] : operator[node[0]](...node.slice(1))
3
3
 
4
- set = compile.set = (op, fn, prev=operator[op]) => operator[op] = (...args) => fn(...args) || prev && prev(...args),
5
-
6
- operator = {}
4
+ const operator = {}
7
5
 
6
+ compile.set = (op, fn, prev=operator[op]) => operator[op] = (...args) => fn(...args) || prev && prev(...args)
7
+ compile.binary = (op, fn) => compile.set(op,
8
+ (a,b) => b && (a=compile(a),b=compile(b), !a.length&&!b.length ? (a=fn(a(),b()),()=>a) : ctx => fn(a(ctx),b(ctx)))
9
+ )
10
+ compile.unary = (op, fn) => compile.set(op, (a,b) => !b && (a=compile(a), !a.length ? (a=fn(a()),()=>a) : ctx => fn(a(ctx))))
11
+ compile.nary = (op, fn) => compile.set(op, (...args) => (args=args.map(compile), ctx => fn(...args.map(arg=>arg(ctx)))))
8
12
 
9
13
  export default compile
package/justin.min.js CHANGED
@@ -1 +1 @@
1
- let e,t,r=r=>(e=0,t=r,r=a(),t[e]?l():r||""),l=(r="Bad syntax",l=t[e],n=t.slice(0,e).split("\n"),a=n.pop())=>{throw SyntaxError(`${r} \`${a.slice(-10)}${l}\` at ${n.length}:${a.length}`)},n=(r=1,l=e,n)=>{if("number"==typeof r)e+=r;else for(;n=r(t.charCodeAt(e));)e+=n;return t.slice(l,e)},a=(t=0,r,n,a,o,c)=>{for(;(n=s())&&(o=((c=i[n])&&c(a,t))??(!a&&i[0]()));)a=o;return r&&(n==r?e++:l()),a},s=r=>{for(;(r=t.charCodeAt(e))<=32;)e++;return r},o=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e,i=[e=>n(o)];r.set=(r,l=32,n,a=r.charCodeAt(0),s=r.length,c=i[a],p=r.toUpperCase()!==r)=>i[a]=(a,i,f=e)=>i<l&&(s<2||t.substr(e,s)==r)&&(!p||!o(t.charCodeAt(e+s)))&&(e+=s,n(a,i))||(e=f,c?.(a,i));const c=e=>Array.isArray(e)?p[e[0]](...e.slice(1)):t=>t?.[e];c.set=(e,t,r=p[e])=>p[e]=(...e)=>t(...e)||r&&r(...e);const p={},f=e=>(e=r(e),t=>(e.call?e:e=c(e))(t)),h=f.set=(e,t,l,n=t<0,s=l[0],o=l[1],p=!s&&l.length)=>(s||=p?p>1?(r,l)=>r&&(l=a(t-n))&&[e,r,l]:r=>!r&&(r=a(t-1))&&[e,r]:(r,l)=>r&&(l=a(t))&&(r[0]===e&&r[2]?(r.push(l),r):[e,r,l]),o||=p?p>1?(e,t)=>t&&(e=c(e),t=c(t),e.length||t.length?r=>l(e(r),t(r)):(e=l(e(),t()),()=>e)):(e,t)=>!t&&((e=c(e)).length?t=>l(e(t)):(e=l(e()),()=>e)):(...e)=>(e=e.map(c),t=>l(...e.map((e=>e(t))))),(t=n?-t:t)?r.set(e,t,s):i[e.charCodeAt(0)||1]=s,c.set(e,o)),d=e=>e?l():["",(e=+n((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?l():e],u=(e,t,r,l)=>[e,t,[r=>r?["++"===e?"-":"+",[e,r],["",1]]:[e,a(t-1)],l=(e,t)=>"("===e[0]?l(e[1]):"."===e[0]?(t=e[2],e=c(e[1]),l=>r(e(l),t)):"["===e[0]?([,e,t]=e,e=c(e),t=c(t),l=>r(e(l),t(l))):t=>r(t,e)]],g=["",,[,e=>()=>e],'"',,[e=>e?l():["",(n()+n((e=>e-34?1:0))+(n()||l("Bad string"))).slice(1,-1)]],".",,[e=>!e&&d()],...Array(10).fill(0).flatMap(((e,t)=>[""+t,0,[d]])),",",1,(...e)=>e[e.length-1],"||",4,(...e)=>{let t,r=0;for(;!t&&r<e.length;)t=e[r++];return t},"&&",5,(...e)=>{let t=0,r=!0;for(;r&&t<e.length;)r=e[t++];return r},"+",12,(e,t)=>e+t,"-",12,(e,t)=>e-t,"*",13,(e,t)=>e*t,"/",13,(e,t)=>e/t,"%",13,(e,t)=>e%t,"|",6,(e,t)=>e|t,"&",8,(e,t)=>e&t,"^",7,(e,t)=>e^t,"==",9,(e,t)=>e==t,"!=",9,(e,t)=>e!=t,">",10,(e,t)=>e>t,">=",10,(e,t)=>e>=t,"<",10,(e,t)=>e<t,"<=",10,(e,t)=>e<=t,">>",11,(e,t)=>e>>t,">>>",11,(e,t)=>e>>>t,"<<",11,(e,t)=>e<<t,"+",15,e=>+e,"-",15,e=>-e,"!",15,e=>!e,...u("++",15,((e,t)=>++e[t])),...u("--",15,((e,t)=>--e[t])),"[",18,[e=>e&&["[",e,a(0,93)||l()],(e,t)=>t&&(e=c(e),t=c(t),r=>e(r)[t(r)])],".",18,[(e,t)=>e&&(t=a(18))&&[".",e,t],(e,t)=>(e=c(e),t=t[0]?t:t[1],r=>e(r)[t])],"(",18,[e=>!e&&["(",a(0,41)||l()],c],"(",18,[e=>e&&["(",e,a(0,41)||""],(e,t,r,l)=>null!=t&&(l=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(c),e=>t.map((t=>t(e)))):(t=c(t),e=>[t(e)]),"."===e[0]?(r=e[2],e=c(e[1]),t=>e(t)[r](...l(t))):"["===e[0]?(r=c(e[2]),e=c(e[1]),t=>e(t)[r(t)](...l(t))):(e=c(e),t=>e(t)(...l(t))))]];for(;g[2];)h(...g.splice(0,3));let m={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},A=r=>(a,s,o="")=>{for(a&&l("Unexpected string"),n();(s=t.charCodeAt(e))-r;)92===s?(n(),s=n(),o+=m[s]||s):o+=n();return n(),["",o]},y=["===",9,(e,t)=>e===t,"!==",9,(e,t)=>e!==t,"~",15,e=>~e,"?",3,[(e,t,r)=>e&&(t=a(2,58))&&["?",e,t,a(3)],(e,t,r)=>(e=c(e),t=c(t),r=c(r),l=>e(l)?t(l):r(l))],"??",6,(e,t)=>e??t,"?.",18,[e=>e&&["?.",e],e=>(e=c(e),t=>e(t)||(()=>{}))],"?.",18,[(e,t)=>e&&!(t=a(18))?.map&&["?.",e,t],(e,t)=>t&&(e=c(e),r=>e(r)?.[t])],"in",10,(e,t)=>e in t,'"',,[A(34)],"'",,[A(39)],"/*",20,[(r,l)=>(n((r=>42!==r&&47!==t.charCodeAt(e+1))),n(2),r||a(l))],"//",20,[(e,t)=>(n((e=>e>=32)),e||a(t))],"null",20,[e=>e?l():["",null]],"true",20,[e=>e?l():["",!0]],"false",20,[e=>e?l():["",!1]],"undefined",20,[e=>e?l():["",void 0]],";",20,[e=>a()||[""]],"**",-14,(e,t)=>e**t,"[",20,[e=>!e&&["[",a(0,93)||""],(e,t)=>!t&&(e?","===e[0]?(e=e.slice(1).map(c),t=>e.map((e=>e(t)))):(e=c(e),t=>[e(t)]):()=>[])],"{",20,[e=>!e&&["{",a(0,125)||""],(e,t)=>e?","===e[0]?(e=e.slice(1).map(c),t=>Object.fromEntries(e.map((e=>e(t))))):":"===e[0]?(e=c(e),t=>Object.fromEntries([e(t)])):(t=c(e),r=>({[e]:t(r)})):e=>({})],":",1.1,[(e,t)=>[":",e,a(1.1)||l()],(e,t)=>(t=c(t),e=Array.isArray(e)?c(e):(e=>e).bind(0,e),r=>[e(r),t(r)])]];for(;y[2];)f.set(...y.splice(0,3));export{c as compile,f as default,r as parse};
1
+ let e,r,t=t=>(e=0,r=t,t=s(),r[e]?n():t||""),n=(t="Bad syntax",n=r[e],a=r.slice(0,e).split("\n"),s=a.pop())=>{throw SyntaxError(`${t} \`${n}\` at ${a.length}:${s.length}`)},a=(t=1,n=e,a)=>{if("number"==typeof t)e+=t;else for(;a=t(r.charCodeAt(e));)e+=a;return r.slice(n,e)},s=(r=0,a,s,l,o,c)=>{for(;(s=t.space())&&(o=((c=i[s])&&c(l,r))??(!l&&t.id()));)l=o;return a&&(s==a?e++:n()),l},l=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e;t.space=t=>{for(;(t=r.charCodeAt(e))<=32;)e++;return t},t.id=e=>a(l);let i=[];t.set=(t,n=32,a,s=t.charCodeAt(0),o=t.length,c=i[s],p=t.toUpperCase()!==t)=>i[s]=(s,i,h=e)=>i<n&&(o<2||r.substr(e,o)==t)&&(!p||!l(r.charCodeAt(e+o)))&&(e+=o,a(s,i))||(e=h,c?.(s,i)),t.binary=(e,r,n)=>t.set(e,r,((t,a)=>t&&(a=s(r-!!n))&&[e,t,a])),t.unary=(e,r,n)=>t.set(e,r,(t=>!t&&(t=s(r-1))&&[e,t])),t.nary=(e,r)=>t.set(e,r,((t,n)=>t&&(n=s(r))&&(t[0]===e&&t[2]?(t.push(n),t):[e,t,n])));const o=e=>Array.isArray(e)?c[e[0]](...e.slice(1)):r=>r?.[e],c={};o.set=(e,r,t=c[e])=>c[e]=(...e)=>r(...e)||t&&t(...e),o.binary=(e,r)=>o.set(e,((e,t)=>t&&(e=o(e),t=o(t),e.length||t.length?n=>r(e(n),t(n)):(e=r(e(),t()),()=>e)))),o.unary=(e,r)=>o.set(e,((e,t)=>!t&&((e=o(e)).length?t=>r(e(t)):(e=r(e()),()=>e)))),o.nary=(e,r)=>o.set(e,((...e)=>(e=e.map(o),t=>r(...e.map((e=>e(t)))))));const p=e=>(e=t(e),r=>(e.call?e:e=o(e))(r)),h=p.set=(e,r,n)=>n[0]||n[1]?(r?t.set(e,r,n[0]):i[e.charCodeAt(0)||1]=n[0],o.set(e,n[1])):n.length?n.length>1?(t.binary(e,Math.abs(r),r<0),o.binary(e,n)):(t.unary(e,r),o.unary(e,n)):(t.nary(e,r),o.nary(e,n)),y=e=>e?n():["",(e=+a((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?n():e],f=(e,r,t,n)=>[e,r,[t=>t?["++"===e?"-":"+",[e,t],["",1]]:[e,s(r-1)],n=(e,r)=>"("===e[0]?n(e[1]):"."===e[0]?(r=e[2],e=o(e[1]),n=>t(e(n),r)):"["===e[0]?([,e,r]=e,e=o(e),r=o(r),n=>t(e(n),r(n))):r=>t(r,e)]],u=["",,[,e=>()=>e],'"',,[e=>e?n():["",(a()+a((e=>e-34?1:0))+(a()||n("Bad string"))).slice(1,-1)]],".",,[e=>!e&&y()],...Array(10).fill(0).flatMap(((e,r)=>[""+r,0,[y]])),",",1,(...e)=>e[e.length-1],"||",4,(...e)=>{let r,t=0;for(;!r&&t<e.length;)r=e[t++];return r},"&&",5,(...e)=>{let r=0,t=!0;for(;t&&r<e.length;)t=e[r++];return t},"+",12,(e,r)=>e+r,"-",12,(e,r)=>e-r,"*",13,(e,r)=>e*r,"/",13,(e,r)=>e/r,"%",13,(e,r)=>e%r,"|",6,(e,r)=>e|r,"&",8,(e,r)=>e&r,"^",7,(e,r)=>e^r,"==",9,(e,r)=>e==r,"!=",9,(e,r)=>e!=r,">",10,(e,r)=>e>r,">=",10,(e,r)=>e>=r,"<",10,(e,r)=>e<r,"<=",10,(e,r)=>e<=r,">>",11,(e,r)=>e>>r,">>>",11,(e,r)=>e>>>r,"<<",11,(e,r)=>e<<r,"+",15,e=>+e,"-",15,e=>-e,"!",15,e=>!e,...f("++",15,((e,r)=>++e[r])),...f("--",15,((e,r)=>--e[r])),"[",18,[e=>e&&["[",e,s(0,93)||n()],(e,r)=>r&&(e=o(e),r=o(r),t=>e(t)[r(t)])],".",18,[(e,r)=>e&&(r=s(18))&&[".",e,r],(e,r)=>(e=o(e),r=r[0]?r:r[1],t=>e(t)[r])],"(",18,[e=>!e&&["(",s(0,41)||n()],o],"(",18,[e=>e&&["(",e,s(0,41)||""],(e,r,t,n)=>null!=r&&(n=""==r?()=>[]:","===r[0]?(r=r.slice(1).map(o),e=>r.map((r=>r(e)))):(r=o(r),e=>[r(e)]),"."===e[0]?(t=e[2],e=o(e[1]),r=>e(r)[t](...n(r))):"["===e[0]?(t=o(e[2]),e=o(e[1]),r=>e(r)[t(r)](...n(r))):(e=o(e),r=>e(r)(...n(r))))]];for(;u[2];)h(...u.splice(0,3));let d={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},g=t=>(s,l,i="")=>{for(s&&n("Unexpected string"),a();(l=r.charCodeAt(e))-t;)92===l?(a(),l=a(),i+=d[l]||l):i+=a();return a(),["",i]},b=["===",9,(e,r)=>e===r,"!==",9,(e,r)=>e!==r,"~",15,e=>~e,"?",3,[(e,r,t)=>e&&(r=s(2,58))&&["?",e,r,s(3)],(e,r,t)=>(e=o(e),r=o(r),t=o(t),n=>e(n)?r(n):t(n))],"??",6,(e,r)=>e??r,"?.",18,[e=>e&&["?.",e],e=>(e=o(e),r=>e(r)||(()=>{}))],"?.",18,[(e,r)=>e&&!(r=s(18))?.map&&["?.",e,r],(e,r)=>r&&(e=o(e),t=>e(t)?.[r])],"in",10,(e,r)=>e in r,'"',,[g(34)],"'",,[g(39)],"/*",20,[(t,n)=>(a((t=>42!==t&&47!==r.charCodeAt(e+1))),a(2),t||s(n))],"//",20,[(e,r)=>(a((e=>e>=32)),e||s(r))],"null",20,[e=>e?n():["",null]],"true",20,[e=>e?n():["",!0]],"false",20,[e=>e?n():["",!1]],"undefined",20,[e=>e?n():["",void 0]],";",20,[e=>s()||[""]],"**",-14,(e,r)=>e**r,"[",20,[e=>!e&&["[",s(0,93)||""],(e,r)=>!r&&(e?","===e[0]?(e=e.slice(1).map(o),r=>e.map((e=>e(r)))):(e=o(e),r=>[e(r)]):()=>[])],"{",20,[e=>!e&&["{",s(0,125)||""],(e,r)=>e?","===e[0]?(e=e.slice(1).map(o),r=>Object.fromEntries(e.map((e=>e(r))))):":"===e[0]?(e=o(e),r=>Object.fromEntries([e(r)])):(r=o(e),t=>({[e]:r(t)})):e=>({})],":",1.1,[(e,r)=>[":",e,s(1.1)||n()],(e,r)=>(r=o(r),e=Array.isArray(e)?o(e):(e=>e).bind(0,e),t=>[e(t),r(t)])]];for(;b[2];)p.set(...b.splice(0,3));export{o as compile,p as default,t as parse};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "subscript",
3
- "version": "7.0.6",
3
+ "version": "7.1.1",
4
4
  "description": "Fast and tiny expression evaluator with common syntax microlanguage.",
5
5
  "main": "subscript.js",
6
6
  "module": "subscript.js",
@@ -28,11 +28,11 @@
28
28
  },
29
29
  "scripts": {
30
30
  "build": "npm run build-subscript && npm run build-justin",
31
- "minify": "npm run minify-subscript && npm run minify-justin",
31
+ "min": "npm run min-subscript && npm run min-justin",
32
32
  "build-subscript": "rollup subscript.js --file subscript.min.js --format esm --name \"Subscript\"",
33
- "minify-subscript": "terser subscript.min.js -o subscript.min.js --module -c passes=3 -m",
33
+ "min-subscript": "terser subscript.min.js -o subscript.min.js --module -c passes=3 -m",
34
34
  "build-justin": "rollup justin.js --file justin.min.js --format esm --name \"Justin\"",
35
- "minify-justin": "terser justin.min.js -o justin.min.js --module -c passes=3 -m",
35
+ "min-justin": "terser justin.min.js -o justin.min.js --module -c passes=3 -m",
36
36
  "test": "node test && node test/jsep && node test/perf"
37
37
  },
38
38
  "repository": {
@@ -78,6 +78,6 @@
78
78
  "devDependencies": {
79
79
  "rollup": "^2.60.2",
80
80
  "terser": "^5.10.0",
81
- "tst": "^7.1.0"
81
+ "tst": "^7.1.1"
82
82
  }
83
83
  }
package/parse.js CHANGED
@@ -6,9 +6,7 @@ export let idx, cur,
6
6
  // no handling tagged literals since easily done on user side with cache, if needed
7
7
  parse = s => (idx=0, cur=s, s = expr(), cur[idx] ? err() : s || ''),
8
8
 
9
- // err = (msg='Bad syntax',c=cur[idx]) => { throw SyntaxError(msg + ' `' + c + '` at ' + idx) },
10
-
11
- err = (msg='Bad syntax',frag=cur.slice(idx-10,idx+1),prev=cur.slice(0,idx).split('\n'),last=prev.pop()) => {
9
+ err = (msg='Bad syntax', frag=cur[idx], prev=cur.slice(0,idx).split('\n'), last=prev.pop()) => {
12
10
  throw SyntaxError(`${msg} \`${frag}\` at ${prev.length}:${last.length}`)
13
11
  },
14
12
 
@@ -20,15 +18,14 @@ skip = (is=1, from=idx, l) => {
20
18
 
21
19
  // a + b - c
22
20
  expr = (prec=0, end, cc, token, newNode, fn) => {
23
-
24
21
  // chunk/token parser
25
22
  while (
26
- ( cc=space() ) && // till not end
23
+ ( cc=parse.space() ) && // till not end
27
24
  // FIXME: extra work is happening here, when lookup bails out due to lower precedence -
28
25
  // it makes extra `space` call for parent exprs on the same character to check precedence again
29
26
  (newNode =
30
27
  ((fn=lookup[cc]) && fn(token, prec)) ?? // if operator with higher precedence isn't found
31
- (!token && lookup[0]()) // parse literal or quit. token seqs are forbidden: `a b`, `a "b"`, `1.32 a`
28
+ (!token && parse.id()) // parse literal or quit. token seqs are forbidden: `a b`, `a "b"`, `1.32 a`
32
29
  )
33
30
  ) token = newNode;
34
31
 
@@ -39,9 +36,6 @@ expr = (prec=0, end, cc, token, newNode, fn) => {
39
36
  return token
40
37
  },
41
38
 
42
- // skip space chars, return first non-space character
43
- space = cc => { while ((cc = cur.charCodeAt(idx)) <= SPACE) idx++; return cc },
44
-
45
39
  isId = c =>
46
40
  (c >= 48 && c <= 57) || // 0..9
47
41
  (c >= 65 && c <= 90) || // A...Z
@@ -49,12 +43,18 @@ isId = c =>
49
43
  c == 36 || c == 95 || // $, _,
50
44
  (c >= 192 && c != 215 && c != 247), // any non-ASCII
51
45
 
46
+ // skip space chars, return first non-space character
47
+ space = parse.space = cc => { while ((cc = cur.charCodeAt(idx)) <= SPACE) idx++; return cc },
48
+
49
+ id = parse.id = n => skip(isId),
50
+
52
51
  // operator/token lookup table
53
52
  // lookup[0] is id parser to let configs redefine it
54
- lookup = [n=>skip(isId)],
53
+ lookup = []
54
+
55
55
 
56
56
  // create operator checker/mapper (see examples)
57
- set = parse.set = (
57
+ parse.set = (
58
58
  op,
59
59
  prec=SPACE,
60
60
  map,
@@ -66,4 +66,10 @@ set = parse.set = (
66
66
  (curPrec<prec && (l<2||cur.substr(idx,l)==op) && (!word||!isId(cur.charCodeAt(idx+l))) && (idx+=l, map(a, curPrec))) ||
67
67
  (idx=from, prev?.(a, curPrec))
68
68
 
69
+ // right assoc is indicated by negative precedence (meaning go from right to left)
70
+ parse.binary = (op, prec, right) => parse.set(op, prec, (a, b) => a && (b=expr(prec-!!right)) && [op,a,b] )
71
+ parse.unary = (op, prec, post) => parse.set(op, prec, a => !a && (a=expr(prec-1)) && [op, a])
72
+ parse.nary = (op, prec) => parse.set(op, prec, (a, b) => a && (b=expr(prec)) && (a[0] === op && a[2] ? (a.push(b), a) : [op,a,b]))
73
+
74
+
69
75
  export default parse
package/subscript.js CHANGED
@@ -9,19 +9,11 @@ const subscript = s => (s=parse(s), ctx => (s.call?s:(s=compile(s)))(ctx)),
9
9
 
10
10
  // set any operator
11
11
  // right assoc is indicated by negative precedence (meaning go from right to left)
12
- set = subscript.set = (op, prec, fn, right=prec<0, parseFn=fn[0], evalFn=fn[1], arity=!parseFn&&fn.length) => (
13
- parseFn ||=
14
- !arity ? (a, b) => a && (b=expr(prec)) && (a[0] === op && a[2] ? (a.push(b), a) : [op,a,b]) :
15
- arity > 1 ? (a, b) => a && (b=expr(prec-right)) && [op,a,b] :
16
- a => !a && (a=expr(prec-1)) && [op, a]
17
- ,
18
- evalFn ||=
19
- !arity ? (...args) => (args=args.map(compile), ctx => fn(...args.map(arg=>arg(ctx)))) :
20
- arity > 1 ? (a,b) => b && (a=compile(a),b=compile(b), !a.length&&!b.length ? (a=fn(a(),b()),()=>a) : ctx => fn(a(ctx),b(ctx))) :
21
- (a,b) => !b && (a=compile(a), !a.length ? (a=fn(a()),()=>a) : ctx => fn(a(ctx)))
22
- ,
23
- (prec=right?-prec:prec) ? parse.set(op,prec,parseFn) : (lookup[op.charCodeAt(0)||1]=parseFn),
24
- compile.set(op, evalFn)
12
+ set = subscript.set = (op, prec, fn) =>
13
+ (fn[0]||fn[1]) ? (prec ? parse.set(op,prec,fn[0]) : (lookup[op.charCodeAt(0)||1]=fn[0]), compile.set(op, fn[1])) : (
14
+ !fn.length ? (parse.nary(op, prec), compile.nary(op, fn)) :
15
+ fn.length > 1 ? (parse.binary(op, Math.abs(prec), prec<0), compile.binary(op, fn)) :
16
+ (parse.unary(op, prec), compile.unary(op, fn))
25
17
  ),
26
18
 
27
19
  num = a => a ? err() : ['', (a=+skip(c => c === PERIOD || (c>=_0 && c<=_9) || (c===69||c===101?2:0)))!=a?err():a],
package/subscript.min.js CHANGED
@@ -1 +1 @@
1
- let e,t,r=r=>(e=0,t=r,r=a(),t[e]?l():r||""),l=(r="Bad syntax",l=t[e],s=t.slice(0,e).split("\n"),a=s.pop())=>{throw SyntaxError(`${r} \`${a.slice(-10)}${l}\` at ${s.length}:${a.length}`)},s=(r=1,l=e,s)=>{if("number"==typeof r)e+=r;else for(;s=r(t.charCodeAt(e));)e+=s;return t.slice(l,e)},a=(t=0,r,s,a,o,c)=>{for(;(s=n())&&(o=((c=h[s])&&c(a,t))??(!a&&h[0]()));)a=o;return r&&(s==r?e++:l()),a},n=r=>{for(;(r=t.charCodeAt(e))<=32;)e++;return r},o=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e,h=[e=>s(o)];r.set=(r,l=32,s,a=r.charCodeAt(0),n=r.length,c=h[a],p=r.toUpperCase()!==r)=>h[a]=(a,h,i=e)=>h<l&&(n<2||t.substr(e,n)==r)&&(!p||!o(t.charCodeAt(e+n)))&&(e+=n,s(a,h))||(e=i,c?.(a,h));const c=e=>Array.isArray(e)?p[e[0]](...e.slice(1)):t=>t?.[e];c.set=(e,t,r=p[e])=>p[e]=(...e)=>t(...e)||r&&r(...e);const p={},i=e=>(e=r(e),t=>(e.call?e:e=c(e))(t)),f=i.set=(e,t,l,s=t<0,n=l[0],o=l[1],p=!n&&l.length)=>(n||=p?p>1?(r,l)=>r&&(l=a(t-s))&&[e,r,l]:r=>!r&&(r=a(t-1))&&[e,r]:(r,l)=>r&&(l=a(t))&&(r[0]===e&&r[2]?(r.push(l),r):[e,r,l]),o||=p?p>1?(e,t)=>t&&(e=c(e),t=c(t),e.length||t.length?r=>l(e(r),t(r)):(e=l(e(),t()),()=>e)):(e,t)=>!t&&((e=c(e)).length?t=>l(e(t)):(e=l(e()),()=>e)):(...e)=>(e=e.map(c),t=>l(...e.map((e=>e(t))))),(t=s?-t:t)?r.set(e,t,n):h[e.charCodeAt(0)||1]=n,c.set(e,o)),g=e=>e?l():["",(e=+s((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?l():e],u=(e,t,r,l)=>[e,t,[r=>r?["++"===e?"-":"+",[e,r],["",1]]:[e,a(t-1)],l=(e,t)=>"("===e[0]?l(e[1]):"."===e[0]?(t=e[2],e=c(e[1]),l=>r(e(l),t)):"["===e[0]?([,e,t]=e,e=c(e),t=c(t),l=>r(e(l),t(l))):t=>r(t,e)]],d=["",,[,e=>()=>e],'"',,[e=>e?l():["",(s()+s((e=>e-34?1:0))+(s()||l("Bad string"))).slice(1,-1)]],".",,[e=>!e&&g()],...Array(10).fill(0).flatMap(((e,t)=>[""+t,0,[g]])),",",1,(...e)=>e[e.length-1],"||",4,(...e)=>{let t,r=0;for(;!t&&r<e.length;)t=e[r++];return t},"&&",5,(...e)=>{let t=0,r=!0;for(;r&&t<e.length;)r=e[t++];return r},"+",12,(e,t)=>e+t,"-",12,(e,t)=>e-t,"*",13,(e,t)=>e*t,"/",13,(e,t)=>e/t,"%",13,(e,t)=>e%t,"|",6,(e,t)=>e|t,"&",8,(e,t)=>e&t,"^",7,(e,t)=>e^t,"==",9,(e,t)=>e==t,"!=",9,(e,t)=>e!=t,">",10,(e,t)=>e>t,">=",10,(e,t)=>e>=t,"<",10,(e,t)=>e<t,"<=",10,(e,t)=>e<=t,">>",11,(e,t)=>e>>t,">>>",11,(e,t)=>e>>>t,"<<",11,(e,t)=>e<<t,"+",15,e=>+e,"-",15,e=>-e,"!",15,e=>!e,...u("++",15,((e,t)=>++e[t])),...u("--",15,((e,t)=>--e[t])),"[",18,[e=>e&&["[",e,a(0,93)||l()],(e,t)=>t&&(e=c(e),t=c(t),r=>e(r)[t(r)])],".",18,[(e,t)=>e&&(t=a(18))&&[".",e,t],(e,t)=>(e=c(e),t=t[0]?t:t[1],r=>e(r)[t])],"(",18,[e=>!e&&["(",a(0,41)||l()],c],"(",18,[e=>e&&["(",e,a(0,41)||""],(e,t,r,l)=>null!=t&&(l=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(c),e=>t.map((t=>t(e)))):(t=c(t),e=>[t(e)]),"."===e[0]?(r=e[2],e=c(e[1]),t=>e(t)[r](...l(t))):"["===e[0]?(r=c(e[2]),e=c(e[1]),t=>e(t)[r(t)](...l(t))):(e=c(e),t=>e(t)(...l(t))))]];for(;d[2];)f(...d.splice(0,3));export{c as compile,i as default,r as parse};
1
+ let e,t,r=r=>(e=0,t=r,r=s(),t[e]?a():r||""),a=(r="Bad syntax",a=t[e],n=t.slice(0,e).split("\n"),s=n.pop())=>{throw SyntaxError(`${r} \`${a}\` at ${n.length}:${s.length}`)},n=(r=1,a=e,n)=>{if("number"==typeof r)e+=r;else for(;n=r(t.charCodeAt(e));)e+=n;return t.slice(a,e)},s=(t=0,n,s,l,o,y)=>{for(;(s=r.space())&&(o=((y=h[s])&&y(l,t))??(!l&&r.id()));)l=o;return n&&(s==n?e++:a()),l},l=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e;r.space=r=>{for(;(r=t.charCodeAt(e))<=32;)e++;return r},r.id=e=>n(l);let h=[];r.set=(r,a=32,n,s=r.charCodeAt(0),o=r.length,y=h[s],i=r.toUpperCase()!==r)=>h[s]=(s,h,c=e)=>h<a&&(o<2||t.substr(e,o)==r)&&(!i||!l(t.charCodeAt(e+o)))&&(e+=o,n(s,h))||(e=c,y?.(s,h)),r.binary=(e,t,a)=>r.set(e,t,((r,n)=>r&&(n=s(t-!!a))&&[e,r,n])),r.unary=(e,t,a)=>r.set(e,t,(r=>!r&&(r=s(t-1))&&[e,r])),r.nary=(e,t)=>r.set(e,t,((r,a)=>r&&(a=s(t))&&(r[0]===e&&r[2]?(r.push(a),r):[e,r,a])));const o=e=>Array.isArray(e)?y[e[0]](...e.slice(1)):t=>t?.[e],y={};o.set=(e,t,r=y[e])=>y[e]=(...e)=>t(...e)||r&&r(...e),o.binary=(e,t)=>o.set(e,((e,r)=>r&&(e=o(e),r=o(r),e.length||r.length?a=>t(e(a),r(a)):(e=t(e(),r()),()=>e)))),o.unary=(e,t)=>o.set(e,((e,r)=>!r&&((e=o(e)).length?r=>t(e(r)):(e=t(e()),()=>e)))),o.nary=(e,t)=>o.set(e,((...e)=>(e=e.map(o),r=>t(...e.map((e=>e(r)))))));const i=e=>(e=r(e),t=>(e.call?e:e=o(e))(t)),c=i.set=(e,t,a)=>a[0]||a[1]?(t?r.set(e,t,a[0]):h[e.charCodeAt(0)||1]=a[0],o.set(e,a[1])):a.length?a.length>1?(r.binary(e,Math.abs(t),t<0),o.binary(e,a)):(r.unary(e,t),o.unary(e,a)):(r.nary(e,t),o.nary(e,a)),p=e=>e?a():["",(e=+n((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?a():e],u=(e,t,r,a)=>[e,t,[r=>r?["++"===e?"-":"+",[e,r],["",1]]:[e,s(t-1)],a=(e,t)=>"("===e[0]?a(e[1]):"."===e[0]?(t=e[2],e=o(e[1]),a=>r(e(a),t)):"["===e[0]?([,e,t]=e,e=o(e),t=o(t),a=>r(e(a),t(a))):t=>r(t,e)]],g=["",,[,e=>()=>e],'"',,[e=>e?a():["",(n()+n((e=>e-34?1:0))+(n()||a("Bad string"))).slice(1,-1)]],".",,[e=>!e&&p()],...Array(10).fill(0).flatMap(((e,t)=>[""+t,0,[p]])),",",1,(...e)=>e[e.length-1],"||",4,(...e)=>{let t,r=0;for(;!t&&r<e.length;)t=e[r++];return t},"&&",5,(...e)=>{let t=0,r=!0;for(;r&&t<e.length;)r=e[t++];return r},"+",12,(e,t)=>e+t,"-",12,(e,t)=>e-t,"*",13,(e,t)=>e*t,"/",13,(e,t)=>e/t,"%",13,(e,t)=>e%t,"|",6,(e,t)=>e|t,"&",8,(e,t)=>e&t,"^",7,(e,t)=>e^t,"==",9,(e,t)=>e==t,"!=",9,(e,t)=>e!=t,">",10,(e,t)=>e>t,">=",10,(e,t)=>e>=t,"<",10,(e,t)=>e<t,"<=",10,(e,t)=>e<=t,">>",11,(e,t)=>e>>t,">>>",11,(e,t)=>e>>>t,"<<",11,(e,t)=>e<<t,"+",15,e=>+e,"-",15,e=>-e,"!",15,e=>!e,...u("++",15,((e,t)=>++e[t])),...u("--",15,((e,t)=>--e[t])),"[",18,[e=>e&&["[",e,s(0,93)||a()],(e,t)=>t&&(e=o(e),t=o(t),r=>e(r)[t(r)])],".",18,[(e,t)=>e&&(t=s(18))&&[".",e,t],(e,t)=>(e=o(e),t=t[0]?t:t[1],r=>e(r)[t])],"(",18,[e=>!e&&["(",s(0,41)||a()],o],"(",18,[e=>e&&["(",e,s(0,41)||""],(e,t,r,a)=>null!=t&&(a=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(o),e=>t.map((t=>t(e)))):(t=o(t),e=>[t(e)]),"."===e[0]?(r=e[2],e=o(e[1]),t=>e(t)[r](...a(t))):"["===e[0]?(r=o(e[2]),e=o(e[1]),t=>e(t)[r(t)](...a(t))):(e=o(e),t=>e(t)(...a(t))))]];for(;g[2];)c(...g.splice(0,3));export{o as compile,i as default,r as parse};