Mirror: The magical sticky regex-based parser generator 🧙

Remove type fields from AST output

Changed files
+8 -46
src
+1 -3
src/codegen.js
···
};
const astChild = (ast, depth, opts) =>
-
ast.type === 'expression'
-
? astExpression(ast, depth, opts)
-
: astGroup(ast, depth, opts);
+
ast.expression ? astExpression(ast, depth, opts) : astGroup(ast, depth, opts);
const astRepeating = (ast, depth, opts) => {
const label = `loop_${depth}`;
+1 -14
src/parser.js
···
const sequenceStack = [];
const rootSequence = {
-
type: 'sequence',
sequence: [],
-
alternation: null,
};
let currentGroup = null;
···
while (stackIndex < quasis.length + expressions.length) {
if (stackIndex % 2 !== 0) {
-
const expression = expressions[stackIndex++ >> 1];
-
currentSequence.sequence.push({
-
type: 'expression',
-
expression,
-
quantifier: null,
+
expression: expressions[stackIndex++ >> 1],
});
}
···
continue;
} else if (char === '|' && currentSequence.sequence.length > 0) {
currentSequence = currentSequence.alternation = {
-
type: 'sequence',
sequence: [],
-
alternation: null,
};
continue;
···
if (currentSequence) continue;
} else if (char === '(') {
currentGroup = {
-
type: 'group',
sequence: {
-
type: 'sequence',
sequence: [],
-
alternation: null,
},
-
capture: null,
-
quantifier: null,
};
sequenceStack.push(currentSequence);
+6 -29
src/parser.test.js
···
it('supports parsing expressions', () => {
expect(parseTag`${1}`).toEqual({
-
type: 'sequence',
sequence: [
{
-
type: 'expression',
expression: 1,
-
quantifier: null,
+
quantifier: undefined,
},
],
-
alternation: null,
+
alternation: undefined,
});
});
···
let ast;
ast = parseTag`${1}?`;
-
expect(ast).toHaveProperty('sequence.0.type', 'expression');
expect(ast).toHaveProperty('sequence.0.quantifier', '?');
ast = parseTag`${1}+`;
-
expect(ast).toHaveProperty('sequence.0.type', 'expression');
expect(ast).toHaveProperty('sequence.0.quantifier', '+');
ast = parseTag`${1}*`;
-
expect(ast).toHaveProperty('sequence.0.type', 'expression');
expect(ast).toHaveProperty('sequence.0.quantifier', '*');
});
···
ast = parseTag`${1} | ${2}`;
expect(ast).toHaveProperty('sequence.length', 1);
-
expect(ast).toHaveProperty('sequence.0.type', 'expression');
expect(ast).toHaveProperty('sequence.0.expression', 1);
-
expect(ast).toHaveProperty('alternation.type', 'sequence');
expect(ast).toHaveProperty('alternation.sequence.0.expression', 2);
ast = parseTag`${1}? | ${2}?`;
···
ast = parseTag`(${1} ${2})`;
expect(ast).toHaveProperty('sequence.length', 1);
-
expect(ast).toHaveProperty('sequence.0.type', 'group');
expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 2);
expect(ast).toHaveProperty('sequence.0.sequence.sequence.0.expression', 1);
expect(ast).toHaveProperty('sequence.0.sequence.sequence.1.expression', 2);
ast = parseTag`(${1} ${2}?)?`;
expect(ast).toHaveProperty('sequence.length', 1);
-
expect(ast).toHaveProperty('sequence.0.type', 'group');
expect(ast).toHaveProperty('sequence.0.quantifier', '?');
-
expect(ast).toHaveProperty('sequence.0.sequence.sequence.0.quantifier', null);
+
expect(ast).toHaveProperty(
+
'sequence.0.sequence.sequence.0.quantifier',
+
undefined
+
);
});
it('supports non-capturing groups', () => {
const ast = parseTag`(?: ${1})`;
expect(ast).toHaveProperty('sequence.length', 1);
-
expect(ast).toHaveProperty('sequence.0.type', 'group');
expect(ast).toHaveProperty('sequence.0.capture', ':');
expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
});
···
it('supports positive lookahead groups', () => {
const ast = parseTag`(?= ${1})`;
expect(ast).toHaveProperty('sequence.length', 1);
-
expect(ast).toHaveProperty('sequence.0.type', 'group');
expect(ast).toHaveProperty('sequence.0.capture', '=');
expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
});
···
it('supports negative lookahead groups', () => {
const ast = parseTag`(?! ${1})`;
expect(ast).toHaveProperty('sequence.length', 1);
-
expect(ast).toHaveProperty('sequence.0.type', 'group');
expect(ast).toHaveProperty('sequence.0.capture', '!');
expect(ast).toHaveProperty('sequence.0.sequence.sequence.length', 1);
});
···
it('supports groups with alternates', () => {
expect(parseTag`(${1} | ${2}) ${3}`).toMatchInlineSnapshot(`
Object {
-
"alternation": null,
"sequence": Array [
Object {
-
"capture": null,
-
"quantifier": null,
"sequence": Object {
"alternation": Object {
-
"alternation": null,
"sequence": Array [
Object {
"expression": 2,
-
"quantifier": null,
-
"type": "expression",
},
],
-
"type": "sequence",
},
"sequence": Array [
Object {
"expression": 1,
-
"quantifier": null,
-
"type": "expression",
},
],
-
"type": "sequence",
},
-
"type": "group",
},
Object {
"expression": 3,
-
"quantifier": null,
-
"type": "expression",
},
],
-
"type": "sequence",
}
`);
});