parser-combinators 1.2.1 → 1.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 +0 -1
- package/dist/index.min.js +2 -2
- package/dist/index.min.mjs +4 -0
- package/dist/parsers/any.js +3 -14
- package/dist/parsers/anyString.d.ts +3 -6
- package/dist/parsers/anyString.js +4 -2
- package/dist/parsers/between.js +12 -8
- package/dist/parsers/many.d.ts +2 -2
- package/dist/parsers/many.js +89 -23
- package/dist/parsers/map.js +7 -2
- package/dist/parsers/optimizations.d.ts +11 -0
- package/dist/parsers/optimizations.js +23 -0
- package/dist/parsers/str.d.ts +2 -10
- package/dist/parsers/str.js +2 -2
- package/dist/parsers/utilities.d.ts +4 -7
- package/dist/parsers/utilities.js +11 -13
- package/dist-esm/index.d.ts +3 -0
- package/dist-esm/index.js +3 -0
- package/dist-esm/parser.d.ts +9 -0
- package/dist-esm/parser.js +18 -0
- package/dist-esm/parsers/any.d.ts +16 -0
- package/dist-esm/parsers/any.js +33 -0
- package/dist-esm/parsers/anyString.d.ts +12 -0
- package/dist-esm/parsers/anyString.js +84 -0
- package/dist-esm/parsers/between.d.ts +5 -0
- package/dist-esm/parsers/between.js +21 -0
- package/dist-esm/parsers/exhaust.d.ts +5 -0
- package/dist-esm/parsers/exhaust.js +22 -0
- package/dist-esm/parsers/index.d.ts +12 -0
- package/dist-esm/parsers/index.js +12 -0
- package/dist-esm/parsers/many.d.ts +17 -0
- package/dist-esm/parsers/many.js +121 -0
- package/dist-esm/parsers/map.d.ts +5 -0
- package/dist-esm/parsers/map.js +23 -0
- package/dist-esm/parsers/opt.d.ts +5 -0
- package/dist-esm/parsers/opt.js +13 -0
- package/dist-esm/parsers/optimizations.d.ts +11 -0
- package/dist-esm/parsers/optimizations.js +16 -0
- package/dist-esm/parsers/recovery.d.ts +14 -0
- package/dist-esm/parsers/recovery.js +49 -0
- package/dist-esm/parsers/regex.d.ts +5 -0
- package/dist-esm/parsers/regex.js +17 -0
- package/dist-esm/parsers/seq.d.ts +16 -0
- package/dist-esm/parsers/seq.js +14 -0
- package/dist-esm/parsers/str.d.ts +9 -0
- package/dist-esm/parsers/str.js +32 -0
- package/dist-esm/parsers/utilities.d.ts +30 -0
- package/dist-esm/parsers/utilities.js +85 -0
- package/dist-esm/parsers/values.d.ts +31 -0
- package/dist-esm/parsers/values.js +44 -0
- package/dist-esm/types.d.ts +40 -0
- package/dist-esm/types.js +38 -0
- package/package.json +61 -56
package/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
## Parser Combinators
|
|
2
2
|
|
|
3
3
|
[](https://github.com/michalusio/Parser/actions/workflows/CI.yml)
|
|
4
|
-
[](https://github.com/michalusio/Parser/actions/workflows/codeql-analysis.yml)
|
|
5
4
|
[](https://codecov.io/gh/michalusio/Parser)
|
|
6
5
|
|
|
7
6
|

|
package/dist/index.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
var a=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var l=a(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.ParseError=void 0;p.isFailure=be;p.success=k;p.failure=ee;p.result=ve;p.fail=Pe;function be(e){return!e.success}function k(e,n){return{success:!0,value:n,ctx:e}}function ee(e,n,t){return{success:!1,expected:n,ctx:e,history:t}}function ve(e){return n=>k(n,e)}function Pe(e){return n=>ee(n,e,[e])}var B=class extends Error{constructor(n,t,r,s){super(n),this.index=r,this.history=s,[this.line,this.column,this.row]=this.getInputData(t,r)}getInputData(n,t){let r=n.split(`
|
|
2
2
|
`),s=0;for(;t>0;){if(r[s].length>t)return[r[s],t+1,s+1];t-=r[s].length+1,s+=1}return[r[s],t+1,s+1]}getPrettyErrorMessage(){return`${this.message} (line ${this.row}, col ${this.column}):
|
|
3
3
|
${this.line}
|
|
4
|
-
${(this.column>0?"-".repeat(this.column-1):"")+"^"}`}};p.ParseError=B});var te=a(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});z.anyString=Oe;var re=l();function Oe(e){let n=`'${e[e.length-1][0]}'`,t;return Object.assign(r=>{t??=we(e);let s=Me(t,r.text,r.index);return s?(0,re.success)({...r,index:s.end},e[s.matchIndex][0]):(0,re.failure)(r,n,["any",n])},{parserType:"anyString",matches:e})}function we(e){let n=new Map;return e.forEach((t,r)=>w(n,t,r)),n}function w(e,n,t,r=0){if(r>=n[0].length)e.matchIndex!=null?e.matchIndex=Math.min(e.matchIndex,t):e.matchIndex=t;else{let s=n[0][r],u=s.toLowerCase(),i=s.toUpperCase(),g=new Map;if(n[1]&&u!==i){let q=e.get(u)??g,_=e.get(i)??g;e.set(u,q),e.set(i,_),w(q,n,t,r+1),q!==_&&w(_,n,t,r+1)}else{let q=e.get(s)??g;e.set(s,q);let _=e.get(u);if(_===e.get(i)){let Z=new Map(_.entries());Z.matchIndex=_.matchIndex,e.set(i,Z)}w(q,n,t,r+1)}}}function Me(e,n,t){let r,s,u=e;for(let i=t;i<n.length;i++){let g=n[i];if(u.matchIndex!=null&&(s==null||u.matchIndex<=s)&&(r=i,s=u.matchIndex),u=u.get(g),!u)break}return u&&u.matchIndex!=null&&(s==null||u.matchIndex<=s)&&(r=n.length,s=u.matchIndex),r==null?void 0:{end:r,matchIndex:s}}});var M=a(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.toggleFusions=f.shouldPerformFusions=void 0;f.ref=Fe;f.expect=se;f.expectErase=Se;f.surely=$e;f.token=Te;f.lookaround=Ie;var h=l(),je=()=>ne;f.shouldPerformFusions=je;var ne=!0,me=e=>{ne=e};f.toggleFusions=me;function Fe(e,n,t){return r=>{let s=e(r);return!(0,h.isFailure)(s)&&!n(s.value)?(0,h.failure)(s.ctx,t??"check",[`ref: ${t??"check"}`]):s}}function se(e,n){return t=>{let r=e(t);return(0,h.isFailure)(r)?(0,h.failure)(r.ctx,n,[n,...r.history]):r}}function Se(e,n){return t=>{let r=e(t);return(0,h.isFailure)(r)?(0,h.failure)(r.ctx,n,[n]):r}}function $e(e){return se(e,"surely")}function Te(e){return n=>{let t=e(n);return t.success?{...t,value:{value:t.value,start:n.index,end:t.ctx.index}}:t}}function Ie(e){return n=>{let t=e(n);return t.success?(0,h.success)(n,void 0):(0,h.failure)(n,t.expected,["lookaround",...t.history])}}});var ue=a(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.any=ze;var D=l(),Ee=te(),Ce=M(),Be=["str","stri","anyString"];function ze(...e){let n={};if((0,Ce.shouldPerformFusions)()&&e.every(t=>"parserType"in t&&typeof t.parserType=="string"&&Be.includes(t.parserType))){let r=e.flatMap(s=>{switch(s.parserType){case"anyString":return s.matches;case"str":return[[s.match,!1]];case"stri":return[[s.match,!0]]}});if(r.length>10)return(0,Ee.anyString)(r);n={parserType:"anyString",matches:r}}return Object.assign(t=>{let r=[];for(let u of e){let i=u(t);if((0,D.isFailure)(i)){if(i.history.includes("surely"))return(0,D.failure)(i.ctx,i.expected,i.history.filter(g=>g!=="surely"));r.push(i)}else return i}let s=r.reduce((u,i)=>u.history.length>i.history.length?u:i);return(0,D.failure)(s.ctx,s.expected,["any",...s.history])},n)}});var v=a(Q=>{"use strict";Object.defineProperty(Q,"__esModule",{value:!0});Q.seq=De;var N=l();function De(...e){return n=>{let t=[];for(let r of e){let s=r(n);if(n=s.ctx,(0,N.isFailure)(s))return(0,N.failure)(s.ctx,s.expected,["seq",...s.history]);t.push(s.value)}return(0,N.success)(n,t)}}});var oe=a(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.between=Ne;var ie=l(),Re=v();function Ne(e,n,t){let r=(0,Re.seq)(e,n,t);return s=>{let u=r(s);if((0,ie.isFailure)(u)){let i=[...u.history];return i.splice(0,1),(0,ie.failure)(u.ctx,u.expected,["between",...i])}return{...u,value:u.value[1]}}}});var ce=a(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.exhaust=Qe;var P=l();function Qe(e,n=null){return t=>{let r=[];for(;;){let s=e(t);if((0,P.isFailure)(s))return n===null||(0,P.isFailure)(n(t))?(0,P.failure)(s.ctx,s.expected,["exhaust",...s.history]):(0,P.success)(t,r);if(t=s.ctx,r.push(s.value),s.ctx.index===s.ctx.text.length)return(0,P.success)(s.ctx,r)}}}});var m=a(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.map=Ae;var j=l();function Ae(e,n){return t=>{let r=e(t);if((0,j.isFailure)(r))return(0,j.failure)(r.ctx,r.expected,["map",...r.history]);try{let s=n(r.value);return(0,j.success)(r.ctx,s)}catch{return(0,j.failure)(r.ctx,"Error while mapping",["map"])}}}});var F=a(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.opt=He;var ae=l();function He(e){return n=>{let t=e(n);return(0,ae.isFailure)(t)?(0,ae.success)(n,null):t}}});var fe=a(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.many=V;b.zeroOrMany=Ue;b.oneOrMany=le;b.oneOrManyRed=Ve;var S=l(),x=m(),Le=F(),$=v();function V(e){return n=>{let t=[];for(;;){let r=e(n);if((0,S.isFailure)(r))return(0,S.success)(n,t);n=r.ctx,t.push(r.value)}}}function Ue(e,n){return(0,x.map)((0,Le.opt)(le(e,n)),t=>t??[])}function le(e,n=void 0){let t=(0,x.map)((0,$.seq)(e,V(n?(0,x.map)((0,$.seq)(n,e),([,r])=>r):e)),([r,s])=>[r,...s]);return r=>{let s=t(r);if((0,S.isFailure)(s)){let u=[...s.history];return u.splice(0,2),(0,S.failure)(s.ctx,s.expected,["oneOrMany",...u])}return s}}function Ve(e,n,t){return(0,x.map)((0,x.map)((0,$.seq)((0,x.map)(e,r=>[null,r]),V((0,$.seq)(n,e))),([r,s])=>[r,...s]),r=>{let s=r[0][1];for(let u=1;u<r.length;u++)s=t(s,r[u][1],r[u][0]);return s})}});var G=a(W=>{"use strict";Object.defineProperty(W,"__esModule",{value:!0});W.regex=We;var de=l();function We(e,n){let t=new RegExp(e,typeof e=="string"?"y":e.flags+"y");return r=>{t.lastIndex=r.index;let s=t.exec(r.text);return s!==null&&s.index===r.index?(0,de.success)({...r,index:r.index+s[0].length},s[0]):(0,de.failure)(r,n,[n])}}});var J=a(I=>{"use strict";Object.defineProperty(I,"__esModule",{value:!0});I.str=Ge;I.stri=Ke;var T=l();function Ge(e){let n=`'${e}'`;return Object.assign(t=>t.text.startsWith(e,t.index)?(0,T.success)({...t,index:t.index+e.length},e):(0,T.failure)(t,n,[n]),{parserType:"str",match:e})}var Je=new Intl.Collator("en",{sensitivity:"accent"});function Ke(e){let n=e.toLowerCase(),t=`'${n}'`;return Object.assign(r=>{let s=r.text.slice(r.index,r.index+e.length);return Je.compare(e,s)==0?(0,T.success)({...r,index:r.index+e.length},n):(0,T.failure)(r,t,[t])},{parserType:"stri",match:n})}});var ye=a(E=>{"use strict";Object.defineProperty(E,"__esModule",{value:!0});E.recoverBySkippingChars=Xe;E.recoverByAddingChars=Ye;var pe=l();function Xe(e,n){return t=>{let r=null;for(let s=0;s<=n;s++){let u=e({index:t.index+s,path:t.path,text:t.text});if((0,pe.isFailure)(u))r??=u;else return u}return r}}function Ye(e,n){return t=>{let r=null;for(let s=0;s<=n.length;s++){let u=n.slice(0,s),i=e({index:t.index,path:t.path,text:`${t.text.slice(0,t.index)}${u}${t.text.slice(t.index)}`});if((0,pe.isFailure)(i))r??=i;else return i}return r}}});var ge=a(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.eof=o.realP=o.real=o.intP=o.int=o.boolP=o.bool=o.wspaces=o.spacesPlus=o.spaces=void 0;var he=l(),C=m(),Ze=F(),O=G(),ke=v(),er=J(),rr=M();o.spaces=(0,O.regex)(/ */,"spaces");o.spacesPlus=(0,O.regex)(/ +/,"spaces");o.wspaces=(0,Ze.opt)((0,O.regex)(/(?:\s|\t|\n|\r)+/,"whitespace characters"));o.bool=(0,O.regex)(/true|false/,"boolean");o.boolP=(0,C.map)(o.bool,e=>e==="true");o.int=(0,O.regex)(/\d+/,"integer");o.intP=(0,C.map)(o.int,e=>parseInt(e,10));o.real=(0,rr.expect)((0,C.map)((0,ke.seq)(o.int,(0,er.str)("."),o.int),([e,,n])=>`${e}.${n}`),"real");o.realP=(0,C.map)(o.real,e=>parseFloat(e));var tr=e=>e.index===e.text.length?(0,he.success)(e,void 0):(0,he.failure)(e,"End Of File",["EOF"]);o.eof=tr});var qe=a(c=>{"use strict";var nr=c&&c.__createBinding||(Object.create?(function(e,n,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(n,t);(!s||("get"in s?!n.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return n[t]}}),Object.defineProperty(e,r,s)}):(function(e,n,t,r){r===void 0&&(r=t),e[r]=n[t]})),d=c&&c.__exportStar||function(e,n){for(var t in e)t!=="default"&&!Object.prototype.hasOwnProperty.call(n,t)&&nr(n,e,t)};Object.defineProperty(c,"__esModule",{value:!0});c.stri=c.str=void 0;d(ue(),c);d(oe(),c);d(ce(),c);d(fe(),c);d(m(),c);d(F(),c);d(G(),c);d(v(),c);var _e=J();Object.defineProperty(c,"str",{enumerable:!0,get:function(){return _e.str}});Object.defineProperty(c,"stri",{enumerable:!0,get:function(){return _e.stri}});d(ye(),c);d(M(),c);d(ge(),c)});var xe=a(X=>{"use strict";Object.defineProperty(X,"__esModule",{value:!0});X.ParseText=sr;var K=l();function sr(e,n,t=""){let r=n({text:e,path:t,index:0});if((0,K.isFailure)(r))throw new K.ParseError(`Parse error, expected ${[...r.history].pop()} at char ${r.ctx.index}`,e,r.ctx.index,r.history);if(r.ctx.index!==e.length)throw new K.ParseError(`Parse error, expected end of text at char ${r.ctx.index}`,e,r.ctx.index,[]);return r.value}});var ir=a(y=>{var ur=y&&y.__createBinding||(Object.create?(function(e,n,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(n,t);(!s||("get"in s?!n.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return n[t]}}),Object.defineProperty(e,r,s)}):(function(e,n,t,r){r===void 0&&(r=t),e[r]=n[t]})),Y=y&&y.__exportStar||function(e,n){for(var t in e)t!=="default"&&!Object.prototype.hasOwnProperty.call(n,t)&&ur(n,e,t)};Object.defineProperty(y,"__esModule",{value:!0});Y(l(),y);Y(qe(),y);Y(xe(),y)});ir();
|
|
4
|
+
${(this.column>0?"-".repeat(this.column-1):"")+"^"}`}};p.ParseError=B});var te=a(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});z.anyString=Oe;var re=l();function Oe(e){let n=`'${e[e.length-1][0]}'`,t;return Object.assign(r=>{t??=we(e);let s=Me(t,r.text,r.index);return s?(0,re.success)({...r,index:s.end},e[s.matchIndex][0]):(0,re.failure)(r,n,["any",n])},{parserType:"anyString",matches:e})}function we(e){let n=new Map;return e.forEach((t,r)=>w(n,t,r)),n}function w(e,n,t,r=0){if(r>=n[0].length)e.matchIndex!=null?e.matchIndex=Math.min(e.matchIndex,t):e.matchIndex=t;else{let s=n[0][r],u=s.toLowerCase(),i=s.toUpperCase(),g=new Map;if(n[1]&&u!==i){let q=e.get(u)??g,_=e.get(i)??g;e.set(u,q),e.set(i,_),w(q,n,t,r+1),q!==_&&w(_,n,t,r+1)}else{let q=e.get(s)??g;e.set(s,q);let _=e.get(u);if(_===e.get(i)){let Z=new Map(_.entries());Z.matchIndex=_.matchIndex,e.set(i,Z)}w(q,n,t,r+1)}}}function Me(e,n,t){let r,s,u=e;for(let i=t;i<n.length;i++){let g=n[i];if(u.matchIndex!=null&&(s==null||u.matchIndex<=s)&&(r=i,s=u.matchIndex),u=u.get(g),!u)break}return u&&u.matchIndex!=null&&(s==null||u.matchIndex<=s)&&(r=n.length,s=u.matchIndex),r==null?void 0:{end:r,matchIndex:s}}});var M=a(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.toggleFusions=f.shouldPerformFusions=void 0;f.ref=Fe;f.expect=se;f.expectErase=Se;f.surely=$e;f.token=Te;f.lookaround=Ie;var h=l(),je=()=>ne;f.shouldPerformFusions=je;var ne=!0,me=e=>{ne=e};f.toggleFusions=me;function Fe(e,n,t){return r=>{let s=e(r);return!(0,h.isFailure)(s)&&!n(s.value)?(0,h.failure)(s.ctx,t??"check",[`ref: ${t??"check"}`]):s}}function se(e,n){return t=>{let r=e(t);return(0,h.isFailure)(r)?(0,h.failure)(r.ctx,n,[n,...r.history]):r}}function Se(e,n){return t=>{let r=e(t);return(0,h.isFailure)(r)?(0,h.failure)(r.ctx,n,[n]):r}}function $e(e){return se(e,"surely")}function Te(e){return n=>{let t=e(n);return t.success?{...t,value:{value:t.value,start:n.index,end:t.ctx.index}}:t}}function Ie(e){return n=>{let t=e(n);return t.success?(0,h.success)(n,void 0):(0,h.failure)(n,t.expected,["lookaround",...t.history])}}});var ue=a(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.any=ze;var D=l(),Ee=te(),Ce=M(),Be=["str","stri","anyString"];function ze(...e){let n={};if((0,Ce.shouldPerformFusions)()&&e.every(t=>"parserType"in t&&typeof t.parserType=="string"&&Be.includes(t.parserType))){let r=e.flatMap(s=>{switch(s.parserType){case"anyString":return s.matches;case"str":return[[s.match,!1]];case"stri":return[[s.match,!0]]}});if(r.length>10)return(0,Ee.anyString)(r);n={parserType:"anyString",matches:r}}return Object.assign(t=>{let r=[];for(let u of e){let i=u(t);if((0,D.isFailure)(i)){if(i.history.includes("surely"))return(0,D.failure)(i.ctx,i.expected,i.history.filter(g=>g!=="surely"));r.push(i)}else return i}let s=r.reduce((u,i)=>u.history.length>i.history.length?u:i);return(0,D.failure)(s.ctx,s.expected,["any",...s.history])},n)}});var v=a(Q=>{"use strict";Object.defineProperty(Q,"__esModule",{value:!0});Q.seq=De;var N=l();function De(...e){return n=>{let t=[];for(let r of e){let s=r(n);if(n=s.ctx,(0,N.isFailure)(s))return(0,N.failure)(s.ctx,s.expected,["seq",...s.history]);t.push(s.value)}return(0,N.success)(n,t)}}});var oe=a(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.between=Ne;var ie=l(),Re=v();function Ne(e,n,t){let r=(0,Re.seq)(e,n,t);return s=>{let u=r(s);if((0,ie.isFailure)(u)){let i=[...u.history];return i.splice(0,1),(0,ie.failure)(u.ctx,u.expected,["between",...i])}return{...u,value:u.value[1]}}}});var ce=a(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.exhaust=Qe;var P=l();function Qe(e,n=null){return t=>{let r=[];for(;;){let s=e(t);if((0,P.isFailure)(s))return n===null||(0,P.isFailure)(n(t))?(0,P.failure)(s.ctx,s.expected,["exhaust",...s.history]):(0,P.success)(t,r);if(t=s.ctx,r.push(s.value),s.ctx.index===s.ctx.text.length)return(0,P.success)(s.ctx,r)}}}});var m=a(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.map=Ae;var j=l();function Ae(e,n){return t=>{let r=e(t);if((0,j.isFailure)(r))return(0,j.failure)(r.ctx,r.expected,["map",...r.history]);try{let s=n(r.value);return(0,j.success)(r.ctx,s)}catch{return(0,j.failure)(r.ctx,"Error while mapping",["map"])}}}});var F=a(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.opt=He;var ae=l();function He(e){return n=>{let t=e(n);return(0,ae.isFailure)(t)?(0,ae.success)(n,null):t}}});var fe=a(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.many=V;b.zeroOrMany=Ue;b.oneOrMany=le;b.oneOrManyRed=Ve;var S=l(),x=m(),Le=F(),$=v();function V(e){return n=>{let t=[];for(;;){let r=e(n);if((0,S.isFailure)(r))return(0,S.success)(n,t);n=r.ctx,t.push(r.value)}}}function Ue(e,n){return(0,x.map)((0,Le.opt)(le(e,n)),t=>t??[])}function le(e,n=void 0){let t=(0,x.map)((0,$.seq)(e,V(n?(0,x.map)((0,$.seq)(n,e),([,r])=>r):e)),([r,s])=>[r,...s]);return r=>{let s=t(r);if((0,S.isFailure)(s)){let u=[...s.history];return u.splice(0,2),(0,S.failure)(s.ctx,s.expected,["oneOrMany",...u])}return s}}function Ve(e,n,t){return(0,x.map)((0,x.map)((0,$.seq)((0,x.map)(e,r=>[null,r]),V((0,$.seq)(n,e))),([r,s])=>[r,...s]),r=>{let s=r[0][1];for(let u=1;u<r.length;u++)s=t(s,r[u][1],r[u][0]);return s})}});var G=a(W=>{"use strict";Object.defineProperty(W,"__esModule",{value:!0});W.regex=We;var de=l();function We(e,n){let t=new RegExp(e,typeof e=="string"?"y":e.flags+"y");return r=>{t.lastIndex=r.index;let s=t.exec(r.text);return s!==null&&s.index===r.index?(0,de.success)({...r,index:r.index+s[0].length},s[0]):(0,de.failure)(r,n,[n])}}});var J=a(I=>{"use strict";Object.defineProperty(I,"__esModule",{value:!0});I.str=Ge;I.stri=Ke;var T=l();function Ge(e){let n=`'${e}'`;return Object.assign(t=>t.text.startsWith(e,t.index)?(0,T.success)({...t,index:t.index+e.length},e):(0,T.failure)(t,n,[n]),{parserType:"str",match:e})}var Je=new Intl.Collator("en",{sensitivity:"accent"});function Ke(e){let n=e.toLowerCase(),t=`'${n}'`;return Object.assign(r=>{let s=r.text.slice(r.index,r.index+e.length);return Je.compare(e,s)==0?(0,T.success)({...r,index:r.index+e.length},n):(0,T.failure)(r,t,[t])},{parserType:"stri",match:n})}});var ye=a(E=>{"use strict";Object.defineProperty(E,"__esModule",{value:!0});E.recoverBySkippingChars=Xe;E.recoverByAddingChars=Ye;var pe=l();function Xe(e,n){return t=>{let r=null;for(let s=0;s<=n;s++){let u=e({index:t.index+s,path:t.path,text:t.text});if((0,pe.isFailure)(u))r??=u;else return u}return r}}function Ye(e,n){return t=>{let r=null;for(let s=0;s<=n.length;s++){let u=n.slice(0,s),i=e({index:t.index,path:t.path,text:`${t.text.slice(0,t.index)}${u}${t.text.slice(t.index)}`});if((0,pe.isFailure)(i))r??=i;else return i}return r}}});var ge=a(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.eof=o.realP=o.real=o.intP=o.int=o.boolP=o.bool=o.wspaces=o.spacesPlus=o.spaces=void 0;var he=l(),C=m(),Ze=F(),O=G(),ke=v(),er=J(),rr=M();o.spaces=(0,O.regex)(/ */,"spaces");o.spacesPlus=(0,O.regex)(/ +/,"spaces");o.wspaces=(0,Ze.opt)((0,O.regex)(/(?:\s|\t|\n|\r)+/,"whitespace characters"));o.bool=(0,O.regex)(/true|false/,"boolean");o.boolP=(0,C.map)(o.bool,e=>e==="true");o.int=(0,O.regex)(/\d+/,"integer");o.intP=(0,C.map)(o.int,e=>parseInt(e,10));o.real=(0,rr.expect)((0,C.map)((0,ke.seq)(o.int,(0,er.str)("."),o.int),([e,,n])=>`${e}.${n}`),"real");o.realP=(0,C.map)(o.real,e=>parseFloat(e));var tr=e=>e.index===e.text.length?(0,he.success)(e,void 0):(0,he.failure)(e,"End Of File",["EOF"]);o.eof=tr});var qe=a(c=>{"use strict";var nr=c&&c.__createBinding||(Object.create?(function(e,n,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(n,t);(!s||("get"in s?!n.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return n[t]}}),Object.defineProperty(e,r,s)}):(function(e,n,t,r){r===void 0&&(r=t),e[r]=n[t]})),d=c&&c.__exportStar||function(e,n){for(var t in e)t!=="default"&&!Object.prototype.hasOwnProperty.call(n,t)&&nr(n,e,t)};Object.defineProperty(c,"__esModule",{value:!0});c.stri=c.str=void 0;d(ue(),c);d(oe(),c);d(ce(),c);d(fe(),c);d(m(),c);d(F(),c);d(G(),c);d(v(),c);var _e=J();Object.defineProperty(c,"str",{enumerable:!0,get:function(){return _e.str}});Object.defineProperty(c,"stri",{enumerable:!0,get:function(){return _e.stri}});d(ye(),c);d(M(),c);d(ge(),c)});var xe=a(X=>{"use strict";Object.defineProperty(X,"__esModule",{value:!0});X.ParseText=sr;var K=l();function sr(e,n,t=""){let r=n({text:e,path:t,index:0});if((0,K.isFailure)(r))throw new K.ParseError(`Parse error, expected ${[...r.history].pop()} at char ${r.ctx.index}`,e,r.ctx.index,r.history);if(r.ctx.index!==e.length)throw new K.ParseError(`Parse error, expected end of text at char ${r.ctx.index}`,e,r.ctx.index,[]);return r.value}});var ir=a(y=>{var ur=y&&y.__createBinding||(Object.create?(function(e,n,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(n,t);(!s||("get"in s?!n.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return n[t]}}),Object.defineProperty(e,r,s)}):(function(e,n,t,r){r===void 0&&(r=t),e[r]=n[t]})),Y=y&&y.__exportStar||function(e,n){for(var t in e)t!=="default"&&!Object.prototype.hasOwnProperty.call(n,t)&&ur(n,e,t)};Object.defineProperty(y,"__esModule",{value:!0});Y(l(),y);Y(qe(),y);Y(xe(),y)});export default ir();
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";(()=>{function c(e){return!e.success}function l(e,n){return{success:!0,value:n,ctx:e}}function i(e,n,t){return{success:!1,expected:n,ctx:e,history:t}}function z(e){return n=>l(n,e)}function N(e){return n=>i(n,e,[e])}var d=class extends Error{constructor(n,t,r,s){super(n),this.index=r,this.history=s,[this.line,this.column,this.row]=this.getInputData(t,r)}getInputData(n,t){let r=n.split(`
|
|
2
|
+
`),s=0;for(;t>0;){if(r[s].length>t)return[r[s],t+1,s+1];t-=r[s].length+1,s+=1}return[r[s],t+1,s+1]}getPrettyErrorMessage(){return`${this.message} (line ${this.row}, col ${this.column}):
|
|
3
|
+
${this.line}
|
|
4
|
+
${(this.column>0?"-".repeat(this.column-1):"")+"^"}`}};function T(e){let n=`'${e[e.length-1][0]}'`,t;return Object.assign(r=>{t??=P(e);let s=S(t,r.text,r.index);return s?l({...r,index:s.end},e[s.matchIndex][0]):i(r,n,["any",n])},{parserType:"anyString",matches:e})}function P(e){let n=new Map;return e.forEach((t,r)=>g(n,t,r)),n}function g(e,n,t,r=0){if(r>=n[0].length)e.matchIndex!=null?e.matchIndex=Math.min(e.matchIndex,t):e.matchIndex=t;else{let s=n[0][r],o=s.toLowerCase(),u=s.toUpperCase(),a=new Map;if(n[1]&&o!==u){let m=e.get(o)??a,x=e.get(u)??a;e.set(o,m),e.set(u,x),g(m,n,t,r+1),m!==x&&g(x,n,t,r+1)}else{let m=e.get(s)??a;e.set(s,m);let x=e.get(o);if(x===e.get(u)){let $=new Map(x.entries());$.matchIndex=x.matchIndex,e.set(u,$)}g(m,n,t,r+1)}}}function S(e,n,t){let r,s,o=e;for(let u=t;u<n.length;u++){let a=n[u];if(o.matchIndex!=null&&(s==null||o.matchIndex<=s)&&(r=u,s=o.matchIndex),o=o.get(a),!o)break}return o&&o.matchIndex!=null&&(s==null||o.matchIndex<=s)&&(r=n.length,s=o.matchIndex),r==null?void 0:{end:r,matchIndex:s}}var I=()=>M,M=!0,H=e=>{M=e};function L(e,n,t){return r=>{let s=e(r);return!c(s)&&!n(s.value)?i(s.ctx,t??"check",[`ref: ${t??"check"}`]):s}}function w(e,n){return t=>{let r=e(t);return c(r)?i(r.ctx,n,[n,...r.history]):r}}function A(e,n){return t=>{let r=e(t);return c(r)?i(r.ctx,n,[n]):r}}function U(e){return w(e,"surely")}function V(e){return n=>{let t=e(n);return t.success?{...t,value:{value:t.value,start:n.index,end:t.ctx.index}}:t}}function W(e){return n=>{let t=e(n);return t.success?l(n,void 0):i(n,t.expected,["lookaround",...t.history])}}var O=["str","stri","anyString"];function Y(...e){let n={};if(I()&&e.every(t=>"parserType"in t&&typeof t.parserType=="string"&&O.includes(t.parserType))){let r=e.flatMap(s=>{switch(s.parserType){case"anyString":return s.matches;case"str":return[[s.match,!1]];case"stri":return[[s.match,!0]]}});if(r.length>10)return T(r);n={parserType:"anyString",matches:r}}return Object.assign(t=>{let r=[];for(let o of e){let u=o(t);if(c(u)){if(u.history.includes("surely"))return i(u.ctx,u.expected,u.history.filter(a=>a!=="surely"));r.push(u)}else return u}let s=r.reduce((o,u)=>o.history.length>u.history.length?o:u);return i(s.ctx,s.expected,["any",...s.history])},n)}function f(...e){return n=>{let t=[];for(let r of e){let s=r(n);if(n=s.ctx,c(s))return i(s.ctx,s.expected,["seq",...s.history]);t.push(s.value)}return l(n,t)}}function ne(e,n,t){let r=f(e,n,t);return s=>{let o=r(s);if(c(o)){let u=[...o.history];return u.splice(0,1),i(o.ctx,o.expected,["between",...u])}return{...o,value:o.value[1]}}}function ie(e,n=null){return t=>{let r=[];for(;;){let s=e(t);if(c(s))return n===null||c(n(t))?i(s.ctx,s.expected,["exhaust",...s.history]):l(t,r);if(t=s.ctx,r.push(s.value),s.ctx.index===s.ctx.text.length)return l(s.ctx,r)}}}function p(e,n){return t=>{let r=e(t);if(c(r))return i(r.ctx,r.expected,["map",...r.history]);try{let s=n(r.value);return l(r.ctx,s)}catch{return i(r.ctx,"Error while mapping",["map"])}}}function y(e){return n=>{let t=e(n);return c(t)?l(n,null):t}}function b(e){return n=>{let t=[];for(;;){let r=e(n);if(c(r))return l(n,t);n=r.ctx,t.push(r.value)}}}function de(e,n){return p(y(k(e,n)),t=>t??[])}function k(e,n=void 0){let t=p(f(e,b(n?p(f(n,e),([,r])=>r):e)),([r,s])=>[r,...s]);return r=>{let s=t(r);if(c(s)){let o=[...s.history];return o.splice(0,2),i(s.ctx,s.expected,["oneOrMany",...o])}return s}}function ge(e,n,t){return p(p(f(p(e,r=>[null,r]),b(f(n,e))),([r,s])=>[r,...s]),r=>{let s=r[0][1];for(let o=1;o<r.length;o++)s=t(s,r[o][1],r[o][0]);return s})}function h(e,n){let t=new RegExp(e,typeof e=="string"?"y":e.flags+"y");return r=>{t.lastIndex=r.index;let s=t.exec(r.text);return s!==null&&s.index===r.index?l({...r,index:r.index+s[0].length},s[0]):i(r,n,[n])}}function F(e){let n=`'${e}'`;return Object.assign(t=>t.text.startsWith(e,t.index)?l({...t,index:t.index+e.length},e):i(t,n,[n]),{parserType:"str",match:e})}var E=new Intl.Collator("en",{sensitivity:"accent"});function q(e){let n=e.toLowerCase(),t=`'${n}'`;return Object.assign(r=>{let s=r.text.slice(r.index,r.index+e.length);return E.compare(e,s)==0?l({...r,index:r.index+e.length},n):i(r,t,[t])},{parserType:"stri",match:n})}function Ie(e,n){return t=>{let r=null;for(let s=0;s<=n;s++){let o=e({index:t.index+s,path:t.path,text:t.text});if(c(o))r??=o;else return o}return r}}function Me(e,n){return t=>{let r=null;for(let s=0;s<=n.length;s++){let o=n.slice(0,s),u=e({index:t.index,path:t.path,text:`${t.text.slice(0,t.index)}${o}${t.text.slice(t.index)}`});if(c(u))r??=u;else return u}return r}}var je=h(/ */,"spaces"),ze=h(/ +/,"spaces"),Ne=y(h(/(?:\s|\t|\n|\r)+/,"whitespace characters")),C=h(/true|false/,"boolean"),Qe=p(C,e=>e==="true"),v=h(/\d+/,"integer"),Re=p(v,e=>parseInt(e,10)),j=w(p(f(v,F("."),v),([e,,n])=>`${e}.${n}`),"real"),Be=p(j,e=>parseFloat(e)),De=e=>e.index===e.text.length?l(e,void 0):i(e,"End Of File",["EOF"]);function tr(e,n,t=""){let r=n({text:e,path:t,index:0});if(c(r))throw new d(`Parse error, expected ${[...r.history].pop()} at char ${r.ctx.index}`,e,r.ctx.index,r.history);if(r.ctx.index!==e.length)throw new d(`Parse error, expected end of text at char ${r.ctx.index}`,e,r.ctx.index,[]);return r.value}})();
|
package/dist/parsers/any.js
CHANGED
|
@@ -3,22 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.any = any;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
5
|
const anyString_1 = require("./anyString");
|
|
6
|
-
const
|
|
7
|
-
const optimizableTypes = ['str', 'stri', 'anyString'];
|
|
6
|
+
const optimizations_1 = require("./optimizations");
|
|
8
7
|
function any(...parsers) {
|
|
9
8
|
let marker = {};
|
|
10
|
-
if ((0,
|
|
11
|
-
const
|
|
12
|
-
const matches = optimizableParsers.flatMap(p => {
|
|
13
|
-
switch (p.parserType) {
|
|
14
|
-
case 'anyString':
|
|
15
|
-
return p.matches;
|
|
16
|
-
case 'str':
|
|
17
|
-
return [[p.match, false]];
|
|
18
|
-
case 'stri':
|
|
19
|
-
return [[p.match, true]];
|
|
20
|
-
}
|
|
21
|
-
});
|
|
9
|
+
if ((0, optimizations_1.shouldPerformFusions)() && (0, optimizations_1.allStringParsers)(parsers)) {
|
|
10
|
+
const matches = parsers.flatMap(p => p.matches);
|
|
22
11
|
// Not fusing if not enough matches
|
|
23
12
|
// We do pass the matches forward though, because a parser above may want to fuse
|
|
24
13
|
if (matches.length > 10) {
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { Parser } from "../types";
|
|
2
|
-
|
|
3
|
-
type AnyStringParser<T> = Parser<T> & {
|
|
2
|
+
export type AnyStringParser<T> = Parser<T> & {
|
|
4
3
|
parserType: 'anyString';
|
|
5
4
|
/**
|
|
6
5
|
* if flag is true, match case-insensitive
|
|
7
6
|
*/
|
|
8
|
-
matches: (readonly [string, boolean])[];
|
|
7
|
+
matches: (readonly [string, boolean, (v: string) => unknown])[];
|
|
9
8
|
};
|
|
10
|
-
export type OptimizableStrParser<T> = AnyStringParser<T> | StrParser<T> | StrIParser<T>;
|
|
11
9
|
/**
|
|
12
10
|
* Optimization for `any(str(), str(), ...)` which replaces the parser tree with one parser which tries all strings together
|
|
13
11
|
*/
|
|
14
|
-
export declare function anyString<T
|
|
15
|
-
export {};
|
|
12
|
+
export declare function anyString<T>(matches: (readonly [string, boolean, (v: string) => unknown])[]): AnyStringParser<T>;
|
|
@@ -12,7 +12,7 @@ function anyString(matches) {
|
|
|
12
12
|
tree ??= createSearchTree(matches);
|
|
13
13
|
const result = searchThroughTree(tree, ctx.text, ctx.index);
|
|
14
14
|
if (result) {
|
|
15
|
-
return (0, types_1.success)({ ...ctx, index: result.end }, matches[result.matchIndex][0]);
|
|
15
|
+
return (0, types_1.success)({ ...ctx, index: result.end }, matches[result.matchIndex][2](matches[result.matchIndex][0]));
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
18
|
return (0, types_1.failure)(ctx, lastMatchInQuotes, ['any', lastMatchInQuotes]);
|
|
@@ -27,7 +27,9 @@ function createSearchTree(matches) {
|
|
|
27
27
|
function addMatchToTree(node, match, idIndex, charIndex = 0) {
|
|
28
28
|
if (charIndex >= match[0].length) {
|
|
29
29
|
if (node.matchIndex != undefined) {
|
|
30
|
-
|
|
30
|
+
if (node.matchIndex > idIndex) {
|
|
31
|
+
node.matchIndex = idIndex;
|
|
32
|
+
}
|
|
31
33
|
}
|
|
32
34
|
else {
|
|
33
35
|
node.matchIndex = idIndex;
|
package/dist/parsers/between.js
CHANGED
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.between = between;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
|
-
const seq_1 = require("./seq");
|
|
6
5
|
/** Parses a sequence of three parsers.
|
|
7
6
|
* @returns A parser returning only the middle parser's result.
|
|
8
7
|
*/
|
|
9
8
|
function between(left, parser, right) {
|
|
10
|
-
const sequence = (0, seq_1.seq)(left, parser, right);
|
|
11
9
|
return (ctx) => {
|
|
12
|
-
const
|
|
13
|
-
if ((0, types_1.isFailure)(
|
|
14
|
-
|
|
15
|
-
newHistory.splice(0, 1);
|
|
16
|
-
return (0, types_1.failure)(res.ctx, res.expected, ['between', ...newHistory]);
|
|
10
|
+
const resLeft = left(ctx);
|
|
11
|
+
if ((0, types_1.isFailure)(resLeft)) {
|
|
12
|
+
return resLeft;
|
|
17
13
|
}
|
|
18
|
-
|
|
14
|
+
const resParse = parser(resLeft.ctx);
|
|
15
|
+
if ((0, types_1.isFailure)(resParse)) {
|
|
16
|
+
return resParse;
|
|
17
|
+
}
|
|
18
|
+
const resRight = right(resParse.ctx);
|
|
19
|
+
if ((0, types_1.isFailure)(resRight)) {
|
|
20
|
+
return resRight;
|
|
21
|
+
}
|
|
22
|
+
return (0, types_1.success)(resRight.ctx, resParse.value);
|
|
19
23
|
};
|
|
20
24
|
}
|
package/dist/parsers/many.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Parser } from
|
|
1
|
+
import { Parser } from "../types";
|
|
2
2
|
/** Parses zero or more occurences of the given parser.
|
|
3
3
|
* @returns A parser returning an array of many parses.
|
|
4
4
|
*/
|
|
@@ -6,7 +6,7 @@ export declare function many<T>(parser: Parser<T>): Parser<T[]>;
|
|
|
6
6
|
/** Parses zero or more occurences of the given parser, separated with the separator parser.
|
|
7
7
|
* @returns A parser returning an array of many parses, omitting the separator.
|
|
8
8
|
*/
|
|
9
|
-
export declare function zeroOrMany<T, V>(item: Parser<T>, separator
|
|
9
|
+
export declare function zeroOrMany<T, V>(item: Parser<T>, separator?: Parser<V> | undefined): Parser<T[]>;
|
|
10
10
|
/** Parses one or more occurences of the given parser, separated with the separator parser.
|
|
11
11
|
* @returns A parser returning an array of many parses, omitting the separator.
|
|
12
12
|
*/
|
package/dist/parsers/many.js
CHANGED
|
@@ -5,9 +5,6 @@ exports.zeroOrMany = zeroOrMany;
|
|
|
5
5
|
exports.oneOrMany = oneOrMany;
|
|
6
6
|
exports.oneOrManyRed = oneOrManyRed;
|
|
7
7
|
const types_1 = require("../types");
|
|
8
|
-
const map_1 = require("./map");
|
|
9
|
-
const opt_1 = require("./opt");
|
|
10
|
-
const seq_1 = require("./seq");
|
|
11
8
|
/** Parses zero or more occurences of the given parser.
|
|
12
9
|
* @returns A parser returning an array of many parses.
|
|
13
10
|
*/
|
|
@@ -27,35 +24,104 @@ function many(parser) {
|
|
|
27
24
|
/** Parses zero or more occurences of the given parser, separated with the separator parser.
|
|
28
25
|
* @returns A parser returning an array of many parses, omitting the separator.
|
|
29
26
|
*/
|
|
30
|
-
function zeroOrMany(item, separator) {
|
|
31
|
-
|
|
27
|
+
function zeroOrMany(item, separator = undefined) {
|
|
28
|
+
if (separator) {
|
|
29
|
+
return (ctx) => {
|
|
30
|
+
const results = [];
|
|
31
|
+
const res = item(ctx);
|
|
32
|
+
if ((0, types_1.isFailure)(res)) {
|
|
33
|
+
return (0, types_1.success)(ctx, results);
|
|
34
|
+
}
|
|
35
|
+
ctx = res.ctx;
|
|
36
|
+
results.push(res.value);
|
|
37
|
+
while (true) {
|
|
38
|
+
const resSep = separator(ctx);
|
|
39
|
+
if ((0, types_1.isFailure)(resSep)) {
|
|
40
|
+
return (0, types_1.success)(ctx, results);
|
|
41
|
+
}
|
|
42
|
+
const res = item(resSep.ctx);
|
|
43
|
+
if ((0, types_1.isFailure)(res)) {
|
|
44
|
+
return (0, types_1.success)(ctx, results);
|
|
45
|
+
}
|
|
46
|
+
ctx = res.ctx;
|
|
47
|
+
results.push(res.value);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
return many(item);
|
|
32
53
|
}
|
|
33
54
|
/** Parses one or more occurences of the given parser, separated with the separator parser.
|
|
34
55
|
* @returns A parser returning an array of many parses, omitting the separator.
|
|
35
56
|
*/
|
|
36
57
|
function oneOrMany(item, separator = undefined) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
58
|
+
if (separator) {
|
|
59
|
+
return (ctx) => {
|
|
60
|
+
const results = [];
|
|
61
|
+
const res = item(ctx);
|
|
62
|
+
if ((0, types_1.isFailure)(res))
|
|
63
|
+
return res;
|
|
64
|
+
ctx = res.ctx;
|
|
65
|
+
results.push(res.value);
|
|
66
|
+
while (true) {
|
|
67
|
+
const resSep = separator(ctx);
|
|
68
|
+
if ((0, types_1.isFailure)(resSep)) {
|
|
69
|
+
return (0, types_1.success)(ctx, results);
|
|
70
|
+
}
|
|
71
|
+
const res = item(resSep.ctx);
|
|
72
|
+
if ((0, types_1.isFailure)(res)) {
|
|
73
|
+
return (0, types_1.success)(ctx, results);
|
|
74
|
+
}
|
|
75
|
+
ctx = res.ctx;
|
|
76
|
+
results.push(res.value);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return (ctx) => {
|
|
82
|
+
const results = [];
|
|
83
|
+
const res = item(ctx);
|
|
84
|
+
if ((0, types_1.isFailure)(res))
|
|
85
|
+
return res;
|
|
86
|
+
ctx = res.ctx;
|
|
87
|
+
results.push(res.value);
|
|
88
|
+
while (true) {
|
|
89
|
+
const res = item(ctx);
|
|
90
|
+
if ((0, types_1.isFailure)(res)) {
|
|
91
|
+
return (0, types_1.success)(ctx, results);
|
|
92
|
+
}
|
|
93
|
+
ctx = res.ctx;
|
|
94
|
+
results.push(res.value);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
49
98
|
}
|
|
50
99
|
/** Parses one or more occurences of the given parser, separated with the separator parser.
|
|
51
100
|
* @returns A parser returning the result of many parses, reduced using the `reducer` function passed in.
|
|
52
101
|
*/
|
|
53
102
|
function oneOrManyRed(item, separator, reducer) {
|
|
54
|
-
return (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
103
|
+
return (ctx) => {
|
|
104
|
+
const res = item(ctx);
|
|
105
|
+
if ((0, types_1.isFailure)(res))
|
|
106
|
+
return res;
|
|
107
|
+
ctx = res.ctx;
|
|
108
|
+
let result = res.value;
|
|
109
|
+
while (true) {
|
|
110
|
+
const resSep = separator(ctx);
|
|
111
|
+
if ((0, types_1.isFailure)(resSep)) {
|
|
112
|
+
return (0, types_1.success)(ctx, result);
|
|
113
|
+
}
|
|
114
|
+
const res = item(resSep.ctx);
|
|
115
|
+
if ((0, types_1.isFailure)(res)) {
|
|
116
|
+
return (0, types_1.success)(ctx, result);
|
|
117
|
+
}
|
|
118
|
+
ctx = res.ctx;
|
|
119
|
+
try {
|
|
120
|
+
result = reducer(result, res.value, resSep.value);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return (0, types_1.failure)(res.ctx, 'Error while reducing', ['oneOrManyRed']);
|
|
124
|
+
}
|
|
58
125
|
}
|
|
59
|
-
|
|
60
|
-
});
|
|
126
|
+
};
|
|
61
127
|
}
|
package/dist/parsers/map.js
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.map = map;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
|
+
const optimizations_1 = require("./optimizations");
|
|
5
6
|
/** Parses the input using the given parser, then maps the output.
|
|
6
7
|
* @returns A parser that parses the same input, but has output mapped using the mapping function.
|
|
7
8
|
*/
|
|
8
9
|
function map(parser, mapper) {
|
|
9
|
-
|
|
10
|
+
let marker = {};
|
|
11
|
+
if ((0, optimizations_1.shouldPerformFusions)() && (0, optimizations_1.isStringParser)(parser)) {
|
|
12
|
+
marker = { parserType: 'anyString', matches: parser.matches.map(m => ([m[0], m[1], (v) => mapper(m[2](v))])) };
|
|
13
|
+
}
|
|
14
|
+
return Object.assign((ctx) => {
|
|
10
15
|
const res = parser(ctx);
|
|
11
16
|
if ((0, types_1.isFailure)(res))
|
|
12
17
|
return (0, types_1.failure)(res.ctx, res.expected, ['map', ...res.history]);
|
|
@@ -17,5 +22,5 @@ function map(parser, mapper) {
|
|
|
17
22
|
catch {
|
|
18
23
|
return (0, types_1.failure)(res.ctx, 'Error while mapping', ['map']);
|
|
19
24
|
}
|
|
20
|
-
};
|
|
25
|
+
}, marker);
|
|
21
26
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Parser } from "../types";
|
|
2
|
+
import { AnyStringParser } from "./anyString";
|
|
3
|
+
export declare const shouldPerformFusions: () => boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Disables all parser combinator fusions.
|
|
6
|
+
*
|
|
7
|
+
* Should probably be used only for testing performance.
|
|
8
|
+
*/
|
|
9
|
+
export declare const toggleFusions: (value: boolean) => void;
|
|
10
|
+
export declare function isStringParser<T>(parser: Parser<T>): parser is AnyStringParser<T>;
|
|
11
|
+
export declare function allStringParsers<T>(parsers: Parser<T>[]): parsers is AnyStringParser<T>[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toggleFusions = exports.shouldPerformFusions = void 0;
|
|
4
|
+
exports.isStringParser = isStringParser;
|
|
5
|
+
exports.allStringParsers = allStringParsers;
|
|
6
|
+
const shouldPerformFusions = () => performFusions;
|
|
7
|
+
exports.shouldPerformFusions = shouldPerformFusions;
|
|
8
|
+
let performFusions = true;
|
|
9
|
+
/**
|
|
10
|
+
* Disables all parser combinator fusions.
|
|
11
|
+
*
|
|
12
|
+
* Should probably be used only for testing performance.
|
|
13
|
+
*/
|
|
14
|
+
const toggleFusions = (value) => {
|
|
15
|
+
performFusions = value;
|
|
16
|
+
};
|
|
17
|
+
exports.toggleFusions = toggleFusions;
|
|
18
|
+
function isStringParser(parser) {
|
|
19
|
+
return 'parserType' in parser && typeof parser.parserType === 'string' && parser.parserType === 'anyString';
|
|
20
|
+
}
|
|
21
|
+
function allStringParsers(parsers) {
|
|
22
|
+
return parsers.every(isStringParser);
|
|
23
|
+
}
|
package/dist/parsers/str.d.ts
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import { Parser } from '../types';
|
|
2
|
-
export type StrParser<T> = Parser<T> & {
|
|
3
|
-
parserType: 'str';
|
|
4
|
-
match: T;
|
|
5
|
-
};
|
|
6
2
|
/** Parses a string and returns it as a result of the parse.
|
|
7
3
|
* @returns A parser parsing a given string, case-sensitive.
|
|
8
4
|
*/
|
|
9
|
-
export declare function str<T extends string>(match: T):
|
|
10
|
-
export type StrIParser<T> = Parser<T> & {
|
|
11
|
-
parserType: 'stri';
|
|
12
|
-
match: T;
|
|
13
|
-
};
|
|
5
|
+
export declare function str<T extends string>(match: T): Parser<T>;
|
|
14
6
|
/** Parses a string case-insensitively and returns it as a result of the parse.
|
|
15
7
|
* @returns A parser parsing a given string, case-insensitive.
|
|
16
8
|
*/
|
|
17
|
-
export declare function stri<T extends string>(match: T):
|
|
9
|
+
export declare function stri<T extends string>(match: T): Parser<Lowercase<T>>;
|
package/dist/parsers/str.js
CHANGED
|
@@ -15,7 +15,7 @@ function str(match) {
|
|
|
15
15
|
else {
|
|
16
16
|
return (0, types_1.failure)(ctx, inQuotes, [inQuotes]);
|
|
17
17
|
}
|
|
18
|
-
}, { parserType: '
|
|
18
|
+
}, { parserType: 'anyString', matches: [[match, false, (v) => v]] });
|
|
19
19
|
}
|
|
20
20
|
const collator = new Intl.Collator('en', { sensitivity: 'accent' });
|
|
21
21
|
/** Parses a string case-insensitively and returns it as a result of the parse.
|
|
@@ -32,5 +32,5 @@ function stri(match) {
|
|
|
32
32
|
else {
|
|
33
33
|
return (0, types_1.failure)(ctx, inQuotes, [inQuotes]);
|
|
34
34
|
}
|
|
35
|
-
}, { parserType: '
|
|
35
|
+
}, { parserType: 'anyString', matches: [[lowercase, true, (v) => v]] });
|
|
36
36
|
}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
1
|
import { Parser, Token } from '../types';
|
|
2
|
-
export declare const shouldPerformFusions: () => boolean;
|
|
3
|
-
/**
|
|
4
|
-
* Disables all parser combinator fusions.
|
|
5
|
-
*
|
|
6
|
-
* Should probably be used only for testing performance.
|
|
7
|
-
*/
|
|
8
|
-
export declare const toggleFusions: (value: boolean) => void;
|
|
9
2
|
/** Allows to make a condition on the result of the parsing function.
|
|
10
3
|
* @returns A parser returning the same but also performing a given check on the result.
|
|
11
4
|
*/
|
|
@@ -31,3 +24,7 @@ export declare function token<T>(parser: Parser<T>): Parser<Token<T>>;
|
|
|
31
24
|
* Checks whether the parser parses successfully, but doesn't move the cursor forward
|
|
32
25
|
*/
|
|
33
26
|
export declare function lookaround<T>(parser: Parser<T>): Parser<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Turns a function creating a parser into a parser. Useful for recursive grammars.
|
|
29
|
+
*/
|
|
30
|
+
export declare function lazy<T>(parserGetter: () => Parser<T>): Parser<T>;
|
|
@@ -1,25 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toggleFusions = exports.shouldPerformFusions = void 0;
|
|
4
3
|
exports.ref = ref;
|
|
5
4
|
exports.expect = expect;
|
|
6
5
|
exports.expectErase = expectErase;
|
|
7
6
|
exports.surely = surely;
|
|
8
7
|
exports.token = token;
|
|
9
8
|
exports.lookaround = lookaround;
|
|
9
|
+
exports.lazy = lazy;
|
|
10
10
|
const types_1 = require("../types");
|
|
11
|
-
const shouldPerformFusions = () => performFusions;
|
|
12
|
-
exports.shouldPerformFusions = shouldPerformFusions;
|
|
13
|
-
let performFusions = true;
|
|
14
|
-
/**
|
|
15
|
-
* Disables all parser combinator fusions.
|
|
16
|
-
*
|
|
17
|
-
* Should probably be used only for testing performance.
|
|
18
|
-
*/
|
|
19
|
-
const toggleFusions = (value) => {
|
|
20
|
-
performFusions = value;
|
|
21
|
-
};
|
|
22
|
-
exports.toggleFusions = toggleFusions;
|
|
23
11
|
/** Allows to make a condition on the result of the parsing function.
|
|
24
12
|
* @returns A parser returning the same but also performing a given check on the result.
|
|
25
13
|
*/
|
|
@@ -94,3 +82,13 @@ function lookaround(parser) {
|
|
|
94
82
|
return (0, types_1.failure)(ctx, result.expected, ['lookaround', ...result.history]);
|
|
95
83
|
};
|
|
96
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Turns a function creating a parser into a parser. Useful for recursive grammars.
|
|
87
|
+
*/
|
|
88
|
+
function lazy(parserGetter) {
|
|
89
|
+
let parser;
|
|
90
|
+
return (ctx) => {
|
|
91
|
+
parser ??= parserGetter();
|
|
92
|
+
return parser(ctx);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Parser } from './types';
|
|
2
|
+
/** Parses the given string.
|
|
3
|
+
* @param text The string to parse.
|
|
4
|
+
* @param parser The parser to use.
|
|
5
|
+
* @param path The path of the parsed text. Can be used for error reporting.
|
|
6
|
+
* @returns The result of the parse.
|
|
7
|
+
* @throws {ParseError} if the parsing fails or the parser does not consume the full input.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ParseText<T>(text: string, parser: Parser<T>, path?: string): T;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isFailure, ParseError } from './types';
|
|
2
|
+
/** Parses the given string.
|
|
3
|
+
* @param text The string to parse.
|
|
4
|
+
* @param parser The parser to use.
|
|
5
|
+
* @param path The path of the parsed text. Can be used for error reporting.
|
|
6
|
+
* @returns The result of the parse.
|
|
7
|
+
* @throws {ParseError} if the parsing fails or the parser does not consume the full input.
|
|
8
|
+
*/
|
|
9
|
+
export function ParseText(text, parser, path = '') {
|
|
10
|
+
const res = parser({ text, path, index: 0 });
|
|
11
|
+
if (isFailure(res)) {
|
|
12
|
+
throw new ParseError(`Parse error, expected ${[...res.history].pop()} at char ${res.ctx.index}`, text, res.ctx.index, res.history);
|
|
13
|
+
}
|
|
14
|
+
if (res.ctx.index !== text.length) {
|
|
15
|
+
throw new ParseError(`Parse error, expected end of text at char ${res.ctx.index}`, text, res.ctx.index, []);
|
|
16
|
+
}
|
|
17
|
+
return res.value;
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Parser } from '../types';
|
|
2
|
+
/** Parses the input using any passed parser, trying from left to right.
|
|
3
|
+
* @returns A parser returning the result of the first parser that succeeds, or the failure that has come the furthest.
|
|
4
|
+
*/
|
|
5
|
+
export declare function any<T, U, V, W, X, Z, I, J, K, L, M>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>, Parser<Z>, Parser<I>, Parser<J>, Parser<K>, Parser<L>, Parser<M>]): Parser<T | U | V | W | X | Z | I | J | K | L | M>;
|
|
6
|
+
export declare function any<T, U, V, W, X, Z, I, J, K, L>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>, Parser<Z>, Parser<I>, Parser<J>, Parser<K>, Parser<L>]): Parser<T | U | V | W | X | Z | I | J | K | L>;
|
|
7
|
+
export declare function any<T, U, V, W, X, Z, I, J, K>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>, Parser<Z>, Parser<I>, Parser<J>, Parser<K>]): Parser<T | U | V | W | X | Z | I | J | K>;
|
|
8
|
+
export declare function any<T, U, V, W, X, Z, I, J>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>, Parser<Z>, Parser<I>, Parser<J>]): Parser<T | U | V | W | X | Z | I | J>;
|
|
9
|
+
export declare function any<T, U, V, W, X, Z, I>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>, Parser<Z>, Parser<I>]): Parser<T | U | V | W | X | Z | I>;
|
|
10
|
+
export declare function any<T, U, V, W, X, Z>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>, Parser<Z>]): Parser<T | U | V | W | X | Z>;
|
|
11
|
+
export declare function any<T, U, V, W, X>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>, Parser<X>]): Parser<T | U | V | W | X>;
|
|
12
|
+
export declare function any<T, U, V, W>(...parsers: [Parser<T>, Parser<U>, Parser<V>, Parser<W>]): Parser<T | U | V | W>;
|
|
13
|
+
export declare function any<T, U, V>(...parsers: [Parser<T>, Parser<U>, Parser<V>]): Parser<T | U | V>;
|
|
14
|
+
export declare function any<T, U>(...parsers: [Parser<T>, Parser<U>]): Parser<T | U>;
|
|
15
|
+
export declare function any<T>(...parsers: [Parser<T>]): Parser<T>;
|
|
16
|
+
export declare function any<T>(...parsers: Parser<T>[]): Parser<T>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { failure, isFailure } from '../types';
|
|
2
|
+
import { anyString } from './anyString';
|
|
3
|
+
import { shouldPerformFusions, allStringParsers } from './optimizations';
|
|
4
|
+
export function any(...parsers) {
|
|
5
|
+
let marker = {};
|
|
6
|
+
if (shouldPerformFusions() && allStringParsers(parsers)) {
|
|
7
|
+
const matches = parsers.flatMap(p => p.matches);
|
|
8
|
+
// Not fusing if not enough matches
|
|
9
|
+
// We do pass the matches forward though, because a parser above may want to fuse
|
|
10
|
+
if (matches.length > 10) {
|
|
11
|
+
return anyString(matches);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
marker = { parserType: 'anyString', matches };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return Object.assign((ctx) => {
|
|
18
|
+
const expected = [];
|
|
19
|
+
for (const parser of parsers) {
|
|
20
|
+
const res = parser(ctx);
|
|
21
|
+
if (isFailure(res)) {
|
|
22
|
+
if (res.history.includes('surely')) {
|
|
23
|
+
return failure(res.ctx, res.expected, res.history.filter(h => h !== 'surely'));
|
|
24
|
+
}
|
|
25
|
+
expected.push(res);
|
|
26
|
+
}
|
|
27
|
+
else
|
|
28
|
+
return res;
|
|
29
|
+
}
|
|
30
|
+
const longest = expected.reduce((a, b) => a.history.length > b.history.length ? a : b);
|
|
31
|
+
return failure(longest.ctx, longest.expected, ['any', ...longest.history]);
|
|
32
|
+
}, marker);
|
|
33
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Parser } from "../types";
|
|
2
|
+
export type AnyStringParser<T> = Parser<T> & {
|
|
3
|
+
parserType: 'anyString';
|
|
4
|
+
/**
|
|
5
|
+
* if flag is true, match case-insensitive
|
|
6
|
+
*/
|
|
7
|
+
matches: (readonly [string, boolean, (v: string) => unknown])[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Optimization for `any(str(), str(), ...)` which replaces the parser tree with one parser which tries all strings together
|
|
11
|
+
*/
|
|
12
|
+
export declare function anyString<T>(matches: (readonly [string, boolean, (v: string) => unknown])[]): AnyStringParser<T>;
|