start = deriveTag value = deriveTag / array / tuple / string multipleItems = item:value subsequentItems:("," value)* { return [item].concat(subsequentItems.map(subsequentItem => subsequentItem[1])); } deriveTag = "Derive(" items:multipleItems ")" { return {type: "deriveTag", items: items}; } array = "[" items:multipleItems "]" { return {type: "array", items: items}; } tuple = "(" items:multipleItems ")" { return {type: "tuple", items: items}; } string = '"' chars:stringCharacter* '"' { return chars.join(""); } stringCharacter = !('"' / "\\") char:. { return char; } / stringEscapedQuote { return '"'; } stringEscapedQuote = '\\"'