start = ws head:segment tail:segmentTail* { tail.unshift(head); return tail; } segmentTail = ws ',' ws seg:segment { return seg; } segment = str:string { return {string: str}; } / v:identifier size:size ? specs:specifierList ? { return {name: v, size: size, specifiers: specs}; } / v:number size:size ? specs:specifierList ? { return {value: v, size: size, specifiers: specs}; } string = '"' '"' { return ""; } / '"' chars:chars '"' { return chars; } /* From JSON example https://github.com/dmajda/pegjs/blob/master/examples/json.pegjs */ chars = chars:char+ { return chars.join(""); } char = [^"\\\0-\x1F\x7f] / '\\"' { return '"'; } / "\\\\" { return "\\"; } / "\\/" { return "/"; } / "\\b" { return "\b"; } / "\\f" { return "\f"; } / "\\n" { return "\n"; } / "\\r" { return "\r"; } / "\\t" { return "\t"; } / "\\u" h1:hexDigit h2:hexDigit h3:hexDigit h4:hexDigit { return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); } hexDigit = [0-9a-fA-F] identifier = (head:[_a-zA-Z] tail:[_a-zA-Z0-9]*) { return head + tail.join(''); } number = '0' { return 0; } / head:[1-9] tail:[0-9]* { return parseInt(head + tail.join('')); } size = ':' num:number { return num; } / ':' id:identifier { return id; } specifierList = '/' head:specifier tail:specifierTail* { tail.unshift(head); return tail; } specifierTail = '-' spec:specifier { return spec; } specifier = 'little' / 'big' / 'signed' / 'unsigned' / 'integer' / 'binary' / 'float' / unit unit = 'unit:' num:number { return 'unit:' + num; } ws = [ \t\n]*