subscript 8.4.1 → 8.5.0

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
@@ -124,6 +124,8 @@ _Subscript_ provides premade language [features](./features) and API to customiz
124
124
  * `token(str, precedence, lnode => node)` − register custom token or literal. Callback takes left-side node and returns complete expression node.
125
125
  * `operator(str, (a, b) => ctx => value)` − register evaluator for an operator. Callback takes node arguments and returns evaluator function.
126
126
 
127
+ Longer operators should be registered after shorter ones, eg. first `|`, then `||`, then `||=`.
128
+
127
129
  ```js
128
130
  import script, { compile, operator, unary, binary, token } from './subscript.js'
129
131
 
package/feature/add.js CHANGED
@@ -6,6 +6,9 @@ import { compile, prop, operator } from '../src/compile.js'
6
6
  binary('+', PREC_ADD), operator('+', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) + b(ctx)))
7
7
  binary('-', PREC_ADD), operator('-', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) - b(ctx)))
8
8
 
9
+ unary('+', PREC_PREFIX), operator('+', (a, b) => !b && (a = compile(a), ctx => +a(ctx)))
10
+ unary('-', PREC_PREFIX), operator('-', (a, b) => !b && (a = compile(a), ctx => -a(ctx)))
11
+
9
12
  binary('+=', PREC_ASSIGN, true)
10
13
  operator('+=', (a, b) => (
11
14
  b = compile(b),
@@ -17,6 +20,3 @@ operator('-=', (a, b) => (
17
20
  b = compile(b),
18
21
  prop(a, (container, path, ctx) => (container[path] -= b(ctx)))
19
22
  ))
20
-
21
- unary('+', PREC_PREFIX), operator('+', (a, b) => !b && (a = compile(a), ctx => +a(ctx)))
22
- unary('-', PREC_PREFIX), operator('-', (a, b) => !b && (a = compile(a), ctx => -a(ctx)))
@@ -9,7 +9,3 @@ binary('|', PREC_OR), operator('|', (a, b) => b && (a = compile(a), b = compile(
9
9
  binary('&', PREC_AND), operator('&', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) & b(ctx)))
10
10
 
11
11
  binary('^', PREC_XOR), operator('^', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) ^ b(ctx)))
12
-
13
- binary('>>', PREC_SHIFT), operator('>>', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) >> b(ctx)))
14
-
15
- binary('<<', PREC_SHIFT), operator('<<', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) << b(ctx)))
@@ -0,0 +1,7 @@
1
+ import { PREC_OR, PREC_AND, PREC_SHIFT, PREC_XOR, PREC_PREFIX } from "../src/const.js"
2
+ import { unary, binary } from "../src/parse.js"
3
+ import { operator, compile } from "../src/compile.js"
4
+
5
+
6
+ binary('>>', PREC_SHIFT), operator('>>', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) >> b(ctx)))
7
+ binary('<<', PREC_SHIFT), operator('<<', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) << b(ctx)))
package/justin.min.js CHANGED
@@ -1 +1 @@
1
- let e,r,t=t=>(e=0,r=t,t=i(),r[e]?a():t||""),a=(t="Bad syntax",a=r.slice(0,e).split("\n"),l=a.pop())=>{let s=r.slice(e-108,e).split("\n").pop(),i=r.slice(e,e+108).split("\n").shift();throw EvalError(`${t} at ${a.length}:${l.length} \`${e>=108?"…":""}${s}┃${i}\``,"font-weight: bold")},l=(t,a=e,l)=>{for(;l=t(r.charCodeAt(e));)e+=l;return r.slice(a,e)},s=(t=1,a=e)=>(e+=t,r.slice(a,e)),i=(r=0,s)=>{let i,p,c,d;for(;(i=n())&&(c=((d=o[i])&&d(p,r))??(!p&&l(t.id)));)p=c;return s&&(i==s?e++:a()),p},n=t=>{for(;(t=r.charCodeAt(e))<=32;)e++;return t};t.id=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e;let o=[],p=(l,s=32,i,n=l.charCodeAt(0),p=l.length,c=o[n],d=l.toUpperCase()!==l)=>o[n]=(n,o,f=e)=>o<s&&(p<2||r.substr(e,p)==l)&&(!d||!t.id(r.charCodeAt(e+p)))&&(e+=p,i(n)||(e=f,!c&&a()))||c?.(n,o),c=(e,r,t=!1)=>p(e,r,((a,l)=>a&&(l=i(r-(t?.5:0)))&&[e,a,l])),d=(e,r,t)=>p(e,r,(a=>t?a&&[e,a]:!a&&(a=i(r-.5))&&[e,a])),f=(e,r,t)=>{p(e,r,((t,a)=>(a=i(r),t?.[0]!==e&&(t=[e,t]),a?.[0]===e?t.push(...a.slice(1)):t.push(a),t)))},h=(e,r)=>p(e[0],r,(r=>!r&&[e,i(0,e.charCodeAt(1))])),u=(e,r)=>p(e[0],r,(r=>r&&[e[0],r,i(0,e.charCodeAt(1))]));const A=e=>Array.isArray(e)?e[0]?m[e[0]](...e.slice(1)):()=>e[1]:A.id(e);A.id=e=>r=>r?.[e];const m={},y=(e,r,t=m[e])=>m[e]=(...e)=>r(...e)||t&&t(...e),C=(e,r,t,l,s)=>"()"===e[0]?C(e[1],r,t):"string"==typeof e?t=>r(t,e,t):"."===e[0]?(l=A(e[1]),s=e[2],e=>r(l(e),s,e)):"["===e[0]?(l=A(e[1]),s=A(e[2]),e=>r(l(e),s(e),e)):t?(e=A(e),t=>r([e(t)],0,t)):()=>a("Bad left value"),g=(e,r)=>[,(e=+l((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?a():e];o[46]=e=>!e&&g();for(let e=48;e<=57;e++)o[e]=e=>e?a():g();const b={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},v=t=>(l,i,n="")=>{for(l&&a("Unexpected string"),s();(i=r.charCodeAt(e))-t;)92===i?(s(),i=s(),n+=b[i]||i):n+=s();return s()||a("Bad string"),[,n]};o[34]=v(34),o[39]=v(39),u("()",170),y("(",((e,r,t)=>(t=r?","===r[0]?(r=r.slice(1).map((e=>e?A(e):err())),e=>r.map((r=>r(e)))):(r=A(r),e=>[r(e)]):()=>[],C(e,((e,r,a)=>e[r](...t(a))),!0)))),u("[]",170),y("[",((e,r)=>r?(e=A(e),r=A(r),t=>e(t)[r(t)]):err())),c(".",170),y(".",((e,r)=>(e=A(e),r=r[0]?r:r[1],t=>e(t)[r]))),h("()",170),y("()",(e=>(!e&&a("Empty ()"),A(e))));const $=(...e)=>(e=e.map(A),r=>e.map((e=>e(r))).pop());f(",",10),y(",",$),f(";",5),y(";",$),c("*",120),y("*",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)*r(t)))),c("/",120),y("/",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)/r(t)))),c("%",120),y("%",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)%r(t)))),c("*=",20,!0),y("*=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]*=r(a)))))),c("/=",20,!0),y("/=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]/=r(a)))))),c("%=",20,!0),y("%=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]%=r(a)))))),c("+",110),y("+",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)+r(t)))),c("-",110),y("-",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)-r(t)))),c("+=",20,!0),y("+=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]+=r(a)))))),c("-=",20,!0),y("-=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]-=r(a)))))),d("+",140),y("+",((e,r)=>!r&&(e=A(e),r=>+e(r)))),d("-",140),y("-",((e,r)=>!r&&(e=A(e),r=>-e(r)))),p("++",150,(e=>e?["++-",e]:["++",i(149)])),y("++",(e=>C(e,((e,r,t)=>++e[r])))),y("++-",(e=>C(e,((e,r,t)=>e[r]++)))),p("--",150,(e=>e?["--+",e]:["--",i(149)])),y("--",(e=>C(e,((e,r,t)=>--e[r])))),y("--+",(e=>C(e,((e,r,t)=>e[r]--)))),d("~",140),y("~",((e,r)=>!r&&(e=A(e),r=>~e(r)))),c("|",50),y("|",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)|r(t)))),c("&",70),y("&",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)&r(t)))),c("^",60),y("^",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)^r(t)))),c(">>",100),y(">>",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)>>r(t)))),c("<<",100),y("<<",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)<<r(t)))),c("==",80),y("==",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)==r(t)))),c("!=",80),y("!=",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)!=r(t)))),c(">",90),y(">",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)>r(t)))),c("<",90),y("<",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)<r(t)))),c(">=",90),y(">=",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)>=r(t)))),c("<=",90),y("<=",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)<=r(t)))),d("!",140),y("!",((e,r)=>!r&&(e=A(e),r=>!e(r)))),c("||",30),y("||",((e,r)=>(e=A(e),r=A(r),t=>e(t)||r(t)))),c("&&",40),y("&&",((e,r)=>(e=A(e),r=A(r),t=>e(t)&&r(t)))),c("=",20,!0),y("=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]=r(a))))));var E=e=>A(t(e));p("/*",200,((t,a)=>(l((t=>42!==t&&47!==r.charCodeAt(e+1))),s(2),t||i(a)||[]))),p("//",200,((e,r)=>(l((e=>e>=32)),e||i(r)||[]))),c("**",130,!0),y("**",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)**r(t)))),p("?",20,((e,r,t)=>e&&(r=i(19))&&l((e=>58===e))&&["?",e,r,i(19)])),y("?",((e,r,t)=>(e=A(e),r=A(r),t=A(t),a=>e(a)?r(a):t(a)))),p("true",200,(e=>e?err():[,!0])),p("false",200,(e=>e?err():[,!1])),h("[]",200),y("[]",((e,r)=>(e=(e=e?","===e[0]?e.slice(1):[e]:[]).map((e=>"..."===e[0]?(e=A(e[1]),r=>e(r)):(e=A(e),r=>[e(r)]))),r=>e.flatMap((e=>e(r)))))),h("{}",200),y("{}",((e,r)=>(e=(e=e?","!==e[0]?[e]:e.slice(1):[]).map((e=>A("string"==typeof e?[":",e,e]:e))),r=>Object.fromEntries(e.flatMap((e=>e(r))))))),c(":",19,!0),y(":",((e,r)=>(r=A(r),Array.isArray(e)?(e=A(e),t=>[[e(t),r(t)]]):t=>[[e,r(t)]]))),c("=>",20,!0),y("=>",((e,r)=>(e=(e="()"===e[0]?e[1]:e)?e=","===e[0]?e.slice(1):[e]:[],r=A("{}"===r[0]?r[1]:r),(t=null)=>(t=Object.create(t),(...a)=>(e.map(((e,r)=>t[e]=a[r])),r(t)))))),c(""),p("?.",170,(e=>e&&["?.",e])),y("?.",(e=>(e=A(e),r=>e(r)||(()=>{})))),p("?.",170,((e,r)=>e&&!(r=i(170))?.map&&["?.",e,r])),y("?.",((e,r)=>r&&(e=A(e),t=>e(t)?.[r]))),y("(",((e,r,t,a,l,s)=>"?."===e[0]&&(e[2]||Array.isArray(e[1]))&&(a=r?","===r[0]?(r=r.slice(1).map(A),e=>r.map((r=>r(e)))):(r=A(r),e=>[r(e)]):()=>[],!e[2]&&(e=e[1]),l="["===e[0]?A(e[2]):()=>e[2],t=A(e[1]),e=>t(e)?.[l(e)]?.(...a(e))))),d("...",140),y("...",(e=>(e=A(e),r=>Object.entries(e(r))))),c("in",90),y("in",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)in r(t)))),c("===",80),c("!==",9),y("===",((e,r)=>(e=A(e),r=A(r),t=>e(t)===r(t)))),y("!==",((e,r)=>(e=A(e),r=A(r),t=>e(t)!==r(t)))),c("??",30),y("??",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)??r(t)))),c("??=",20,!0),y("??=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]??=r(a)))))),c("||=",20,!0),y("||=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]||=r(a)))))),c("&&=",20,!0),y("&&=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]&&=r(a)))))),p("undefined",20,(e=>e?a():[,void 0])),p("NaN",20,(e=>e?a():[,NaN])),p("null",20,(e=>e?a():[,null]));export{u as access,c as binary,A as compile,E as default,h as group,f as nary,y as operator,t as parse,p as token,d as unary};
1
+ let e,r,t=t=>(e=0,r=t,t=i(),r[e]?a():t||""),a=(t="Bad syntax",a=r.slice(0,e).split("\n"),l=a.pop())=>{let s=r.slice(e-108,e).split("\n").pop(),i=r.slice(e,e+108).split("\n").shift();throw EvalError(`${t} at ${a.length}:${l.length} \`${e>=108?"…":""}${s}┃${i}\``,"font-weight: bold")},l=(t,a=e,l)=>{for(;l=t(r.charCodeAt(e));)e+=l;return r.slice(a,e)},s=(t=1,a=e)=>(e+=t,r.slice(a,e)),i=(r=0,s)=>{let i,p,c,d;for(;(i=n())&&(c=((d=o[i])&&d(p,r))??(!p&&l(t.id)));)p=c;return s&&(i==s?e++:a()),p},n=t=>{for(;(t=r.charCodeAt(e))<=32;)e++;return t};t.id=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e;let o=[],p=(l,s=32,i,n=l.charCodeAt(0),p=l.length,c=o[n],d=l.toUpperCase()!==l)=>o[n]=(n,o,f,h=e)=>(f?l==f:(p<2||r.substr(e,p)==l)&&(f=l))&&o<s&&!(d&&t.id(r.charCodeAt(e+p)))&&(e+=p,i(n)||(e=h,!c&&a()))||c?.(n,o,f),c=(e,r,t=!1)=>p(e,r,((a,l)=>a&&(l=i(r-(t?.5:0)))&&[e,a,l])),d=(e,r,t)=>p(e,r,(a=>t?a&&[e,a]:!a&&(a=i(r-.5))&&[e,a])),f=(e,r,t)=>{p(e,r,((t,a)=>(a=i(r),t?.[0]!==e&&(t=[e,t]),a?.[0]===e?t.push(...a.slice(1)):t.push(a),t)))},h=(e,r)=>p(e[0],r,(r=>!r&&[e,i(0,e.charCodeAt(1))])),u=(e,r)=>p(e[0],r,(r=>r&&[e[0],r,i(0,e.charCodeAt(1))]));const A=e=>Array.isArray(e)?e[0]?m[e[0]](...e.slice(1)):()=>e[1]:A.id(e);A.id=e=>r=>r?.[e];const m={},y=(e,r,t=m[e])=>m[e]=(...e)=>r(...e)||t&&t(...e),C=(e,r,t,l,s)=>"()"===e[0]?C(e[1],r,t):"string"==typeof e?t=>r(t,e,t):"."===e[0]?(l=A(e[1]),s=e[2],e=>r(l(e),s,e)):"["===e[0]?(l=A(e[1]),s=A(e[2]),e=>r(l(e),s(e),e)):t?(e=A(e),t=>r([e(t)],0,t)):()=>a("Bad left value"),g=(e,r)=>[,(e=+l((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?a():e];o[46]=e=>!e&&g();for(let e=48;e<=57;e++)o[e]=e=>e?a():g();const b={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},v=t=>(l,i,n="")=>{for(l&&a("Unexpected string"),s();(i=r.charCodeAt(e))-t;)92===i?(s(),i=s(),n+=b[i]||i):n+=s();return s()||a("Bad string"),[,n]};o[34]=v(34),o[39]=v(39),u("()",170),y("(",((e,r,t)=>(t=r?","===r[0]?(r=r.slice(1).map((e=>e?A(e):err())),e=>r.map((r=>r(e)))):(r=A(r),e=>[r(e)]):()=>[],C(e,((e,r,a)=>e[r](...t(a))),!0)))),u("[]",170),y("[",((e,r)=>r?(e=A(e),r=A(r),t=>e(t)[r(t)]):err())),c(".",170),y(".",((e,r)=>(e=A(e),r=r[0]?r:r[1],t=>e(t)[r]))),h("()",170),y("()",(e=>(!e&&a("Empty ()"),A(e))));const $=(...e)=>(e=e.map(A),r=>e.map((e=>e(r))).pop());f(",",10),y(",",$),f(";",5),y(";",$),c("=",20,!0),y("=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]=r(a)))))),c("*",120),y("*",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)*r(t)))),c("/",120),y("/",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)/r(t)))),c("%",120),y("%",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)%r(t)))),c("*=",20,!0),y("*=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]*=r(a)))))),c("/=",20,!0),y("/=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]/=r(a)))))),c("%=",20,!0),y("%=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]%=r(a)))))),c("+",110),y("+",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)+r(t)))),c("-",110),y("-",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)-r(t)))),d("+",140),y("+",((e,r)=>!r&&(e=A(e),r=>+e(r)))),d("-",140),y("-",((e,r)=>!r&&(e=A(e),r=>-e(r)))),c("+=",20,!0),y("+=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]+=r(a)))))),c("-=",20,!0),y("-=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]-=r(a)))))),p("++",150,(e=>e?["++-",e]:["++",i(149)])),y("++",(e=>C(e,((e,r,t)=>++e[r])))),y("++-",(e=>C(e,((e,r,t)=>e[r]++)))),p("--",150,(e=>e?["--+",e]:["--",i(149)])),y("--",(e=>C(e,((e,r,t)=>--e[r])))),y("--+",(e=>C(e,((e,r,t)=>e[r]--)))),d("~",140),y("~",((e,r)=>!r&&(e=A(e),r=>~e(r)))),c("|",50),y("|",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)|r(t)))),c("&",70),y("&",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)&r(t)))),c("^",60),y("^",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)^r(t)))),c("==",80),y("==",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)==r(t)))),c("!=",80),y("!=",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)!=r(t)))),c(">",90),y(">",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)>r(t)))),c("<",90),y("<",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)<r(t)))),c(">=",90),y(">=",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)>=r(t)))),c("<=",90),y("<=",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)<=r(t)))),c(">>",100),y(">>",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)>>r(t)))),c("<<",100),y("<<",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)<<r(t)))),d("!",140),y("!",((e,r)=>!r&&(e=A(e),r=>!e(r)))),c("||",30),y("||",((e,r)=>(e=A(e),r=A(r),t=>e(t)||r(t)))),c("&&",40),y("&&",((e,r)=>(e=A(e),r=A(r),t=>e(t)&&r(t))));var E=e=>A(t(e));p("/*",200,((t,a)=>(l((t=>42!==t&&47!==r.charCodeAt(e+1))),s(2),t||i(a)||[]))),p("//",200,((e,r)=>(l((e=>e>=32)),e||i(r)||[]))),c("**",130,!0),y("**",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)**r(t)))),p("?",20,((e,r,t)=>e&&(r=i(19))&&l((e=>58===e))&&["?",e,r,i(19)])),y("?",((e,r,t)=>(e=A(e),r=A(r),t=A(t),a=>e(a)?r(a):t(a)))),p("true",200,(e=>e?err():[,!0])),p("false",200,(e=>e?err():[,!1])),h("[]",200),y("[]",((e,r)=>(e=(e=e?","===e[0]?e.slice(1):[e]:[]).map((e=>"..."===e[0]?(e=A(e[1]),r=>e(r)):(e=A(e),r=>[e(r)]))),r=>e.flatMap((e=>e(r)))))),h("{}",200),y("{}",((e,r)=>(e=(e=e?","!==e[0]?[e]:e.slice(1):[]).map((e=>A("string"==typeof e?[":",e,e]:e))),r=>Object.fromEntries(e.flatMap((e=>e(r))))))),c(":",19,!0),y(":",((e,r)=>(r=A(r),Array.isArray(e)?(e=A(e),t=>[[e(t),r(t)]]):t=>[[e,r(t)]]))),c("=>",20,!0),y("=>",((e,r)=>(e=(e="()"===e[0]?e[1]:e)?e=","===e[0]?e.slice(1):[e]:[],r=A("{}"===r[0]?r[1]:r),(t=null)=>(t=Object.create(t),(...a)=>(e.map(((e,r)=>t[e]=a[r])),r(t)))))),c(""),p("?.",170,(e=>e&&["?.",e])),y("?.",(e=>(e=A(e),r=>e(r)||(()=>{})))),p("?.",170,((e,r)=>e&&!(r=i(170))?.map&&["?.",e,r])),y("?.",((e,r)=>r&&(e=A(e),t=>e(t)?.[r]))),y("(",((e,r,t,a,l,s)=>"?."===e[0]&&(e[2]||Array.isArray(e[1]))&&(a=r?","===r[0]?(r=r.slice(1).map(A),e=>r.map((r=>r(e)))):(r=A(r),e=>[r(e)]):()=>[],!e[2]&&(e=e[1]),l="["===e[0]?A(e[2]):()=>e[2],t=A(e[1]),e=>t(e)?.[l(e)]?.(...a(e))))),d("...",140),y("...",(e=>(e=A(e),r=>Object.entries(e(r))))),c("in",90),y("in",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)in r(t)))),c("===",80),c("!==",9),y("===",((e,r)=>(e=A(e),r=A(r),t=>e(t)===r(t)))),y("!==",((e,r)=>(e=A(e),r=A(r),t=>e(t)!==r(t)))),c("??",30),y("??",((e,r)=>r&&(e=A(e),r=A(r),t=>e(t)??r(t)))),c("??=",20,!0),y("??=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]??=r(a)))))),c("||=",20,!0),y("||=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]||=r(a)))))),c("&&=",20,!0),y("&&=",((e,r)=>(r=A(r),C(e,((e,t,a)=>e[t]&&=r(a)))))),p("undefined",20,(e=>e?a():[,void 0])),p("NaN",20,(e=>e?a():[,NaN])),p("null",20,(e=>e?a():[,null]));export{u as access,c as binary,A as compile,E as default,h as group,f as nary,y as operator,t as parse,p as token,d as unary};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "subscript",
3
- "version": "8.4.1",
3
+ "version": "8.5.0",
4
4
  "description": "Fast and tiny expression evaluator with minimal syntax.",
