blob: e96023bfeaa8f98894d52f7d4fb88db948709cb0 [file] [log] [blame]
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]*