// Generated by LiveScript 1.2.0 (function(){ var reject, special, tokenRegex; reject = require('prelude-ls').reject; function consumeOp(tokens, op){ if (tokens[0] === op) { return tokens.shift(); } else { throw new Error("Expected '" + op + "', but got '" + tokens[0] + "' instead in " + JSON.stringify(tokens) + "."); } } function maybeConsumeOp(tokens, op){ if (tokens[0] === op) { return tokens.shift(); } } function consumeList(tokens, delimiters, hasDelimiters){ var result; if (hasDelimiters) { consumeOp(tokens, delimiters[0]); } result = []; while (tokens.length && tokens[0] !== delimiters[1]) { result.push(consumeElement(tokens)); maybeConsumeOp(tokens, ','); } if (hasDelimiters) { consumeOp(tokens, delimiters[1]); } return result; } function consumeArray(tokens, hasDelimiters){ return consumeList(tokens, ['[', ']'], hasDelimiters); } function consumeTuple(tokens, hasDelimiters){ return consumeList(tokens, ['(', ')'], hasDelimiters); } function consumeFields(tokens, hasDelimiters){ var result, key; if (hasDelimiters) { consumeOp(tokens, '{'); } result = {}; while (tokens.length && (!hasDelimiters || tokens[0] !== '}')) { key = tokens.shift(); consumeOp(tokens, ':'); result[key] = consumeElement(tokens); maybeConsumeOp(tokens, ','); } if (hasDelimiters) { consumeOp(tokens, '}'); } return result; } function consumeElement(tokens){ switch (tokens[0]) { case '[': return consumeArray(tokens, true); case '(': return consumeTuple(tokens, true); case '{': return consumeFields(tokens, true); default: return tokens.shift(); } } function consumeTopLevel(tokens, types){ var ref$, type, structure, origTokens, result, finalResult, x$, y$; ref$ = types[0], type = ref$.type, structure = ref$.structure; origTokens = tokens.concat(); if (types.length === 1 && (structure || (type === 'Array' || type === 'Object'))) { result = structure === 'array' || type === 'Array' ? consumeArray(tokens, tokens[0] === '[') : structure === 'tuple' ? consumeTuple(tokens, tokens[0] === '(') : consumeFields(tokens, tokens[0] === '{'); finalResult = tokens.length ? consumeElement(structure === 'array' || type === 'Array' ? (x$ = origTokens, x$.unshift('['), x$.push(']'), x$) : (y$ = origTokens, y$.unshift('('), y$.push(')'), y$)) : result; } else { finalResult = consumeElement(tokens); } if (tokens.length && origTokens.length) { throw new Error("Unable to parse " + JSON.stringify(origTokens) + " of type " + JSON.stringify(types) + "."); } else { return finalResult; } } special = /\[\]\(\)}{:,/.source; tokenRegex = RegExp('("(?:[^"]|\\\\")*")|(\'(?:[^\']|\\\\\')*\')|(#.*#)|(/(?:\\\\/|[^/])*/[gimy]*)|([' + special + '])|([^\\s' + special + ']+)|\\s*'); module.exports = function(string, types){ var tokens, node; tokens = reject(function(it){ return !it || /^\s+$/.test(it); }, string.split(tokenRegex)); node = consumeTopLevel(tokens, types); if (!node) { throw new Error("Error parsing '" + string + "'."); } return node; }; }).call(this);