{ function makeIdFilter(ids) { return { type: 'id_filter', ids: ids.flat(), reconstruct: function() { return this.ids.join(','); } }; } } Filter = first:(IdRange / SingleId) rest:("," (IdRange / SingleId))* { return makeIdFilter([first, ...rest.map(r => r[1])]); } IdRange = start:Integer "-" end:Integer { const ids = []; for (let i = start; i <= end; i++) { ids.push(i); } return ids; } SingleId = id:Integer { return [id]; } Integer = digits:[0-9]+ { return parseInt(digits.join(''), 10); }