Mirror: The magical sticky regex-based parser generator 馃
at v1.0.1 1.1 kB view raw
1const isStickySupported = typeof /./g.sticky === 'boolean'; 2 3export const _pattern = (input) => { 4 if (typeof input === 'function') return input; 5 6 const source = typeof input !== 'string' ? input.source : input; 7 return isStickySupported 8 ? new RegExp(source, 'y') 9 : new RegExp(`^(?:${source})`, 'g'); 10}; 11 12export const _exec = (state, pattern) => { 13 if (typeof pattern === 'function') return pattern(); 14 15 let match; 16 if (isStickySupported) { 17 pattern.lastIndex = state.index; 18 match = pattern.exec(state.input); 19 state.index = pattern.lastIndex; 20 } else { 21 pattern.lastIndex = 0; 22 match = pattern.exec(state.input.slice(state.input)); 23 state.index += pattern.lastIndex; 24 } 25 26 return match && match[0]; 27}; 28 29export const tag = (array, tag) => { 30 array.tag = tag; 31 return array; 32}; 33 34export const parse = (pattern) => (input) => { 35 const state = { input, index: 0 }; 36 return pattern(state); 37}; 38 39export const match = (_name) => { 40 throw new TypeError( 41 'This match() function was not transformed. ' + 42 'Ensure that the Babel plugin is set up correctly and try again.' 43 ); 44};