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', 'optional'); 25 26 ast = parseTag`${1}+`; 27 expect(ast).toHaveProperty('sequence.0.type', 'expression'); 28 expect(ast).toHaveProperty('sequence.0.quantifier', 'repeating'); 29 30 ast = parseTag`${1}*`; 31 expect(ast).toHaveProperty('sequence.0.type', 'expression'); 32 expect(ast).toHaveProperty('sequence.0.quantifier', 'multiple'); 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', 'optional'); 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', 'optional'); 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.capturing', false); 71 expect(ast).toHaveProperty('sequence.0.lookahead', null); 72 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1); 73}); 74 75it('supports positive lookahead groups', () => { 76 const ast = parseTag`(?= ${1})`; 77 expect(ast).toHaveProperty('sequence.length', 1); 78 expect(ast).toHaveProperty('sequence.0.type', 'group'); 79 expect(ast).toHaveProperty('sequence.0.capturing', false); 80 expect(ast).toHaveProperty('sequence.0.lookahead', 'positive'); 81 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1); 82}); 83 84it('supports negative lookahead groups', () => { 85 const ast = parseTag`(?! ${1})`; 86 expect(ast).toHaveProperty('sequence.length', 1); 87 expect(ast).toHaveProperty('sequence.0.type', 'group'); 88 expect(ast).toHaveProperty('sequence.0.capturing', false); 89 expect(ast).toHaveProperty('sequence.0.lookahead', 'negative'); 90 expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1); 91}); 92 93it('supports groups with alternates', () => { 94 expect(parseTag`(${1} | ${2}) ${3}`).toMatchInlineSnapshot(` 95 Object { 96 "alternation": null, 97 "sequence": Array [ 98 Object { 99 "capturing": true, 100 "lookahead": null, 101 "quantifier": null, 102 "sequence": Object { 103 "alternation": Object { 104 "alternation": null, 105 "sequence": Array [ 106 Object { 107 "expression": 2, 108 "quantifier": null, 109 "type": "expression", 110 }, 111 ], 112 "type": "sequence", 113 }, 114 "sequence": Array [ 115 Object { 116 "expression": 1, 117 "quantifier": null, 118 "type": "expression", 119 }, 120 ], 121 "type": "sequence", 122 }, 123 "type": "group", 124 }, 125 Object { 126 "expression": 3, 127 "quantifier": null, 128 "type": "expression", 129 }, 130 ], 131 "type": "sequence", 132 } 133 `); 134});