subscript 7.5.5 → 7.6.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 +2 -4
- package/justin.js +5 -5
- package/justin.min.js +1 -1
- package/package.json +1 -1
- package/parse.js +4 -0
package/README.md
CHANGED
|
@@ -67,19 +67,17 @@ _Justin_ is minimal JS subset − JSON with JS expressions (see original [thread
|
|
|
67
67
|
|
|
68
68
|
It extends _subscript_ with:
|
|
69
69
|
|
|
70
|
-
+ `===`, `!==` operators
|
|
71
70
|
+ `**` exponentiation operator (right-assoc)
|
|
72
71
|
+ `~` bit inversion operator
|
|
73
72
|
+ `'` strings
|
|
74
73
|
+ `?:` ternary operator
|
|
75
74
|
+ `?.` optional chain operator
|
|
76
|
-
+ `??` nullish coalesce operator
|
|
77
75
|
+ `[...]` Array literal
|
|
78
76
|
+ `{...}` Object literal
|
|
79
77
|
+ `in` binary
|
|
80
78
|
+ `;` expression separator
|
|
81
79
|
+ `//`, `/* */` comments
|
|
82
|
-
+ `true`, `false`, `null
|
|
80
|
+
+ `true`, `false`, `null` literals
|
|
83
81
|
<!-- + `...x` unary operator -->
|
|
84
82
|
<!-- + strings interpolation -->
|
|
85
83
|
|
|
@@ -128,7 +126,7 @@ AST has simplified lispy tree structure (inspired by [frisk](https://ghub.io/fri
|
|
|
128
126
|
|
|
129
127
|
* not limited to particular language (JS), can be compiled to different targets;
|
|
130
128
|
* reflects execution sequence, rather than code layout;
|
|
131
|
-
* has minimal
|
|
129
|
+
* has minimal overhead, directly maps to operators;
|
|
132
130
|
* simplifies manual evaluation and debugging;
|
|
133
131
|
* has conventional form and one-line docs:
|
|
134
132
|
|
package/justin.js
CHANGED
|
@@ -20,8 +20,8 @@ let escape = { n: '\n', r: '\r', t: '\t', b: '\b', f: '\f', v: '\v' },
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// operators
|
|
23
|
-
set('===', PREC_EQ, (a, b) => a === b)
|
|
24
|
-
set('!==', PREC_EQ, (a, b) => a !== b)
|
|
23
|
+
// set('===', PREC_EQ, (a, b) => a === b)
|
|
24
|
+
// set('!==', PREC_EQ, (a, b) => a !== b)
|
|
25
25
|
set('~', PREC_UNARY, (a) => ~a)
|
|
26
26
|
|
|
27
27
|
// ?:
|
|
@@ -68,10 +68,10 @@ token('//', 20, (a, prec) => (skip(c => c >= 32), a || expr(prec) || ['']))
|
|
|
68
68
|
token('null', 20, a => a ? err() : ['', null])
|
|
69
69
|
token('true', 20, a => a ? err() : ['', true])
|
|
70
70
|
token('false', 20, a => a ? err() : ['', false])
|
|
71
|
-
token('undefined', 20, a => a ? err() : ['', undefined])
|
|
71
|
+
// token('undefined', 20, a => a ? err() : ['', undefined])
|
|
72
|
+
// token('NaN', 20, a => a ? err() : ['', NaN])
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
set(';', -20, (...args) => { for (let i = args.length; i--;) if (args[i] != null) return args[i] })
|
|
74
|
+
set(';', -20, (...args) => args[args.length - 1])
|
|
75
75
|
|
|
76
76
|
// right order
|
|
77
77
|
// '**', (a,prec,b=expr(PREC_EXP-1)) => ctx=>a(ctx)**b(ctx), PREC_EXP,
|
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())=>{let s=t.slice(e-108,e).split("\n").pop(),i=t.slice(e+1,e+108).split("\n").shift();throw EvalError(`${r} at ${n.length}:${a.length} \`${s+l+i}\``,"font-weight: bold")},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,n,a,s,i,
|
|
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())=>{let s=t.slice(e-108,e).split("\n").pop(),i=t.slice(e+1,e+108).split("\n").shift();throw EvalError(`${r} at ${n.length}:${a.length} \`${s+l+i}\``,"font-weight: bold")},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,n,a,s,i,p)=>{for(;(a=r.space())&&(i=((p=o[a])&&p(s,t))??(!s&&r.id()));)s=i;return n&&(a==n?e++:l()),s},s=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e,i=r.space=r=>{for(;(r=t.charCodeAt(e))<=32;)e++;return r},p=r.id=e=>n(s),o=[],h=(r,l=32,n,a=r.charCodeAt(0),i=r.length,p=o[a],h=r.toUpperCase()!==r)=>o[a]=(a,o,c=e)=>o<l&&(i<2||t.substr(e,i)==r)&&(!h||!s(t.charCodeAt(e+i)))&&(e+=i,n(a,o))||(e=c,p?.(a,o)),c=(e,t,r=0)=>h(e,t,((l,n)=>l&&(n=a(t-r/2))&&[e,l,n])),f=(e,t,r)=>h(e,t,(l=>r?l&&[e,l]:!l&&(l=a(t-.5))&&[e,l])),g=(e,t,r)=>{h(e,t,((l,n)=>(l||r)&&((n=a(t))||r)&&((!l||l[0]!==e)&&(l=[e,l]),(n||r)&&l.push(n),l)))};const d=e=>Array.isArray(e)?u[e[0]](...e.slice(1)):t=>t?.[e],u={},m=(e,t,r=u[e])=>u[e]=(...e)=>t(...e)||r&&r(...e),A=e=>(e=r(e),t=>(e.call?e:e=d(e))(t)),b=(e,t,r)=>r.length?r.length>1?(c(e,Math.abs(t),t<0),m(e,((e,t)=>t&&(e=d(e),t=d(t),e.length||t.length?l=>r(e(l),t(l)):(e=r(e(),t()),()=>e))))):(f(e,t),m(e,((e,t)=>!t&&((e=d(e)).length?t=>r(e(t)):(e=r(e()),()=>e))))):(g(e,Math.abs(t),t<0),m(e,((...e)=>(e=e.map(d),t=>r(...e.map((e=>e(t)))))))),y=e=>e?l():["",(e=+n((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?l():e],C=(e,t,r,l)=>(h(e,t,(r=>r?["++"===e?"-":"+",[e,r],["",1]]:[e,a(t-1)])),m(e,l=(e,t)=>"("===e[0]?l(e[1]):"."===e[0]?(t=e[2],e=d(e[1]),l=>r(e(l),t)):"["===e[0]?([,e,t]=e,e=d(e),t=d(t),l=>r(e(l),t(l))):t=>r(t,e)));m("",(e=>()=>e)),o[34]=e=>e?l():["",(n()+n((e=>e-34?1:0))+(n()||l("Bad string"))).slice(1,-1)],o[46]=e=>!e&&y();for(let e=0;e<=9;e++)o[48+e]=y;b(",",1,((...e)=>e[e.length-1])),b("||",4,((...e)=>{let t,r=0;for(;!t&&r<e.length;)t=e[r++];return t})),b("&&",5,((...e)=>{let t=0,r=!0;for(;r&&t<e.length;)r=e[t++];return r})),c("=",10,!0),m("=",((e,t)=>{let r,n,a=d(t),s="string"==typeof e?(t,r)=>t[e]=r:"."===e[0]?(r=d(e[1]),n=e[2],(e,t)=>r(e)[n]=t):"["===e[0]?(r=d(e[1]),n=d(e[2]),(e,t)=>r(e)[n(e)]=t):l("Bad LHS");return e=>s(e,a(e))})),b("+",12,((e,t)=>e+t)),b("-",12,((e,t)=>e-t)),b("*",13,((e,t)=>e*t)),b("/",13,((e,t)=>e/t)),b("%",13,((e,t)=>e%t)),b("|",6,((e,t)=>e|t)),b("&",8,((e,t)=>e&t)),b("^",7,((e,t)=>e^t)),b("==",9,((e,t)=>e==t)),b("!=",9,((e,t)=>e!=t)),b(">",10,((e,t)=>e>t)),b(">=",10,((e,t)=>e>=t)),b("<",10,((e,t)=>e<t)),b("<=",10,((e,t)=>e<=t)),b(">>",11,((e,t)=>e>>t)),b(">>>",11,((e,t)=>e>>>t)),b("<<",11,((e,t)=>e<<t)),b("+",15,(e=>+e)),b("-",15,(e=>-e)),b("!",15,(e=>!e)),C("++",15,((e,t)=>++e[t])),C("--",15,((e,t)=>--e[t])),h("[",18,(e=>e&&["[",e,a(0,93)||l()])),m("[",((e,t)=>t&&(e=d(e),t=d(t),r=>e(r)[t(r)]))),h(".",18,((e,t)=>e&&(t=a(18))&&[".",e,t])),m(".",((e,t)=>(e=d(e),t=t[0]?t:t[1],r=>e(r)[t]))),h("(",18,(e=>!e&&["(",a(0,41)||l()])),h("(",18,((e,t)=>e&&((t=a(0,41))?["(",e,t]:["(",e,""]))),m("(",((e,t,r,l,n)=>null==t?d(e):(n=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(d),e=>t.map((t=>t(e)))):(t=d(t),e=>[t(e)]),"."===e[0]?(r=e[2],e=d(e[1]),t=>e(t)[r](...n(t))):"["===e[0]?(r=d(e[2]),e=d(e[1]),t=>e(t)[r(t)](...n(t))):(e=d(e),t=>e(t)(...n(t))))));let B={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},E=r=>(a,s,i="")=>{for(a&&l("Unexpected string"),n();(s=t.charCodeAt(e))-r;)92===s?(n(),s=n(),i+=B[s]||s):i+=n();return n()||l("Bad string"),["",i]};b("~",15,(e=>~e)),h("?",3,((e,t,r)=>e&&(t=a(2,58))&&["?",e,t,a(3)])),m("?",((e,t,r)=>(e=d(e),t=d(t),r=d(r),l=>e(l)?t(l):r(l)))),b("??",6,((e,t)=>e??t)),h("?.",18,(e=>e&&["?.",e])),m("?.",(e=>(e=d(e),t=>e(t)||(()=>{})))),h("?.",18,((e,t)=>e&&!(t=a(18))?.map&&["?.",e,t])),m("?.",((e,t)=>t&&(e=d(e),r=>e(r)?.[t]))),m("(",((e,t,r,l,n,a)=>null!=t&&"?."===e[0]&&(e[2]||Array.isArray(e[1]))&&(l=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(d),e=>t.map((t=>t(e)))):(t=d(t),e=>[t(e)]),!e[2]&&(e=e[1]),n="["===e[0]?d(e[2]):t=>e[2],r=d(e[1]),e=>r(e)?.[n(e)]?.(...l(e))))),b("in",10,((e,t)=>e in t)),o[34]=E(34),o[39]=E(39),h("/*",20,((r,l)=>(n((r=>42!==r&&47!==t.charCodeAt(e+1))),n(2),r||a(l)||[""]))),h("//",20,((e,t)=>(n((e=>e>=32)),e||a(t)||[""]))),h("null",20,(e=>e?l():["",null])),h("true",20,(e=>e?l():["",!0])),h("false",20,(e=>e?l():["",!1])),b(";",-20,((...e)=>e[e.length-1])),b("**",-14,((e,t)=>e**t)),h("[",20,(e=>!e&&["[",a(0,93)||""])),m("[",((e,t)=>!t&&(e?","===e[0]?(e=e.slice(1).map(d),t=>e.map((e=>e(t)))):(e=d(e),t=>[e(t)]):()=>[]))),h("{",20,(e=>!e&&["{",a(0,125)||""])),m("{",((e,t)=>e?","===e[0]?(e=e.slice(1).map(d),t=>Object.fromEntries(e.map((e=>e(t))))):":"===e[0]?(e=d(e),t=>Object.fromEntries([e(t)])):(t=d(e),r=>({[e]:t(r)})):e=>({}))),h(":",1.1,((e,t)=>[":",e,a(1.1)||l()])),m(":",((e,t)=>(t=d(t),e=Array.isArray(e)?d(e):(e=>e).bind(0,e),r=>[e(r),t(r)])));export{c as binary,d as compile,t as cur,A as default,l as err,a as expr,p as id,e as idx,s as isId,o as lookup,g as nary,m as operator,u as operators,r as parse,b as set,n as skip,i as space,h as token,f as unary};
|
package/package.json
CHANGED
package/parse.js
CHANGED
|
@@ -74,7 +74,11 @@ export let idx, cur,
|
|
|
74
74
|
|
|
75
75
|
// right assoc is indicated by negative precedence (meaning go from right to left)
|
|
76
76
|
binary = (op, prec, right = 0) => token(op, prec, (a, b) => a && (b = expr(prec - right / 2)) && [op, a, b]),
|
|
77
|
+
|
|
78
|
+
// post indicates postfix rather than prefix operator
|
|
77
79
|
unary = (op, prec, post) => token(op, prec, a => post ? (a && [op, a]) : (!a && (a = expr(prec - .5)) && [op, a])),
|
|
80
|
+
|
|
81
|
+
// skips means ,,, ;;; are allowed
|
|
78
82
|
nary = (op, prec, skips) => {
|
|
79
83
|
token(op, prec, (a, b) => (
|
|
80
84
|
(a || skips) && // if lhs exists or we're ok to skip
|