Mirror: The magical sticky regex-based parser generator 馃
1import { parse } from './parser'; 2 3const parseTag = (quasis, ...expressions) => parse(quasis, expressions); 4 5it('supports parsing expressions', () => { 6 expect(parseTag`${1}`).toEqual({ 7 type: 'sequence', 8 sequence: [ 9 { 10 type: 'expression', 11 expression: 1, 12 quantifier: null, 13 }, 14 ], 15 alternation: null, 16 }); 17}); 18 19it('supports parsing expressions with quantifiers', () => { 20 let ast; 21 22 ast = parseTag`${1}?`; 23 expect(ast).toHaveProperty('sequence.0.type', 'expression'); 24 expect(ast).toHaveProperty('sequence.0.quantifier', '?'); 25 26 ast = parseTag`${1}+`; 27 expect(ast).toHaveProperty('sequence.0.type', 'expression'); 28 expect(ast).toHaveProperty('sequence.0.quantifier', '+'); 29 30 ast = parseTag`${1}*`; 31 expect(ast).toHaveProperty('sequence.0.type', 'expression'); 32 expect(ast).toHaveProperty('sequence.0.quantifier', '*'); 33}); 34 35it('supports top-level alternations', () => { 36 let ast; 37 38 ast = parseTag`${1} | ${2}`; 39 expect(ast).toHaveProperty('sequence.length', 1); 40 expect(ast).toHaveProperty('sequence.0.type', 'expression'); 41 expect(ast).toHaveProperty('sequence.0.expression', 1); 42 expect(ast).toHaveProperty('alternation.type', 'sequence'); 43 expect(ast).toHaveProperty('alternation.sequence.0.expression', 2); 44 45 ast = parseTag`${1}? | ${2}?`; 46 expect(ast).toHaveProperty('sequence.0.quantifier', '?'); 47}); 48 49it('supports groups with quantifiers', () => { 50 let ast; 51 52 ast = parseTag`(${1} ${2})`; 53 expect(ast).toHaveProperty('sequence.length', 1); 54 expect(ast).toHaveProperty('sequence.0.type', 'group'); 55 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 2); 56 expect(ast).toHaveProperty('sequence.0.sequence.sequence.0.expression', 1); 57 expect(ast).toHaveProperty('sequence.0.sequence.sequence.1.expression', 2); 58 59 ast = parseTag`(${1} ${2}?)?`; 60 expect(ast).toHaveProperty('sequence.length', 1); 61 expect(ast).toHaveProperty('sequence.0.type', 'group'); 62 expect(ast).toHaveProperty('sequence.0.quantifier', '?'); 63 expect(ast).toHaveProperty('sequence.0.sequence.sequence.0.quantifier', null); 64}); 65 66it('supports non-capturing groups', () => { 67 const ast = parseTag`(?: ${1})`; 68 expect(ast).toHaveProperty('sequence.length', 1); 69 expect(ast).toHaveProperty('sequence.0.type', 'group'); 70 expect(ast).toHaveProperty('sequence.0.capture', ':'); 71 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1); 72}); 73 74it('supports positive lookahead groups', () => { 75 const ast = parseTag`(?= ${1})`; 76 expect(ast).toHaveProperty('sequence.length', 1); 77 expect(ast).toHaveProperty('sequence.0.type', 'group'); 78 expect(ast).toHaveProperty('sequence.0.capture', '='); 79 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1); 80}); 81 82it('supports negative lookahead groups', () => { 83 const ast = parseTag`(?! ${1})`; 84 expect(ast).toHaveProperty('sequence.length', 1); 85 expect(ast).toHaveProperty('sequence.0.type', 'group'); 86 expect(ast).toHaveProperty('sequence.0.capture', '!'); 87 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1); 88}); 89 90it('supports groups with alternates', () => { 91 expect(parseTag`(${1} | ${2}) ${3}`).toMatchInlineSnapshot(` 92 Object { 93 "alternation": null, 94 "sequence": Array [ 95 Object { 96 "capture": null, 97 "quantifier": null, 98 "sequence": Object { 99 "alternation": Object { 100 "alternation": null, 101 "sequence": Array [ 102 Object { 103 "expression": 2, 104 "quantifier": null, 105 "type": "expression", 106 }, 107 ], 108 "type": "sequence", 109 }, 110 "sequence": Array [ 111 Object { 112 "expression": 1, 113 "quantifier": null, 114 "type": "expression", 115 }, 116 ], 117 "type": "sequence", 118 }, 119 "type": "group", 120 }, 121 Object { 122 "expression": 3, 123 "quantifier": null, 124 "type": "expression", 125 }, 126 ], 127 "type": "sequence", 128 } 129 `); 130});