Something went wrong. Try again.
Mirror: The magical sticky regex-based parser generator 🧙
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129import { parse } from './parser';
const parseTag = (quasis, ...expressions) => parse(quasis, expressions);
it('supports parsing expressions with quantifiers', () => { let ast;
ast = parseTag`${1}?`; expect(ast).toHaveProperty('0.quantifier', '?');
ast = parseTag`${1}+`; expect(ast).toHaveProperty('0.quantifier', '+');
ast = parseTag`${1}*`; expect(ast).toHaveProperty('0.quantifier', '*');});
it('supports top-level alternations', () => { let ast;
ast = parseTag`${1} | ${2}`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.expression', 1); expect(ast).toHaveProperty('alternation.0.expression', 2);
ast = parseTag`${1}? | ${2}?`; expect(ast).toHaveProperty('0.quantifier', '?');});
it('supports groups with quantifiers', () => { let ast;
ast = parseTag`(${1} ${2})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.sequence.length', 2); expect(ast).toHaveProperty('0.sequence.0.expression', 1); expect(ast).toHaveProperty('0.sequence.1.expression', 2);
ast = parseTag`(${1} ${2}?)?`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.quantifier', '?'); expect(ast).toHaveProperty('0.sequence.0.quantifier', undefined);});
describe('non-capturing syntax', () => { it('supports regex-like syntax', () => { const ast = parseTag`(?: ${1})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', ':'); expect(ast).toHaveProperty('0.sequence.length', 1); });
it('supports shorthand', () => { let ast = parseTag`:${1}`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', ':'); expect(ast).toHaveProperty('0.expression', 1); ast = parseTag`:(${1})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', ':'); expect(ast).toHaveProperty('0.sequence.length', 1); });
it('fails on invalid usage', () => { expect(() => parseTag`${1} : ${2}`).toThrow(); expect(() => parseTag`${1} :|${2}`).toThrow(); });});
describe('positive lookaheads syntax', () => { it('supports regex-like syntax', () => { const ast = parseTag`(?= ${1})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', '='); expect(ast).toHaveProperty('0.sequence.length', 1); });
it('supports shorthand', () => { let ast = parseTag`=${1}`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', '='); expect(ast).toHaveProperty('0.expression', 1); ast = parseTag`=(${1})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', '='); expect(ast).toHaveProperty('0.sequence.length', 1); });});
describe('negative lookaheads syntax', () => { it('supports regex-like syntax', () => { const ast = parseTag`(?! ${1})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', '!'); expect(ast).toHaveProperty('0.sequence.length', 1); });
it('supports shorthand', () => { let ast = parseTag`!${1}`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', '!'); expect(ast).toHaveProperty('0.expression', 1); ast = parseTag`!(${1})`; expect(ast).toHaveProperty('length', 1); expect(ast).toHaveProperty('0.capture', '!'); expect(ast).toHaveProperty('0.sequence.length', 1); });});
it('supports groups with alternates', () => { expect(parseTag`(${1} | ${2}) ${3}`).toMatchInlineSnapshot(` Array [ Object { "capture": undefined, "sequence": Array [ Object { "capture": undefined, "expression": 1, }, ], }, Object { "capture": undefined, "expression": 3, }, ] `);});