@finnair/path-parser
Version:
Simple object path as array of strings and numbers
60 lines (59 loc) • 3.07 kB
JavaScript
// Based on a grammar that was automatically generated by nearley, version 2.19.2
import * as matchers from '@finnair/path';
import moo from 'moo';
const lexer = moo.compile({
qString: /'(?:\\["bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*?'/,
qqString: /"(?:\\["bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*?"/,
integer: /[0-9]+/,
property: /[a-zA-Z_][a-zA-Z0-9_]*/,
'*': '*',
$: '$',
'[': '[',
']': ']',
'.': '.',
',': ',',
});
function handleQString(qString) {
return JSON.parse('"' + qString.substring(1, qString.length - 1) + '"');
}
const grammar = {
Lexer: lexer,
ParserRules: [
{ name: 'Path$ebnf$1', symbols: [] },
{ name: 'Path$ebnf$1', symbols: ['Path$ebnf$1', 'PathExpression'], postprocess: d => d[0].concat([d[1]]) },
{ name: 'Path', symbols: [{ literal: '$' }, 'Path$ebnf$1'], postprocess: d => d[1].reduce((result, matcher) => result.concat(matcher), []) },
{ name: 'PathExpression', symbols: [{ literal: '.' }, 'PropertyExpression'], postprocess: d => d[1] },
{ name: 'PathExpression', symbols: [{ literal: '[' }, 'IndexExpression', { literal: ']' }], postprocess: d => d[1] },
{ name: 'PathExpression', symbols: [{ literal: '[' }, 'UnionExpression', { literal: ']' }], postprocess: d => new matchers.UnionMatcher(d[1]) },
{ name: 'PropertyExpression', symbols: [{ literal: '*' }], postprocess: d => matchers.AnyProperty },
{
name: 'PropertyExpression',
symbols: [{ type: 'property' }],
postprocess: d => new matchers.PropertyMatcher(d[0].value),
},
{
name: 'IndexExpression',
symbols: [{ type: 'integer' }],
postprocess: d => new matchers.IndexMatcher(parseInt(d[0].value)),
},
{
name: 'IndexExpression',
symbols: [{ type: 'qqString' }],
postprocess: d => new matchers.PropertyMatcher(JSON.parse(d[0].value)),
},
{
name: 'IndexExpression',
symbols: [{ type: 'qString' }],
postprocess: d => new matchers.PropertyMatcher(handleQString(d[0].value)),
},
{ name: 'IndexExpression', symbols: [{ literal: '*' }], postprocess: d => matchers.AnyIndex },
{ name: 'UnionExpression', symbols: ['ComponentExpression', { literal: ',' }, 'ComponentExpression'], postprocess: d => [d[0], d[2]] },
{ name: 'UnionExpression', symbols: ['ComponentExpression', { literal: ',' }, 'UnionExpression'], postprocess: d => [d[0], ...d[2]] },
{ name: 'ComponentExpression', symbols: [{ type: 'integer' }], postprocess: d => parseInt(d[0].value) },
{ name: 'ComponentExpression', symbols: [{ type: 'property' }], postprocess: d => d[0].value },
{ name: 'ComponentExpression', symbols: [{ type: 'qqString' }], postprocess: d => JSON.parse(d[0].value) },
{ name: 'ComponentExpression', symbols: [{ type: 'qString' }], postprocess: d => handleQString(d[0].value) },
],
ParserStart: 'Path',
};
export default grammar;