"use strict"; let parseableString = "MAGIC[4]toot[5]hello[5]world[1]!END"; let chunk1 = parseableString.slice(0, 10); let chunk2 = parseableString.slice(10); // FIXME: bytes // FIXME: emit for streaming parse? instead of return at the end // FIXME: How to deal with eg. regexes when the match extends beyond the buffer? function* Root() { yield "MAGIC"; let items = yield repeat(Item); yield "END"; yield EndOfInput; return items; } function* Item() { yield "["; let length = yield Integer(); yield "]"; let contents = yield read(length); return contents; } function* Integer() { // FIXME: auto anchor let [ match ] = yield /[0-9]+/; return parseInt(match); } function* parseByte(context) { let position = context.position; // FIXME: detect end context.position += 1; return context.input[position]; } function* parseBytes(context, length) { let bytes = Buffer.alloc(length); for (let i = 0; i < length; i++) { bytes[i] = parseByte(context); // FIXME } return bytes; } // TODO: parseBytesUntil, parseStringUntil? or a generic toString wrapper function instead? function* parseString(context, length) { }