5
5
  "main": "subscript.js",
6
6
  "module": "subscript.js",
package/src/parse.js CHANGED
@@ -70,13 +70,17 @@ export let idx, cur,
70
70
  l = op.length,
71
71
  prev = lookup[c],
72
72
  word = op.toUpperCase() !== op // make sure word boundary comes after word operator
73
- ) => lookup[c] = (a, curPrec, from = idx) =>
74
- (curPrec < prec &&
75
- (l < 2 || cur.substr(idx, l) == op) &&
76
- (!word || !parse.id(cur.charCodeAt(idx + l))) &&
77
- (idx += l, (map(a) || (idx = from, !prev && err()))) // throw if operator didn't detect usage pattern: (a;^b) etc
73
+ ) => lookup[c] = (a, curPrec, curOp, from = idx) =>
74
+ (
75
+ (curOp ?
76
+ op == curOp :
77
+ ((l < 2 || cur.substr(idx, l) == op) && (curOp = op)) // save matched op to avoid mismatches like `|` as part of `||`
78
+ ) &&
79
+ curPrec < prec && // matches precedence AFTER operator matched
80
+ !(word && parse.id(cur.charCodeAt(idx + l))) && // finished word, not part of bigger word
81
+ (idx += l, map(a) || (idx = from, !prev && err())) // throw if operator didn't detect usage pattern: (a;^b) etc
78
82
  ) ||
