Mirror: The magical sticky regex-based parser generator 🧙

Fix empty matches being impossible at end of input

Changed files
+11 -7
src
+6 -7
src/core.js
···
const execString = (pattern) => {
return (state) => {
-
const input = state.quasis[state.x];
-
if (input && state.y < input.length) {
+
if (state.x < state.quasis.length) {
+
const input = state.quasis[state.x];
for (let i = 0, l = pattern.length; i < l; i++)
if (input.charCodeAt(state.y + i) !== pattern.charCodeAt(i))
return null;
···
? new RegExp(pattern.source, 'y')
: new RegExp(pattern.source + '|()', 'g');
return (state) => {
-
const input = state.quasis[state.x];
-
if (input && state.y < input.length) {
+
if (state.x < state.quasis.length) {
+
const input = state.quasis[state.x];
pattern.lastIndex = state.y;
-
let match;
if (isStickySupported) {
if (pattern.test(input))
···
let match;
if (
-
state.y >= state.quasis[state.x].length &&
-
state.x < state.expressions.length
+
state.x < state.expressions.length &&
+
state.y >= state.quasis[state.x].length
) {
state.y = 0;
match = state.expressions[state.x++];
+5
src/core.test.js
···
`('should return $result when $input is passed', ({ input, result }) => {
expectToParse(node, input, result);
});
+
+
it('matches empty regex patterns', () => {
+
const node = match('node')`${/[ ]*/}`;
+
expectToParse(node, '', ['']);
+
});
});
describe('optional matcher', () => {