subscript 5.2.2 → 5.2.3
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 +1 -1
- package/justin.js +16 -18
- package/justin.min.js +1 -1
- package/package.json +1 -1
- package/parse.js +7 -3
- package/subscript.js +5 -5
- package/subscript.min.js +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# <img alt="subscript" src="/subscript2.svg" height=42/> <!--sub͘<em>script</em>--> <!--<sub>SUB͘<em>SCRIPT</em></sub>-->
|
|
2
2
|
<a href="https://github.com/spectjs/subscript/actions/workflows/node.js.yml"><img src="https://github.com/spectjs/subscript/actions/workflows/node.js.yml/badge.svg"/></a>
|
|
3
|
-
<a href="http://npmjs.org/subscript"><img src="https://img.shields.io/npm/v/subscript?color=
|
|
3
|
+
<a href="http://npmjs.org/subscript"><img src="https://img.shields.io/npm/v/subscript?color=indianred"/></a>
|
|
4
4
|
<a href="http://microjs.com/#subscript"><img src="https://img.shields.io/badge/microjs-subscript-blue?color=darkslateblue"/></a>
|
|
5
5
|
|
|
6
6
|
_Subscript_ is micro-language with common syntax subset of C++, JS, Java, Python, Go, Rust, Swift, Objective C, Kotlin etc.<br/>
|
package/justin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// justin lang https://github.com/endojs/Jessie/issues/66
|
|
2
2
|
import {evaluate} from './evaluate.js'
|
|
3
|
-
import {parse, code, char, skip, expr, err} from './parse.js'
|
|
3
|
+
import {parse, code, char, skip, expr, err, val} from './parse.js'
|
|
4
4
|
|
|
5
5
|
const PERIOD=46, OPAREN=40, CPAREN=41, CBRACK=93, SPACE=32,
|
|
6
6
|
|
|
@@ -10,7 +10,6 @@ PREC_EXP=14, PREC_TOKEN=20
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
// tokens
|
|
13
|
-
const v = v => ({valueOf:()=>v})
|
|
14
13
|
parse.token.push(
|
|
15
14
|
// 1.2e+3, .5 - fast & small version, but consumes corrupted nums as well
|
|
16
15
|
(number) => (
|
|
@@ -31,14 +30,6 @@ parse.token.push(
|
|
|
31
30
|
return skip(), qc + str + qc
|
|
32
31
|
},
|
|
33
32
|
|
|
34
|
-
// literal
|
|
35
|
-
c =>
|
|
36
|
-
c === 116 && char(4) === 'true' && skip(4) ? v(true) :
|
|
37
|
-
c === 102 && char(5) === 'false' && skip(5) ? v(false) :
|
|
38
|
-
c === 110 && char(4) === 'null' && skip(4) ? v(null) :
|
|
39
|
-
c === 117 && char(9) === 'undefined' && skip(9) ? v(undefined) :
|
|
40
|
-
null,
|
|
41
|
-
|
|
42
33
|
// id
|
|
43
34
|
c => skip(c =>
|
|
44
35
|
(c >= 48 && c <= 57) || // 0..9
|
|
@@ -54,13 +45,14 @@ const escape = {n:'\n', r:'\r', t:'\t', b:'\b', f:'\f', v:'\v'}
|
|
|
54
45
|
|
|
55
46
|
// /**/, //
|
|
56
47
|
parse.space = cc => {
|
|
57
|
-
while (cc = code(), cc <= 32) {
|
|
58
|
-
skip()
|
|
59
|
-
if (
|
|
48
|
+
while (cc = code(), cc <= 32 || cc === 47) {
|
|
49
|
+
if (cc <= 32) skip()
|
|
50
|
+
else if (cc === 47)
|
|
60
51
|
// /**/
|
|
61
52
|
if (code(1) === 42) skip(2), skip(c => c !== 42 && code(1) !== 47), skip(2)
|
|
62
53
|
// //
|
|
63
54
|
else if (code(1) === 47) skip(2), skip(c => c >= 32)
|
|
55
|
+
else break
|
|
64
56
|
}
|
|
65
57
|
return cc
|
|
66
58
|
}
|
|
@@ -119,12 +111,12 @@ addOps(parse.operator, 3, [
|
|
|
119
111
|
'.', PREC_CALL, (node,b) => node && [skip(),node, typeof (b = expr(PREC_CALL)) === 'string' ? '"' + b + '"' : b.valueOf()],
|
|
120
112
|
|
|
121
113
|
// a[b]
|
|
122
|
-
'[', PREC_CALL, (node) => (skip(), node = ['.', node, expr(0,CBRACK)
|
|
114
|
+
'[', PREC_CALL, (node) => (skip(), node = ['.', node, val(expr(0,CBRACK))], skip(), node),
|
|
123
115
|
']',,,
|
|
124
116
|
|
|
125
117
|
// a(b)
|
|
126
118
|
'(', PREC_CALL, (node,b) => ( skip(), b=expr(0,CPAREN), skip(),
|
|
127
|
-
Array.isArray(b) && b[0]===',' ? (b[0]=node, b) : b ? [node, b
|
|
119
|
+
Array.isArray(b) && b[0]===',' ? (b[0]=node, b) : b ? [node, val(b)] : [node]
|
|
128
120
|
),
|
|
129
121
|
// (a+b)
|
|
130
122
|
'(', PREC_GROUP, (node,b) => !node && (skip(), b=expr(0,CPAREN) || err(), skip(), b),
|
|
@@ -148,6 +140,7 @@ addOps(parse.operator, 3, [
|
|
|
148
140
|
':',,,
|
|
149
141
|
'in', PREC_COMP, (node) => code(2) <= 32 && [skip(2), '"'+node+'"', expr(PREC_COMP)],
|
|
150
142
|
|
|
143
|
+
// as operator it's faster to lookup (no need to extra rule check), smaller and no conflict with word names
|
|
151
144
|
// [a,b,c]
|
|
152
145
|
'[', PREC_TOKEN, (node,arg) => !node && (
|
|
153
146
|
skip(), arg=expr(0,93), skip(),
|
|
@@ -156,9 +149,16 @@ addOps(parse.operator, 3, [
|
|
|
156
149
|
|
|
157
150
|
// {a:0, b:1}
|
|
158
151
|
'{', PREC_TOKEN, (node,arg) => !node && (skip(), arg=expr(0,125), skip(),
|
|
159
|
-
!arg ? ['{'] : arg[0] == ':' ? ['{',arg] : arg[0] == ',' ? (arg[0]='{',arg) : ['
|
|
152
|
+
!arg ? ['{'] : arg[0] == ':' ? ['{',arg] : arg[0] == ',' ? (arg[0]='{',arg) : ['{',arg])
|
|
160
153
|
,
|
|
154
|
+
|
|
155
|
+
// literals
|
|
156
|
+
'null', PREC_TOKEN, node=>!node&&(skip(4),v(null)),
|
|
157
|
+
'false', PREC_TOKEN, node=>!node&&(skip(5),v(false)),
|
|
158
|
+
'true', PREC_TOKEN, node=>!node&&(skip(4),v(true)),
|
|
159
|
+
'undefined', PREC_TOKEN, node=>!node&&(skip(9),v(undefined)),
|
|
161
160
|
])
|
|
161
|
+
const v = v => ({valueOf:()=>v})
|
|
162
162
|
|
|
163
163
|
addOps(evaluate.operator, 2, [
|
|
164
164
|
// subscript
|
|
@@ -200,9 +200,7 @@ addOps(evaluate.operator, 2, [
|
|
|
200
200
|
'?:', (a,b,c)=>a?b:c,
|
|
201
201
|
'in', (a,b)=>a in b,
|
|
202
202
|
|
|
203
|
-
// []
|
|
204
203
|
'[', (...args) => Array(...args),
|
|
205
|
-
// as operator it's faster to lookup (no need to call extra rule check), smaller and no conflict with word names
|
|
206
204
|
'{', (...args)=>Object.fromEntries(args),
|
|
207
205
|
':', (a,b)=>[a,b]
|
|
208
206
|
])
|
package/justin.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,r,t=e=>Array.isArray(e)&&("string"==typeof e[0]||t(e[0])),a=(e,r={},o,
|
|
1
|
+
var e,r,t=e=>Array.isArray(e)&&("string"==typeof e[0]||t(e[0])),a=(e,r={},o,s)=>t(e)?("string"==typeof(o=e[0])&&(s=n[o]),"function"!=typeof(o=s||a(o,r))?o:o.call(...e.map((e=>a(e,r))))):e&&"string"==typeof e?'"'===e[0]?e.slice(1,-1):"@"===e[0]?e.slice(1):e in r?r[e]:e:e,n={},o=(a.operator=(e,r)=>n[e]=2==r.length?(...e)=>e.reduce(r):r,(t,a)=>(r=t,e=0,a=p(),e<r.length?s():d(a))),s=(t="Bad syntax")=>{throw Error(t+" `"+r[e]+"` at "+e)},f=(t=1,a=e)=>{if("number"==typeof t)e+=t;else for(;t(i());)e++;return r.slice(a,e)},i=(t=0)=>r.charCodeAt(e+t),l=(t=1)=>r.substr(e,t),p=(e=0,r,t,a,n=0,f,i)=>{for(;(t=o.space())&&(i=y[t]?.(a,e)||!a&&c(t));)a=i;return r&&t!==r&&s("Unclosed paren"),a},u=(o.space=r=>{for(;(r=i())<=32;)e++;return r},o.token=[]),c=(e,r=0,t)=>{for(;r<u.length;)if(t=u[r++](e))return t},y=[],d=(o.operator=(r,t=0,a=0,n,u=r.charCodeAt(0),c=r.length,h=y[u],v=a<=0&&r.toUpperCase()!==r)=>(n=a?a>0?e=>e&&[f(c),d(e)]:a<0?e=>!e&&[f(c),d(p(t-1))]:a:a=>{a=[r,a||s()];do{e+=c,a.push(d(p(t)))}while(o.space()==u&&(c<2||l(c)==r)&&(!v||i(c)<=32));return a},y[u]=(e,a)=>a<t&&(c<2||l(c)==r)&&(!v||i(c)<=32)&&n(e)||h&&h(e,a)),e=>Array.isArray(e)?e:(e||s()).valueOf()),h=10,v=15,g=20;o.token.push((e=>(e=f((e=>e>47&&e<58||46==e)))&&((69==i()||101==i())&&(e+=f(2)+f((e=>e>=48&&e<=57))),isNaN(e=new Number(e))?s("Bad number"):e)),((e,r,t,a)=>{if(34===e||39===e){for(r=l(),f(),a="";(t=i())-e;)92===t?(f(),a+=A[l()]||l()):a+=l(),f();return f(),r+a+r}}),(e=>f((e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e))));var A={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"};o.space=e=>{for(;(e=i())<=32||47===e;)if(e<=32)f();else if(47===e)if(42===i(1))f(2),f((e=>42!==e&&47!==i(1))),f(2);else{if(47!==i(1))break;f(2),f((e=>e>=32))}return e};var b=(e,r=2,t)=>{for(let a=0;a<t.length;a+=r)e(t[a],t[a+1],t[a+2])};b(o.operator,3,[",",1,,"|",6,,"||",4,,"&",8,,"&&",5,,"^",7,,"==",9,,"!=",9,,">",h,,">=",h,,">>",11,,">>>",11,,"<",h,,"<=",h,,"<<",11,,"+",12,,"+",v,-1,"++",v,-1,"++",v,1,"-",12,,"-",v,-1,"--",v,-1,"--",v,1,"!",v,-1,"*",13,,"/",13,,"%",13,,".",18,(e,r)=>e&&[f(),e,"string"==typeof(r=p(18))?'"'+r+'"':r.valueOf()],"[",18,e=>(f(),e=[".",e,d(p(0,93))],f(),e),"]",,,"(",18,(e,r)=>(f(),r=p(0,41),f(),Array.isArray(r)&&","===r[0]?(r[0]=e,r):r?[e,d(r)]:[e]),"(",19,(e,r)=>!e&&(f(),r=p(0,41)||s(),f(),r),")",,,";",1,,"===",9,,"!==",9,,"**",14,,"~",v,-1,"?",3,e=>{let r,t;return e||s("Expected expression"),f(),o.space(),r=p(),58!==i()&&s("Expected :"),f(),o.space(),t=p(),["?:",e,r,t]},"}",,,":",,,"in",h,e=>i(2)<=32&&[f(2),'"'+e+'"',p(h)],"[",g,(e,r)=>!e&&(f(),r=p(0,93),f(),r?","==r[0]?(r[0]="[",r):["[",r]:["["]),"{",g,(e,r)=>!e&&(f(),r=p(0,125),f(),r?":"==r[0]?["{",r]:","==r[0]?(r[0]="{",r):["{",r]:["{"]),"null",g,e=>!e&&(f(4),m(null)),"false",g,e=>!e&&(f(5),m(!1)),"true",g,e=>!e&&(f(4),m(!0)),"undefined",g,e=>!e&&(f(9),m(void 0))]);var m=e=>({valueOf:()=>e});b(a.operator,2,["!",e=>!e,"++",e=>++e,"--",e=>--e,".",(e,r)=>e&&e[r],"%",(e,r)=>e%r,"/",(e,r)=>e/r,"*",(e,r)=>e*r,"+",(e,r)=>e+r,"-",(...e)=>e.length<2?-e:e.reduce(((e,r)=>e-r)),">>>",(e,r)=>e>>>r,">>",(e,r)=>e>>r,"<<",(e,r)=>e<<r,">=",(e,r)=>e>=r,">",(e,r)=>e>r,"<=",(e,r)=>e<=r,"<",(e,r)=>e<r,"!=",(e,r)=>e!=r,"==",(e,r)=>e==r,"&",(e,r)=>e&r,"^",(e,r)=>e^r,"|",(e,r)=>e|r,"&&",(...e)=>e.every(Boolean),"||",(...e)=>e.some(Boolean),",",(e,r)=>r,"**",(...e)=>e.reduceRight(((e,r)=>Math.pow(r,e))),"~",e=>~e,"?:",(e,r,t)=>e?r:t,"in",(e,r)=>e in r,"[",(...e)=>Array(...e),"{",(...e)=>Object.fromEntries(e),":",(e,r)=>[e,r]]);var x=e=>(e="string"==typeof e?o(e):e,r=>a(e,r));export{x as default,a as evaluate,o as parse};
|
package/package.json
CHANGED
package/parse.js
CHANGED
|
@@ -43,11 +43,15 @@ lookup = [],
|
|
|
43
43
|
// @param op is operator string
|
|
44
44
|
// @param prec is operator precedenc to check
|
|
45
45
|
// @param map is either number +1 - postfix unary, -1 prefix unary, 0 binary, else - custom mapper function
|
|
46
|
-
operator = parse.operator =
|
|
46
|
+
operator = parse.operator = (
|
|
47
|
+
op, prec=0, type=0, map, c=op.charCodeAt(0), l=op.length,
|
|
48
|
+
prev=lookup[c],
|
|
49
|
+
spaced=type<=0&&op.toUpperCase()!==op // non-postfix word operator must have space after
|
|
50
|
+
) => (
|
|
47
51
|
map = !type ? node => { // binary, consume same-op group
|
|
48
52
|
node = [op, node || err()]
|
|
49
53
|
do { idx+=l, node.push(val(expr(prec))) }
|
|
50
|
-
while (parse.space()==c && (l<2||char(l)==op) && (!
|
|
54
|
+
while (parse.space()==c && (l<2||char(l)==op) && (!spaced||code(l)<=SPACE))
|
|
51
55
|
return node
|
|
52
56
|
} :
|
|
53
57
|
type > 0 ? node => node && [skip(l), val(node)] : // postfix unary
|
|
@@ -55,7 +59,7 @@ operator = parse.operator = (op, prec=0, type=0, map, c=op.charCodeAt(0), l=op.
|
|
|
55
59
|
type,
|
|
56
60
|
|
|
57
61
|
lookup[c] = (node, curPrec) =>
|
|
58
|
-
curPrec < prec && (l<2||char(l)==op) && (!
|
|
62
|
+
curPrec < prec && (l<2||char(l)==op) && (!spaced||code(l)<=SPACE) &&
|
|
59
63
|
map(node) || (prev && prev(node, curPrec))
|
|
60
64
|
),
|
|
61
65
|
|
package/subscript.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import parse, {skip, expr, code, tokens, operator as parseOp} from './parse.js'
|
|
1
|
+
import parse, {skip, expr, code, tokens, val, operator as parseOp} from './parse.js'
|
|
2
2
|
import evaluate, {operator as evalOp} from './evaluate.js'
|
|
3
3
|
|
|
4
4
|
const PERIOD=46, OPAREN=40, CPAREN=41, CBRACK=93, SPACE=32,
|
|
@@ -58,11 +58,11 @@ addOps(parseOp, 3, [
|
|
|
58
58
|
'+', PREC_SUM,,
|
|
59
59
|
'+', PREC_UNARY, -1,
|
|
60
60
|
'++', PREC_UNARY, -1,
|
|
61
|
-
'++',
|
|
61
|
+
'++', PREC_POSTFIX, +1,
|
|
62
62
|
'-', PREC_SUM,,
|
|
63
63
|
'-', PREC_UNARY, -1,
|
|
64
64
|
'--', PREC_UNARY, -1,
|
|
65
|
-
'--',
|
|
65
|
+
'--', PREC_POSTFIX, +1,
|
|
66
66
|
|
|
67
67
|
// ! ~
|
|
68
68
|
'!', PREC_UNARY, -1,
|
|
@@ -76,12 +76,12 @@ addOps(parseOp, 3, [
|
|
|
76
76
|
'.', PREC_CALL, (node,b) => node && [skip(),node, typeof (b = expr(PREC_CALL)) === 'string' ? '"' + b + '"' : b.valueOf()],
|
|
77
77
|
|
|
78
78
|
// a[b]
|
|
79
|
-
'[', PREC_CALL, (node) => (skip(), node = ['.', node, expr(0,CBRACK)
|
|
79
|
+
'[', PREC_CALL, (node) => (skip(), node = ['.', node, val(expr(0,CBRACK))], skip(), node),
|
|
80
80
|
']',,,
|
|
81
81
|
|
|
82
82
|
// a(b)
|
|
83
83
|
'(', PREC_CALL, (node,b) => ( skip(), b=expr(0,CPAREN), skip(),
|
|
84
|
-
Array.isArray(b) && b[0]===',' ? (b[0]=node, b) : b ? [node, b
|
|
84
|
+
Array.isArray(b) && b[0]===',' ? (b[0]=node, b) : b ? [node, val(b)] : [node]
|
|
85
85
|
),
|
|
86
86
|
// (a+b)
|
|
87
87
|
'(', PREC_GROUP, (node,b) => !node && (skip(), b=expr(0,CPAREN) || err(), skip(), b),
|
package/subscript.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,
|
|
1
|
+
var r,e,t=(t,o)=>(e=t,r=0,o=l(),r<e.length?a():y(o)),a=(t="Bad syntax")=>{throw Error(t+" `"+e[r]+"` at "+r)},o=(t=1,a=r)=>{if("number"==typeof t)r+=t;else for(;t(n());)r++;return e.slice(a,r)},n=(t=0)=>e.charCodeAt(r+t),s=(t=1)=>e.substr(r,t),l=(r=0,e,o,n,s=0,l,p)=>{for(;(o=t.space())&&(p=u[o]?.(n,r)||!n&&f(o));)n=p;return e&&o!==e&&a("Unclosed paren"),n},p=(t.space=e=>{for(;(e=n())<=32;)r++;return e},t.token=[]),f=(r,e=0,t)=>{for(;e<p.length;)if(t=p[e++](r))return t},u=[],i=t.operator=(e,p=0,f=0,i,c=e.charCodeAt(0),h=e.length,g=u[c],d=f<=0&&e.toUpperCase()!==e)=>(i=f?f>0?r=>r&&[o(h),y(r)]:f<0?r=>!r&&[o(h),y(l(p-1))]:f:o=>{o=[e,o||a()];do{r+=h,o.push(y(l(p)))}while(t.space()==c&&(h<2||s(h)==e)&&(!d||n(h)<=32));return o},u[c]=(r,t)=>t<p&&(h<2||s(h)==e)&&(!d||n(h)<=32)&&i(r)||g&&g(r,t)),y=r=>Array.isArray(r)?r:(r||a()).valueOf(),c=t,h=r=>Array.isArray(r)&&("string"==typeof r[0]||h(r[0])),g=(r,e={},t,a)=>h(r)?("string"==typeof(t=r[0])&&(a=d[t]),"function"!=typeof(t=a||g(t,e))?t:t.call(...r.map((r=>g(r,e))))):r&&"string"==typeof r?'"'===r[0]?r.slice(1,-1):"@"===r[0]?r.slice(1):r in e?e[r]:r:r,d={},A=g.operator=(r,e)=>d[r]=2==e.length?(...r)=>r.reduce(e):e,v=g;p.push((r=>(r=o((r=>r>47&&r<58||46==r)))&&((69==n()||101==n())&&(r+=o(2)+o((r=>r>=48&&r<=57))),isNaN(r=new Number(r))?err("Bad number"):r)),((r,e)=>34==r&&o()+o((e=>e-r))+o()),(r=>o((r=>r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||36==r||95==r||r>=192))));var m=(r,e=2,t)=>{for(let a=0;a<t.length;a+=e)r(t[a],t[a+1],t[a+2])};m(i,3,[",",1,,"|",6,,"||",4,,"&",8,,"&&",5,,"^",7,,"==",9,,"!=",9,,">",10,,">=",10,,">>",11,,">>>",11,,"<",10,,"<=",10,,"<<",11,,"+",12,,"+",15,-1,"++",15,-1,"++",16,1,"-",12,,"-",15,-1,"--",15,-1,"--",16,1,"!",15,-1,"*",13,,"/",13,,"%",13,,".",18,(r,e)=>r&&[o(),r,"string"==typeof(e=l(18))?'"'+e+'"':e.valueOf()],"[",18,r=>(o(),r=[".",r,y(l(0,93))],o(),r),"]",,,"(",18,(r,e)=>(o(),e=l(0,41),o(),Array.isArray(e)&&","===e[0]?(e[0]=r,e):e?[r,y(e)]:[r]),"(",19,(r,e)=>!r&&(o(),e=l(0,41)||err(),o(),e),")",,,]),m(A,2,["!",r=>!r,"++",r=>++r,"--",r=>--r,".",(r,e)=>r&&r[e],"%",(r,e)=>r%e,"/",(r,e)=>r/e,"*",(r,e)=>r*e,"+",(r,e)=>r+e,"-",(...r)=>r.length<2?-r:r.reduce(((r,e)=>r-e)),">>>",(r,e)=>r>>>e,">>",(r,e)=>r>>e,"<<",(r,e)=>r<<e,">=",(r,e)=>r>=e,">",(r,e)=>r>e,"<=",(r,e)=>r<=e,"<",(r,e)=>r<e,"!=",(r,e)=>r!=e,"==",(r,e)=>r==e,"&",(r,e)=>r&e,"^",(r,e)=>r^e,"|",(r,e)=>r|e,"&&",(...r)=>r.every(Boolean),"||",(...r)=>r.some(Boolean),",",(r,e)=>e]);var b=r=>(r="string"==typeof r?c(r):r,e=>v(r,e));export{b as default,v as evaluate,c as parse};
|