79
- prev?.(a, curPrec),
83
+ prev?.(a, curPrec, curOp),
80
84
 
81
85
  // right assoc is indicated by negative precedence (meaning go from right to left)
82
86
  binary = (op, prec, right = false) => token(op, prec, (a, b) => a && (b = expr(prec - (right ? .5 : 0))) && [op, a, b]),
package/subscript.js CHANGED
@@ -6,13 +6,14 @@ import './feature/string.js'
6
6
  import './feature/call.js'
7
7
  import './feature/access.js'
8
8
  import './feature/group.js'
9
+ import './feature/assign.js'
9
10
  import './feature/mult.js'
10
11
  import './feature/add.js'
11
12
  import './feature/increment.js'
12
13
  import './feature/bitwise.js'
13
14
  import './feature/compare.js'
15
+ import './feature/shift.js'
14
16
  import './feature/logic.js'
15
- import './feature/assign.js'
16
17
  import compile from './src/compile.js'
17
18
  import parse from './src/parse.js'
18
19
 
package/subscript.min.js CHANGED
@@ -1 +1 @@
1
- let t,r,e=e=>(t=0,r=e,e=l(),r[t]?s():e||""),s=(e="Bad syntax",s=r.slice(0,t).split("\n"),o=s.pop())=>{let a=r.slice(t-108,t).split("\n").pop(),l=r.slice(t,t+108).split("\n").shift();throw EvalError(`${e} at ${s.length}:${o.length} \`${t>=108?"…":""}${a}┃${l}\``,"font-weight: bold")},o=(e,s=t,o)=>{for(;o=e(r.charCodeAt(t));)t+=o;return r.slice(s,t)},a=(e=1,s=t)=>(t+=e,r.slice(s,t)),l=(r=0,a)=>{let l,c,p,d;for(;(l=n())&&(p=((d=i[l])&&d(c,r))??(!c&&o(e.id)));)c=p;return a&&(l==a?t++:s()),c},n=e=>{for(;(e=r.charCodeAt(t))<=32;)t++;return e};e.id=t=>t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122||36==t||95==t||t>=192&&215!=t&&247!=t;let i=[],c=(o,a=32,l,n=o.charCodeAt(0),c=o.length,p=i[n],d=o.toUpperCase()!==o)=>i[n]=(n,i,h=t)=>i<a&&(c<2||r.substr(t,c)==o)&&(!d||!e.id(r.charCodeAt(t+c)))&&(t+=c,l(n)||(t=h,!p&&s()))||p?.(n,i),p=(t,r,e=!1)=>c(t,r,((s,o)=>s&&(o=l(r-(e?.5:0)))&&[t,s,o])),d=(t,r,e)=>c(t,r,(s=>e?s&&[t,s]:!s&&(s=l(r-.5))&&[t,s])),h=(t,r,e)=>{c(t,r,((e,s)=>(s=l(r),e?.[0]!==t&&(e=[t,e]),s?.[0]===t?e.push(...s.slice(1)):e.push(s),e)))},f=(t,r)=>c(t[0],r,(r=>!r&&[t,l(0,t.charCodeAt(1))])),u=(t,r)=>c(t[0],r,(r=>r&&[t[0],r,l(0,t.charCodeAt(1))]));const A=(t,r)=>[,(t=+o((t=>46===t||t>=48&&t<=57||(69===t||101===t?2:0))))!=t?s():t];i[46]=t=>!t&&A();for(let t=48;t<=57;t++)i[t]=t=>t?s():A();const C={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},g=e=>(o,l,n="")=>{for(o&&s("Unexpected string"),a();(l=r.charCodeAt(t))-e;)92===l?(a(),l=a(),n+=C[l]||l):n+=a();return a()||s("Bad string"),[,n]};i[34]=g(34),i[39]=g(39);const $=t=>Array.isArray(t)?t[0]?m[t[0]](...t.slice(1)):()=>t[1]:$.id(t);$.id=t=>r=>r?.[t];const m={},v=(t,r,e=m[t])=>m[t]=(...t)=>r(...t)||e&&e(...t),y=(t,r,e,o,a)=>"()"===t[0]?y(t[1],r,e):"string"==typeof t?e=>r(e,t,e):"."===t[0]?(o=$(t[1]),a=t[2],t=>r(o(t),a,t)):"["===t[0]?(o=$(t[1]),a=$(t[2]),t=>r(o(t),a(t),t)):e?(t=$(t),e=>r([t(e)],0,e)):()=>s("Bad left value");u("()",170),v("(",((t,r,e)=>(e=r?","===r[0]?(r=r.slice(1).map((t=>t?$(t):err())),t=>r.map((r=>r(t)))):(r=$(r),t=>[r(t)]):()=>[],y(t,((t,r,s)=>t[r](...e(s))),!0)))),u("[]",170),v("[",((t,r)=>r?(t=$(t),r=$(r),e=>t(e)[r(e)]):err())),p(".",170),v(".",((t,r)=>(t=$(t),r=r[0]?r:r[1],e=>t(e)[r]))),f("()",170),v("()",(t=>(!t&&s("Empty ()"),$(t))));const b=(...t)=>(t=t.map($),r=>t.map((t=>t(r))).pop());h(",",10),v(",",b),h(";",5),v(";",b),p("*",120),v("*",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)*r(e)))),p("/",120),v("/",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)/r(e)))),p("%",120),v("%",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)%r(e)))),p("*=",20,!0),v("*=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]*=r(s)))))),p("/=",20,!0),v("/=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]/=r(s)))))),p("%=",20,!0),v("%=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]%=r(s)))))),p("+",110),v("+",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)+r(e)))),p("-",110),v("-",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)-r(e)))),p("+=",20,!0),v("+=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]+=r(s)))))),p("-=",20,!0),v("-=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]-=r(s)))))),d("+",140),v("+",((t,r)=>!r&&(t=$(t),r=>+t(r)))),d("-",140),v("-",((t,r)=>!r&&(t=$(t),r=>-t(r)))),c("++",150,(t=>t?["++-",t]:["++",l(149)])),v("++",(t=>y(t,((t,r,e)=>++t[r])))),v("++-",(t=>y(t,((t,r,e)=>t[r]++)))),c("--",150,(t=>t?["--+",t]:["--",l(149)])),v("--",(t=>y(t,((t,r,e)=>--t[r])))),v("--+",(t=>y(t,((t,r,e)=>t[r]--)))),d("~",140),v("~",((t,r)=>!r&&(t=$(t),r=>~t(r)))),p("|",50),v("|",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)|r(e)))),p("&",70),v("&",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)&r(e)))),p("^",60),v("^",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)^r(e)))),p(">>",100),v(">>",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)>>r(e)))),p("<<",100),v("<<",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)<<r(e)))),p("==",80),v("==",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)==r(e)))),p("!=",80),v("!=",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)!=r(e)))),p(">",90),v(">",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)>r(e)))),p("<",90),v("<",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)<r(e)))),p(">=",90),v(">=",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)>=r(e)))),p("<=",90),v("<=",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)<=r(e)))),d("!",140),v("!",((t,r)=>!r&&(t=$(t),r=>!t(r)))),p("||",30),v("||",((t,r)=>(t=$(t),r=$(r),e=>t(e)||r(e)))),p("&&",40),v("&&",((t,r)=>(t=$(t),r=$(r),e=>t(e)&&r(e)))),p("=",20,!0),v("=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]=r(s))))));var x=t=>$(e(t));export{u as access,p as binary,$ as compile,x as default,f as group,h as nary,v as operator,e as parse,c as token,d as unary};
1
+ let t,r,e=e=>(t=0,r=e,e=l(),r[t]?s():e||""),s=(e="Bad syntax",s=r.slice(0,t).split("\n"),o=s.pop())=>{let a=r.slice(t-108,t).split("\n").pop(),l=r.slice(t,t+108).split("\n").shift();throw EvalError(`${e} at ${s.length}:${o.length} \`${t>=108?"…":""}${a}┃${l}\``,"font-weight: bold")},o=(e,s=t,o)=>{for(;o=e(r.charCodeAt(t));)t+=o;return r.slice(s,t)},a=(e=1,s=t)=>(t+=e,r.slice(s,t)),l=(r=0,a)=>{let l,c,p,d;for(;(l=n())&&(p=((d=i[l])&&d(c,r))??(!c&&o(e.id)));)c=p;return a&&(l==a?t++:s()),c},n=e=>{for(;(e=r.charCodeAt(t))<=32;)t++;return e};e.id=t=>t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122||36==t||95==t||t>=192&&215!=t&&247!=t;let i=[],c=(o,a=32,l,n=o.charCodeAt(0),c=o.length,p=i[n],d=o.toUpperCase()!==o)=>i[n]=(n,i,h,f=t)=>(h?o==h:(c<2||r.substr(t,c)==o)&&(h=o))&&i<a&&!(d&&e.id(r.charCodeAt(t+c)))&&(t+=c,l(n)||(t=f,!p&&s()))||p?.(n,i,h),p=(t,r,e=!1)=>c(t,r,((s,o)=>s&&(o=l(r-(e?.5:0)))&&[t,s,o])),d=(t,r,e)=>c(t,r,(s=>e?s&&[t,s]:!s&&(s=l(r-.5))&&[t,s])),h=(t,r,e)=>{c(t,r,((e,s)=>(s=l(r),e?.[0]!==t&&(e=[t,e]),s?.[0]===t?e.push(...s.slice(1)):e.push(s),e)))},f=(t,r)=>c(t[0],r,(r=>!r&&[t,l(0,t.charCodeAt(1))])),u=(t,r)=>c(t[0],r,(r=>r&&[t[0],r,l(0,t.charCodeAt(1))]));const A=(t,r)=>[,(t=+o((t=>46===t||t>=48&&t<=57||(69===t||101===t?2:0))))!=t?s():t];i[46]=t=>!t&&A();for(let t=48;t<=57;t++)i[t]=t=>t?s():A();const C={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},g=e=>(o,l,n="")=>{for(o&&s("Unexpected string"),a();(l=r.charCodeAt(t))-e;)92===l?(a(),l=a(),n+=C[l]||l):n+=a();return a()||s("Bad string"),[,n]};i[34]=g(34),i[39]=g(39);const $=t=>Array.isArray(t)?t[0]?m[t[0]](...t.slice(1)):()=>t[1]:$.id(t);$.id=t=>r=>r?.[t];const m={},v=(t,r,e=m[t])=>m[t]=(...t)=>r(...t)||e&&e(...t),y=(t,r,e,o,a)=>"()"===t[0]?y(t[1],r,e):"string"==typeof t?e=>r(e,t,e):"."===t[0]?(o=$(t[1]),a=t[2],t=>r(o(t),a,t)):"["===t[0]?(o=$(t[1]),a=$(t[2]),t=>r(o(t),a(t),t)):e?(t=$(t),e=>r([t(e)],0,e)):()=>s("Bad left value");u("()",170),v("(",((t,r,e)=>(e=r?","===r[0]?(r=r.slice(1).map((t=>t?$(t):err())),t=>r.map((r=>r(t)))):(r=$(r),t=>[r(t)]):()=>[],y(t,((t,r,s)=>t[r](...e(s))),!0)))),u("[]",170),v("[",((t,r)=>r?(t=$(t),r=$(r),e=>t(e)[r(e)]):err())),p(".",170),v(".",((t,r)=>(t=$(t),r=r[0]?r:r[1],e=>t(e)[r]))),f("()",170),v("()",(t=>(!t&&s("Empty ()"),$(t))));const b=(...t)=>(t=t.map($),r=>t.map((t=>t(r))).pop());h(",",10),v(",",b),h(";",5),v(";",b),p("=",20,!0),v("=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]=r(s)))))),p("*",120),v("*",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)*r(e)))),p("/",120),v("/",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)/r(e)))),p("%",120),v("%",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)%r(e)))),p("*=",20,!0),v("*=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]*=r(s)))))),p("/=",20,!0),v("/=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]/=r(s)))))),p("%=",20,!0),v("%=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]%=r(s)))))),p("+",110),v("+",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)+r(e)))),p("-",110),v("-",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)-r(e)))),d("+",140),v("+",((t,r)=>!r&&(t=$(t),r=>+t(r)))),d("-",140),v("-",((t,r)=>!r&&(t=$(t),r=>-t(r)))),p("+=",20,!0),v("+=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]+=r(s)))))),p("-=",20,!0),v("-=",((t,r)=>(r=$(r),y(t,((t,e,s)=>t[e]-=r(s)))))),c("++",150,(t=>t?["++-",t]:["++",l(149)])),v("++",(t=>y(t,((t,r,e)=>++t[r])))),v("++-",(t=>y(t,((t,r,e)=>t[r]++)))),c("--",150,(t=>t?["--+",t]:["--",l(149)])),v("--",(t=>y(t,((t,r,e)=>--t[r])))),v("--+",(t=>y(t,((t,r,e)=>t[r]--)))),d("~",140),v("~",((t,r)=>!r&&(t=$(t),r=>~t(r)))),p("|",50),v("|",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)|r(e)))),p("&",70),v("&",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)&r(e)))),p("^",60),v("^",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)^r(e)))),p("==",80),v("==",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)==r(e)))),p("!=",80),v("!=",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)!=r(e)))),p(">",90),v(">",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)>r(e)))),p("<",90),v("<",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)<r(e)))),p(">=",90),v(">=",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)>=r(e)))),p("<=",90),v("<=",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)<=r(e)))),p(">>",100),v(">>",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)>>r(e)))),p("<<",100),v("<<",((t,r)=>r&&(t=$(t),r=$(r),e=>t(e)<<r(e)))),d("!",140),v("!",((t,r)=>!r&&(t=$(t),r=>!t(r)))),p("||",30),v("||",((t,r)=>(t=$(t),r=$(r),e=>t(e)||r(e)))),p("&&",40),v("&&",((t,r)=>(t=$(t),r=$(r),e=>t(e)&&r(e))));var x=t=>$(e(t));export{u as access,p as binary,$ as compile,x as default,f as group,h as nary,v as operator,e as parse,c as token,d as unary};