From 4ea5b79f3f535f6940027dd6aec735ff2d8b8dcc Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Mon, 11 Jul 2016 12:06:07 -0400 Subject: [PATCH] Update --- dist/syndicatecompiler.js | 927 ++++++++++-------- dist/syndicatecompiler.min.js | 14 +- examples/location/index.expanded.js | 26 +- examples/todo/index.expanded.js | 113 ++- examples/two-buyer-protocol/.gitignore | 2 + examples/two-buyer-protocol/Makefile | 12 + examples/two-buyer-protocol/index.expanded.js | 306 ++++++ examples/two-buyer-protocol/index.js | 318 ++++++ examples/two-buyer-protocol/index.md | 318 ++++++ 9 files changed, 1553 insertions(+), 483 deletions(-) create mode 100644 examples/two-buyer-protocol/.gitignore create mode 100644 examples/two-buyer-protocol/Makefile create mode 100644 examples/two-buyer-protocol/index.expanded.js create mode 100644 examples/two-buyer-protocol/index.js create mode 100644 examples/two-buyer-protocol/index.md diff --git a/dist/syndicatecompiler.js b/dist/syndicatecompiler.js index dfb7656..846a5e7 100644 --- a/dist/syndicatecompiler.js +++ b/dist/syndicatecompiler.js @@ -143,7 +143,7 @@ var modifiedSourceActions = { return (init ? init.asES5 : '') + situations.asES5.join('') + (done ? done.asES5 : ''); }, FacetStateTransitionBlock: function(_leftParen, transitions, _rightParen) { - return transitions.asES5; + return transitions.asES5.join(''); }, FacetInitBlock: function(_init, block) { @@ -240,7 +240,7 @@ function buildSubscription(children, patchMethod, mode, whenClause, cachedAssert if (cachedAssertionVar) { fragments.push(cachedAssertionVar); } else { - children.forEach(function (c) { c.buildSubscription(fragments, mode); }); + children.forEach(function (c) { fragments.push(c.buildSubscription(mode)); }); } if (patchMethod) { fragments.push(', '); @@ -270,7 +270,7 @@ semantics.addAttribute('instantiatedAssertion', { _default: function(children) { var fragments = []; fragments.push('(function() { var _ = Syndicate.__; return '); - children.forEach(function (c) { c.buildSubscription(fragments, 'instantiated'); }); + children.forEach(function (c) { fragments.push(c.buildSubscription('instantiated')); }); fragments.push('; })()'); return fragments.join(''); } @@ -309,43 +309,41 @@ semantics.addAttribute('metalevel', { } }); -semantics.addOperation('buildSubscription(acc,mode)', { +semantics.addOperation('buildSubscription(mode)', { FacetEventPattern_messageEvent: function(_kw, pattern) { - pattern.buildSubscription(this.args.acc, this.args.mode); + return pattern.buildSubscription(this.args.mode); }, FacetEventPattern_assertedEvent: function(_kw, pattern) { - pattern.buildSubscription(this.args.acc, this.args.mode); + return pattern.buildSubscription(this.args.mode); }, FacetEventPattern_retractedEvent: function(_kw, pattern) { - pattern.buildSubscription(this.args.acc, this.args.mode); + return pattern.buildSubscription(this.args.mode); }, FacetTransitionEventPattern_facetEvent: function (pattern) { - pattern.buildSubscription(this.args.acc, this.args.mode); + return pattern.buildSubscription(this.args.mode); }, FacetPattern: function (v) { - v.children[0].buildSubscription(this.args.acc, this.args.mode); // both branches! + return v.children[0].buildSubscription(this.args.mode); // both branches! }, AssignmentExpression_assignment: function (lhsExpr, _assignmentOperator, rhsExpr) { var i = lhsExpr.interval.contents; if (i[0] === '$' && i.length > 1) { switch (this.args.mode) { - case 'pattern': rhsExpr.buildSubscription(this.args.acc, this.args.mode); break; - case 'instantiated': lhsExpr.buildSubscription(this.args.acc, this.args.mode); break; - case 'projection': { - this.args.acc.push('(Syndicate._$(' + JSON.stringify(i.slice(1)) + ','); - rhsExpr.buildSubscription(this.args.acc, this.args.mode); - this.args.acc.push('))'); - break; - } + case 'pattern': return rhsExpr.buildSubscription(this.args.mode); + case 'instantiated': return lhsExpr.buildSubscription(this.args.mode); + case 'projection': + return '(Syndicate._$(' + JSON.stringify(i.slice(1)) + ',' + + rhsExpr.buildSubscription(this.args.mode) + + '))'; default: throw new Error('Unexpected buildSubscription mode ' + this.args.mode); } } else { - lhsExpr.buildSubscription(this.args.acc, this.args.mode); - _assignmentOperator.buildSubscription(this.args.acc, this.args.mode); - rhsExpr.buildSubscription(this.args.acc, this.args.mode); + return lhsExpr.buildSubscription(this.args.mode) + + _assignmentOperator.buildSubscription(this.args.mode) + + rhsExpr.buildSubscription(this.args.mode); } }, @@ -353,23 +351,24 @@ semantics.addOperation('buildSubscription(acc,mode)', { var i = this.interval.contents; if (i[0] === '$' && i.length > 1) { switch (this.args.mode) { - case 'pattern': this.args.acc.push('_'); break; - case 'instantiated': this.args.acc.push(i.slice(1)); break; - case 'projection': this.args.acc.push('(Syndicate._$(' + JSON.stringify(i.slice(1)) + '))'); break; + case 'pattern': return '_'; + case 'instantiated': return i.slice(1); + case 'projection': return '(Syndicate._$(' + JSON.stringify(i.slice(1)) + '))'; default: throw new Error('Unexpected buildSubscription mode ' + this.args.mode); } } else { - this.args.acc.push(i); + return i; } }, _terminal: function() { - this.args.acc.push(this.interval.contents); + return undefined; }, _nonterminal: function(children) { var self = this; - forEachChild(children, function (c) { - c.buildSubscription(self.args.acc, self.args.mode); - }); + return ES5.translateNonterminalCode(children, + function(n) { + return n.buildSubscription(self.args.mode); + }); } }); @@ -460,28 +459,33 @@ function compareByInterval(node, otherNode) { return node.interval.startIdx - otherNode.interval.startIdx; } +function translateNonterminalCode(children, nodeTranslator) { + var flatChildren = flattenIterNodes(children).sort(compareByInterval); + var childResults = flatChildren.map(nodeTranslator); + if (flatChildren.length === 0 || childResults.every(isUndefined)) { + return undefined; + } + var code = ''; + var interval = flatChildren[0].interval.collapsedLeft(); + for (var i = 0; i < flatChildren.length; ++i) { + if (childResults[i] == null) { + // Grow the interval to include this node. + interval = interval.coverageWith(flatChildren[i].interval.collapsedRight()); + } else { + interval = interval.coverageWith(flatChildren[i].interval.collapsedLeft()); + code += interval.contents + childResults[i]; + interval = flatChildren[i].interval.collapsedRight(); + } + } + code += interval.contents; + return code; +} + // Semantic actions for the `modifiedSource` attribute (see below). var modifiedSourceActions = { _nonterminal: function(children) { - var flatChildren = flattenIterNodes(children).sort(compareByInterval); - var childResults = flatChildren.map(function(n) { return n.modifiedSource; }); - if (flatChildren.length === 0 || childResults.every(isUndefined)) { - return undefined; - } - var code = ''; - var interval = flatChildren[0].interval.collapsedLeft(); - for (var i = 0; i < flatChildren.length; ++i) { - if (childResults[i] == null) { - // Grow the interval to include this node. - interval = interval.coverageWith(flatChildren[i].interval.collapsedRight()); - } else { - interval = interval.coverageWith(flatChildren[i].interval.collapsedLeft()); - code += interval.contents + childResults[i]; - interval = flatChildren[i].interval.collapsedRight(); - } - } - code += interval.contents; - return code; + return translateNonterminalCode(children, + function(n) { return n.modifiedSource; }); }, _iter: function(_) { throw new Error('_iter semantic action should never be hit'); @@ -510,7 +514,8 @@ semantics.addAttribute('asES5', { module.exports = { grammar: g, - semantics: semantics + semantics: semantics, + translateNonterminalCode: translateNonterminalCode }; }).call(this,require("buffer").Buffer) @@ -2796,106 +2801,15 @@ process.umask = function() { return 0; }; },{}],10:[function(require,module,exports){ var ohm = require('..'); -module.exports = ohm.makeRecipe(function() { - var decl = this.newGrammar("BuiltInRules") - .withSource("BuiltInRules {\n\n alnum (an alpha-numeric character)\n = letter\n | digit\n\n letter (a letter)\n = lower\n | upper\n | unicodeLtmo\n\n digit (a digit)\n = \"0\"..\"9\"\n\n hexDigit (a hexadecimal digit)\n = digit\n | \"a\"..\"f\"\n | \"A\"..\"F\"\n\n ListOf\n = NonemptyListOf\n | EmptyListOf\n\n NonemptyListOf\n = elem (sep elem)*\n\n EmptyListOf\n = /* nothing */\n\n listOf\n = nonemptyListOf\n | emptyListOf\n\n nonemptyListOf\n = elem (sep elem)*\n\n emptyListOf\n = /* nothing */\n\n}") - return decl - .define("alnum", [], this.alt(this.app("letter").withInterval(decl.sourceInterval(60, 66)), this.app("digit").withInterval(decl.sourceInterval(73, 78))).withInterval(decl.sourceInterval(60, 78)), "an alpha-numeric character") - .define("letter", [], this.alt(this.app("lower").withInterval(decl.sourceInterval(107, 112)), this.app("upper").withInterval(decl.sourceInterval(119, 124)), this.app("unicodeLtmo").withInterval(decl.sourceInterval(131, 142))).withInterval(decl.sourceInterval(107, 142)), "a letter") - .define("digit", [], this.range("0", "9").withInterval(decl.sourceInterval(169, 177)), "a digit") - .define("hexDigit", [], this.alt(this.app("digit").withInterval(decl.sourceInterval(219, 224)), this.range("a", "f").withInterval(decl.sourceInterval(231, 239)), this.range("A", "F").withInterval(decl.sourceInterval(246, 254))).withInterval(decl.sourceInterval(219, 254)), "a hexadecimal digit") - .define("ListOf", ["elem", "sep"], this.alt(this.app("NonemptyListOf", [this.param(0), this.param(1)]).withInterval(decl.sourceInterval(282, 307)), this.app("EmptyListOf", [this.param(0), this.param(1)]).withInterval(decl.sourceInterval(314, 336))).withInterval(decl.sourceInterval(282, 336))) - .define("NonemptyListOf", ["elem", "sep"], this.seq(this.param(0), this.star(this.seq(this.param(1), this.param(0)).withInterval(decl.sourceInterval(378, 386))).withInterval(decl.sourceInterval(377, 388))).withInterval(decl.sourceInterval(372, 388))) - .define("EmptyListOf", ["elem", "sep"], this.seq().withInterval(decl.sourceInterval(438, 438))) - .define("listOf", ["elem", "sep"], this.alt(this.app("nonemptyListOf", [this.param(0), this.param(1)]).withInterval(decl.sourceInterval(462, 487)), this.app("emptyListOf", [this.param(0), this.param(1)]).withInterval(decl.sourceInterval(494, 516))).withInterval(decl.sourceInterval(462, 516))) - .define("nonemptyListOf", ["elem", "sep"], this.seq(this.param(0), this.star(this.seq(this.param(1), this.param(0)).withInterval(decl.sourceInterval(558, 566))).withInterval(decl.sourceInterval(557, 568))).withInterval(decl.sourceInterval(552, 568))) - .define("emptyListOf", ["elem", "sep"], this.seq().withInterval(decl.sourceInterval(616, 616))) - .build(); -}); - +module.exports = ohm.makeRecipe(["grammar",{"source":"BuiltInRules {\n\n alnum (an alpha-numeric character)\n = letter\n | digit\n\n letter (a letter)\n = lower\n | upper\n | unicodeLtmo\n\n digit (a digit)\n = \"0\"..\"9\"\n\n hexDigit (a hexadecimal digit)\n = digit\n | \"a\"..\"f\"\n | \"A\"..\"F\"\n\n ListOf\n = NonemptyListOf\n | EmptyListOf\n\n NonemptyListOf\n = elem (sep elem)*\n\n EmptyListOf\n = /* nothing */\n\n listOf\n = nonemptyListOf\n | emptyListOf\n\n nonemptyListOf\n = elem (sep elem)*\n\n emptyListOf\n = /* nothing */\n\n}"},"BuiltInRules",null,null,{"alnum":["define",{"sourceInterval":[18,78]},"an alpha-numeric character",[],["alt",{"sourceInterval":[60,78]},["app",{"sourceInterval":[60,66]},"letter",[]],["app",{"sourceInterval":[73,78]},"digit",[]]]],"letter":["define",{"sourceInterval":[82,142]},"a letter",[],["alt",{"sourceInterval":[107,142]},["app",{"sourceInterval":[107,112]},"lower",[]],["app",{"sourceInterval":[119,124]},"upper",[]],["app",{"sourceInterval":[131,142]},"unicodeLtmo",[]]]],"digit":["define",{"sourceInterval":[146,177]},"a digit",[],["range",{"sourceInterval":[169,177]},"0","9"]],"hexDigit":["define",{"sourceInterval":[181,254]},"a hexadecimal digit",[],["alt",{"sourceInterval":[219,254]},["app",{"sourceInterval":[219,224]},"digit",[]],["range",{"sourceInterval":[231,239]},"a","f"],["range",{"sourceInterval":[246,254]},"A","F"]]],"ListOf":["define",{"sourceInterval":[258,336]},null,["elem","sep"],["alt",{"sourceInterval":[282,336]},["app",{"sourceInterval":[282,307]},"NonemptyListOf",[["param",{},0],["param",{},1]]],["app",{"sourceInterval":[314,336]},"EmptyListOf",[["param",{},0],["param",{},1]]]]],"NonemptyListOf":["define",{"sourceInterval":[340,388]},null,["elem","sep"],["seq",{"sourceInterval":[372,388]},["param",{},0],["star",{"sourceInterval":[377,388]},["seq",{"sourceInterval":[378,386]},["param",{},1],["param",{},0]]]]],"EmptyListOf":["define",{"sourceInterval":[392,434]},null,["elem","sep"],["seq",{"sourceInterval":[438,438]}]],"listOf":["define",{"sourceInterval":[438,516]},null,["elem","sep"],["alt",{"sourceInterval":[462,516]},["app",{"sourceInterval":[462,487]},"nonemptyListOf",[["param",{},0],["param",{},1]]],["app",{"sourceInterval":[494,516]},"emptyListOf",[["param",{},0],["param",{},1]]]]],"nonemptyListOf":["define",{"sourceInterval":[520,568]},null,["elem","sep"],["seq",{"sourceInterval":[552,568]},["param",{},0],["star",{"sourceInterval":[557,568]},["seq",{"sourceInterval":[558,566]},["param",{},1],["param",{},0]]]]],"emptyListOf":["define",{"sourceInterval":[572,614]},null,["elem","sep"],["seq",{"sourceInterval":[616,616]}]]}]); },{"..":50}],11:[function(require,module,exports){ var ohm = require('..'); -module.exports = ohm.makeRecipe(function() { - var decl = this.newGrammar("Ohm") - .withSource("Ohm {\n\n Grammars\n = Grammar*\n\n Grammar\n = ident SuperGrammar? \"{\" Rule* \"}\"\n\n SuperGrammar\n = \"<:\" ident\n\n Rule\n = ident Formals? ruleDescr? \"=\" RuleBody -- define\n | ident Formals? \":=\" RuleBody -- override\n | ident Formals? \"+=\" RuleBody -- extend\n\n RuleBody\n = \"|\"? TopLevelTerm (\"|\" TopLevelTerm)*\n\n TopLevelTerm\n = Seq caseName -- inline\n | Seq\n\n Formals\n = \"<\" ListOf \">\"\n\n Params\n = \"<\" ListOf \">\"\n\n Alt\n = Seq (\"|\" Seq)*\n\n Seq\n = Iter*\n\n Iter\n = Pred \"*\" -- star\n | Pred \"+\" -- plus\n | Pred \"?\" -- opt\n | Pred\n\n Pred\n = \"~\" Lex -- not\n | \"&\" Lex -- lookahead\n | Lex\n\n Lex\n = \"#\" Base -- lex\n | Base\n\n Base\n = ident Params? ~(ruleDescr? \"=\" | \":=\" | \"+=\") -- application\n | terminal \"..\" terminal -- range\n | terminal -- terminal\n | \"(\" Alt \")\" -- paren\n\n ruleDescr (a rule description)\n = \"(\" ruleDescrText \")\"\n\n ruleDescrText\n = (~\")\" any)*\n\n caseName\n = \"--\" (~\"\\n\" space)* name (~\"\\n\" space)* (\"\\n\" | &\"}\")\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = \"_\"\n | letter\n\n nameRest\n = \"_\"\n | alnum\n\n ident (an identifier)\n = name\n\n terminal\n = \"\\\"\" terminalChar* \"\\\"\"\n\n terminalChar\n = escapeChar\n | ~\"\\\\\" ~\"\\\"\" ~\"\\n\" any\n\n escapeChar (an escape sequence)\n = \"\\\\\\\\\" -- backslash\n | \"\\\\\\\"\" -- doubleQuote\n | \"\\\\\\'\" -- singleQuote\n | \"\\\\b\" -- backspace\n | \"\\\\n\" -- lineFeed\n | \"\\\\r\" -- carriageReturn\n | \"\\\\t\" -- tab\n | \"\\\\u\" hexDigit hexDigit hexDigit hexDigit -- unicodeEscape\n | \"\\\\x\" hexDigit hexDigit -- hexEscape\n\n space\n += comment\n\n comment\n = \"//\" (~\"\\n\" any)* \"\\n\" -- singleLine\n | \"/*\" (~\"*/\" any)* \"*/\" -- multiLine\n\n tokens = token*\n\n token = caseName | comment | ident | operator | punctuation | terminal | any\n\n operator = \"<:\" | \"=\" | \":=\" | \"+=\" | \"*\" | \"+\" | \"?\" | \"~\" | \"&\"\n\n punctuation = \"<\" | \">\" | \",\" | \"--\"\n}") - .withDefaultStartRule("Grammars") - return decl - .define("Grammars", [], this.star(this.app("Grammar").withInterval(decl.sourceInterval(24, 31))).withInterval(decl.sourceInterval(24, 32))) - .define("Grammar", [], this.seq(this.app("ident").withInterval(decl.sourceInterval(50, 55)), this.opt(this.app("SuperGrammar").withInterval(decl.sourceInterval(56, 68))).withInterval(decl.sourceInterval(56, 69)), this.terminal("{").withInterval(decl.sourceInterval(70, 73)), this.star(this.app("Rule").withInterval(decl.sourceInterval(74, 78))).withInterval(decl.sourceInterval(74, 79)), this.terminal("}").withInterval(decl.sourceInterval(80, 83))).withInterval(decl.sourceInterval(50, 83))) - .define("SuperGrammar", [], this.seq(this.terminal("<:").withInterval(decl.sourceInterval(106, 110)), this.app("ident").withInterval(decl.sourceInterval(111, 116))).withInterval(decl.sourceInterval(106, 116))) - .define("Rule_define", [], this.seq(this.app("ident").withInterval(decl.sourceInterval(131, 136)), this.opt(this.app("Formals").withInterval(decl.sourceInterval(137, 144))).withInterval(decl.sourceInterval(137, 145)), this.opt(this.app("ruleDescr").withInterval(decl.sourceInterval(146, 155))).withInterval(decl.sourceInterval(146, 156)), this.terminal("=").withInterval(decl.sourceInterval(157, 160)), this.app("RuleBody").withInterval(decl.sourceInterval(162, 170))).withInterval(decl.sourceInterval(131, 170))) - .define("Rule_override", [], this.seq(this.app("ident").withInterval(decl.sourceInterval(188, 193)), this.opt(this.app("Formals").withInterval(decl.sourceInterval(194, 201))).withInterval(decl.sourceInterval(194, 202)), this.terminal(":=").withInterval(decl.sourceInterval(214, 218)), this.app("RuleBody").withInterval(decl.sourceInterval(219, 227))).withInterval(decl.sourceInterval(188, 227))) - .define("Rule_extend", [], this.seq(this.app("ident").withInterval(decl.sourceInterval(247, 252)), this.opt(this.app("Formals").withInterval(decl.sourceInterval(253, 260))).withInterval(decl.sourceInterval(253, 261)), this.terminal("+=").withInterval(decl.sourceInterval(273, 277)), this.app("RuleBody").withInterval(decl.sourceInterval(278, 286))).withInterval(decl.sourceInterval(247, 286))) - .define("Rule", [], this.alt(this.app("Rule_define").withInterval(decl.sourceInterval(131, 170)), this.app("Rule_override").withInterval(decl.sourceInterval(188, 227)), this.app("Rule_extend").withInterval(decl.sourceInterval(247, 286))).withInterval(decl.sourceInterval(131, 297))) - .define("RuleBody", [], this.seq(this.opt(this.terminal("|").withInterval(decl.sourceInterval(316, 319))).withInterval(decl.sourceInterval(316, 320)), this.app("TopLevelTerm").withInterval(decl.sourceInterval(321, 333)), this.star(this.seq(this.terminal("|").withInterval(decl.sourceInterval(335, 338)), this.app("TopLevelTerm").withInterval(decl.sourceInterval(339, 351))).withInterval(decl.sourceInterval(335, 351))).withInterval(decl.sourceInterval(334, 353))).withInterval(decl.sourceInterval(316, 353))) - .define("TopLevelTerm_inline", [], this.seq(this.app("Seq").withInterval(decl.sourceInterval(376, 379)), this.app("caseName").withInterval(decl.sourceInterval(380, 388))).withInterval(decl.sourceInterval(376, 388))) - .define("TopLevelTerm", [], this.alt(this.app("TopLevelTerm_inline").withInterval(decl.sourceInterval(376, 388)), this.app("Seq").withInterval(decl.sourceInterval(406, 409))).withInterval(decl.sourceInterval(376, 409))) - .define("Formals", [], this.seq(this.terminal("<").withInterval(decl.sourceInterval(427, 430)), this.app("ListOf", [this.app("ident").withInterval(decl.sourceInterval(438, 443)), this.terminal(",").withInterval(decl.sourceInterval(445, 448))]).withInterval(decl.sourceInterval(431, 449)), this.terminal(">").withInterval(decl.sourceInterval(450, 453))).withInterval(decl.sourceInterval(427, 453))) - .define("Params", [], this.seq(this.terminal("<").withInterval(decl.sourceInterval(470, 473)), this.app("ListOf", [this.app("Seq").withInterval(decl.sourceInterval(481, 484)), this.terminal(",").withInterval(decl.sourceInterval(486, 489))]).withInterval(decl.sourceInterval(474, 490)), this.terminal(">").withInterval(decl.sourceInterval(491, 494))).withInterval(decl.sourceInterval(470, 494))) - .define("Alt", [], this.seq(this.app("Seq").withInterval(decl.sourceInterval(508, 511)), this.star(this.seq(this.terminal("|").withInterval(decl.sourceInterval(513, 516)), this.app("Seq").withInterval(decl.sourceInterval(517, 520))).withInterval(decl.sourceInterval(513, 520))).withInterval(decl.sourceInterval(512, 522))).withInterval(decl.sourceInterval(508, 522))) - .define("Seq", [], this.star(this.app("Iter").withInterval(decl.sourceInterval(536, 540))).withInterval(decl.sourceInterval(536, 541))) - .define("Iter_star", [], this.seq(this.app("Pred").withInterval(decl.sourceInterval(556, 560)), this.terminal("*").withInterval(decl.sourceInterval(561, 564))).withInterval(decl.sourceInterval(556, 564))) - .define("Iter_plus", [], this.seq(this.app("Pred").withInterval(decl.sourceInterval(580, 584)), this.terminal("+").withInterval(decl.sourceInterval(585, 588))).withInterval(decl.sourceInterval(580, 588))) - .define("Iter_opt", [], this.seq(this.app("Pred").withInterval(decl.sourceInterval(604, 608)), this.terminal("?").withInterval(decl.sourceInterval(609, 612))).withInterval(decl.sourceInterval(604, 612))) - .define("Iter", [], this.alt(this.app("Iter_star").withInterval(decl.sourceInterval(556, 564)), this.app("Iter_plus").withInterval(decl.sourceInterval(580, 588)), this.app("Iter_opt").withInterval(decl.sourceInterval(604, 612)), this.app("Pred").withInterval(decl.sourceInterval(627, 631))).withInterval(decl.sourceInterval(556, 631))) - .define("Pred_not", [], this.seq(this.terminal("~").withInterval(decl.sourceInterval(646, 649)), this.app("Lex").withInterval(decl.sourceInterval(650, 653))).withInterval(decl.sourceInterval(646, 653))) - .define("Pred_lookahead", [], this.seq(this.terminal("&").withInterval(decl.sourceInterval(668, 671)), this.app("Lex").withInterval(decl.sourceInterval(672, 675))).withInterval(decl.sourceInterval(668, 675))) - .define("Pred", [], this.alt(this.app("Pred_not").withInterval(decl.sourceInterval(646, 653)), this.app("Pred_lookahead").withInterval(decl.sourceInterval(668, 675)), this.app("Lex").withInterval(decl.sourceInterval(696, 699))).withInterval(decl.sourceInterval(646, 699))) - .define("Lex_lex", [], this.seq(this.terminal("#").withInterval(decl.sourceInterval(713, 716)), this.app("Base").withInterval(decl.sourceInterval(717, 721))).withInterval(decl.sourceInterval(713, 721))) - .define("Lex", [], this.alt(this.app("Lex_lex").withInterval(decl.sourceInterval(713, 721)), this.app("Base").withInterval(decl.sourceInterval(736, 740))).withInterval(decl.sourceInterval(713, 740))) - .define("Base_application", [], this.seq(this.app("ident").withInterval(decl.sourceInterval(755, 760)), this.opt(this.app("Params").withInterval(decl.sourceInterval(761, 767))).withInterval(decl.sourceInterval(761, 768)), this.not(this.alt(this.seq(this.opt(this.app("ruleDescr").withInterval(decl.sourceInterval(771, 780))).withInterval(decl.sourceInterval(771, 781)), this.terminal("=").withInterval(decl.sourceInterval(782, 785))).withInterval(decl.sourceInterval(771, 785)), this.terminal(":=").withInterval(decl.sourceInterval(788, 792)), this.terminal("+=").withInterval(decl.sourceInterval(795, 799))).withInterval(decl.sourceInterval(771, 799))).withInterval(decl.sourceInterval(769, 800))).withInterval(decl.sourceInterval(755, 800))) - .define("Base_range", [], this.seq(this.app("terminal").withInterval(decl.sourceInterval(823, 831)), this.terminal("..").withInterval(decl.sourceInterval(832, 836)), this.app("terminal").withInterval(decl.sourceInterval(837, 845))).withInterval(decl.sourceInterval(823, 845))) - .define("Base_terminal", [], this.app("terminal").withInterval(decl.sourceInterval(885, 893))) - .define("Base_paren", [], this.seq(this.terminal("(").withInterval(decl.sourceInterval(950, 953)), this.app("Alt").withInterval(decl.sourceInterval(954, 957)), this.terminal(")").withInterval(decl.sourceInterval(958, 961))).withInterval(decl.sourceInterval(950, 961))) - .define("Base", [], this.alt(this.app("Base_application").withInterval(decl.sourceInterval(755, 800)), this.app("Base_range").withInterval(decl.sourceInterval(823, 845)), this.app("Base_terminal").withInterval(decl.sourceInterval(885, 893)), this.app("Base_paren").withInterval(decl.sourceInterval(950, 961))).withInterval(decl.sourceInterval(755, 1005))) - .define("ruleDescr", [], this.seq(this.terminal("(").withInterval(decl.sourceInterval(1047, 1050)), this.app("ruleDescrText").withInterval(decl.sourceInterval(1051, 1064)), this.terminal(")").withInterval(decl.sourceInterval(1065, 1068))).withInterval(decl.sourceInterval(1047, 1068)), "a rule description") - .define("ruleDescrText", [], this.star(this.seq(this.not(this.terminal(")").withInterval(decl.sourceInterval(1094, 1097))).withInterval(decl.sourceInterval(1093, 1097)), this.app("any").withInterval(decl.sourceInterval(1098, 1101))).withInterval(decl.sourceInterval(1093, 1101))).withInterval(decl.sourceInterval(1092, 1103))) - .define("caseName", [], this.seq(this.terminal("--").withInterval(decl.sourceInterval(1122, 1126)), this.star(this.seq(this.not(this.terminal("\n").withInterval(decl.sourceInterval(1129, 1133))).withInterval(decl.sourceInterval(1128, 1133)), this.app("space").withInterval(decl.sourceInterval(1134, 1139))).withInterval(decl.sourceInterval(1128, 1139))).withInterval(decl.sourceInterval(1127, 1141)), this.app("name").withInterval(decl.sourceInterval(1142, 1146)), this.star(this.seq(this.not(this.terminal("\n").withInterval(decl.sourceInterval(1149, 1153))).withInterval(decl.sourceInterval(1148, 1153)), this.app("space").withInterval(decl.sourceInterval(1154, 1159))).withInterval(decl.sourceInterval(1148, 1159))).withInterval(decl.sourceInterval(1147, 1161)), this.alt(this.terminal("\n").withInterval(decl.sourceInterval(1163, 1167)), this.la(this.terminal("}").withInterval(decl.sourceInterval(1171, 1174))).withInterval(decl.sourceInterval(1170, 1174))).withInterval(decl.sourceInterval(1163, 1174))).withInterval(decl.sourceInterval(1122, 1175))) - .define("name", [], this.seq(this.app("nameFirst").withInterval(decl.sourceInterval(1200, 1209)), this.star(this.app("nameRest").withInterval(decl.sourceInterval(1210, 1218))).withInterval(decl.sourceInterval(1210, 1219))).withInterval(decl.sourceInterval(1200, 1219)), "a name") - .define("nameFirst", [], this.alt(this.terminal("_").withInterval(decl.sourceInterval(1239, 1242)), this.app("letter").withInterval(decl.sourceInterval(1249, 1255))).withInterval(decl.sourceInterval(1239, 1255))) - .define("nameRest", [], this.alt(this.terminal("_").withInterval(decl.sourceInterval(1274, 1277)), this.app("alnum").withInterval(decl.sourceInterval(1284, 1289))).withInterval(decl.sourceInterval(1274, 1289))) - .define("ident", [], this.app("name").withInterval(decl.sourceInterval(1322, 1326)), "an identifier") - .define("terminal", [], this.seq(this.terminal("\"").withInterval(decl.sourceInterval(1345, 1349)), this.star(this.app("terminalChar").withInterval(decl.sourceInterval(1350, 1362))).withInterval(decl.sourceInterval(1350, 1363)), this.terminal("\"").withInterval(decl.sourceInterval(1364, 1368))).withInterval(decl.sourceInterval(1345, 1368))) - .define("terminalChar", [], this.alt(this.app("escapeChar").withInterval(decl.sourceInterval(1391, 1401)), this.seq(this.not(this.terminal("\\").withInterval(decl.sourceInterval(1409, 1413))).withInterval(decl.sourceInterval(1408, 1413)), this.not(this.terminal("\"").withInterval(decl.sourceInterval(1415, 1419))).withInterval(decl.sourceInterval(1414, 1419)), this.not(this.terminal("\n").withInterval(decl.sourceInterval(1421, 1425))).withInterval(decl.sourceInterval(1420, 1425)), this.app("any").withInterval(decl.sourceInterval(1426, 1429))).withInterval(decl.sourceInterval(1408, 1429))).withInterval(decl.sourceInterval(1391, 1429))) - .define("escapeChar_backslash", [], this.terminal("\\\\").withInterval(decl.sourceInterval(1472, 1478))) - .define("escapeChar_doubleQuote", [], this.terminal("\\\"").withInterval(decl.sourceInterval(1534, 1540))) - .define("escapeChar_singleQuote", [], this.terminal("\\'").withInterval(decl.sourceInterval(1598, 1604))) - .define("escapeChar_backspace", [], this.terminal("\\b").withInterval(decl.sourceInterval(1662, 1667))) - .define("escapeChar_lineFeed", [], this.terminal("\\n").withInterval(decl.sourceInterval(1724, 1729))) - .define("escapeChar_carriageReturn", [], this.terminal("\\r").withInterval(decl.sourceInterval(1785, 1790))) - .define("escapeChar_tab", [], this.terminal("\\t").withInterval(decl.sourceInterval(1852, 1857))) - .define("escapeChar_unicodeEscape", [], this.seq(this.terminal("\\u").withInterval(decl.sourceInterval(1908, 1913)), this.app("hexDigit").withInterval(decl.sourceInterval(1914, 1922)), this.app("hexDigit").withInterval(decl.sourceInterval(1923, 1931)), this.app("hexDigit").withInterval(decl.sourceInterval(1932, 1940)), this.app("hexDigit").withInterval(decl.sourceInterval(1941, 1949))).withInterval(decl.sourceInterval(1908, 1949))) - .define("escapeChar_hexEscape", [], this.seq(this.terminal("\\x").withInterval(decl.sourceInterval(1974, 1979)), this.app("hexDigit").withInterval(decl.sourceInterval(1980, 1988)), this.app("hexDigit").withInterval(decl.sourceInterval(1989, 1997))).withInterval(decl.sourceInterval(1974, 1997))) - .define("escapeChar", [], this.alt(this.app("escapeChar_backslash").withInterval(decl.sourceInterval(1472, 1478)), this.app("escapeChar_doubleQuote").withInterval(decl.sourceInterval(1534, 1540)), this.app("escapeChar_singleQuote").withInterval(decl.sourceInterval(1598, 1604)), this.app("escapeChar_backspace").withInterval(decl.sourceInterval(1662, 1667)), this.app("escapeChar_lineFeed").withInterval(decl.sourceInterval(1724, 1729)), this.app("escapeChar_carriageReturn").withInterval(decl.sourceInterval(1785, 1790)), this.app("escapeChar_tab").withInterval(decl.sourceInterval(1852, 1857)), this.app("escapeChar_unicodeEscape").withInterval(decl.sourceInterval(1908, 1949)), this.app("escapeChar_hexEscape").withInterval(decl.sourceInterval(1974, 1997))).withInterval(decl.sourceInterval(1472, 2029)), "an escape sequence") - .extend("space", [], this.app("comment").withInterval(decl.sourceInterval(2045, 2052))) - .define("comment_singleLine", [], this.seq(this.terminal("//").withInterval(decl.sourceInterval(2070, 2074)), this.star(this.seq(this.not(this.terminal("\n").withInterval(decl.sourceInterval(2077, 2081))).withInterval(decl.sourceInterval(2076, 2081)), this.app("any").withInterval(decl.sourceInterval(2082, 2085))).withInterval(decl.sourceInterval(2076, 2085))).withInterval(decl.sourceInterval(2075, 2087)), this.terminal("\n").withInterval(decl.sourceInterval(2088, 2092))).withInterval(decl.sourceInterval(2070, 2092))) - .define("comment_multiLine", [], this.seq(this.terminal("/*").withInterval(decl.sourceInterval(2114, 2118)), this.star(this.seq(this.not(this.terminal("*/").withInterval(decl.sourceInterval(2121, 2125))).withInterval(decl.sourceInterval(2120, 2125)), this.app("any").withInterval(decl.sourceInterval(2126, 2129))).withInterval(decl.sourceInterval(2120, 2129))).withInterval(decl.sourceInterval(2119, 2131)), this.terminal("*/").withInterval(decl.sourceInterval(2132, 2136))).withInterval(decl.sourceInterval(2114, 2136))) - .define("comment", [], this.alt(this.app("comment_singleLine").withInterval(decl.sourceInterval(2070, 2092)), this.app("comment_multiLine").withInterval(decl.sourceInterval(2114, 2136))).withInterval(decl.sourceInterval(2070, 2150))) - .define("tokens", [], this.star(this.app("token").withInterval(decl.sourceInterval(2163, 2168))).withInterval(decl.sourceInterval(2163, 2169))) - .define("token", [], this.alt(this.app("caseName").withInterval(decl.sourceInterval(2181, 2189)), this.app("comment").withInterval(decl.sourceInterval(2192, 2199)), this.app("ident").withInterval(decl.sourceInterval(2202, 2207)), this.app("operator").withInterval(decl.sourceInterval(2210, 2218)), this.app("punctuation").withInterval(decl.sourceInterval(2221, 2232)), this.app("terminal").withInterval(decl.sourceInterval(2235, 2243)), this.app("any").withInterval(decl.sourceInterval(2246, 2249))).withInterval(decl.sourceInterval(2181, 2249))) - .define("operator", [], this.alt(this.terminal("<:").withInterval(decl.sourceInterval(2264, 2268)), this.terminal("=").withInterval(decl.sourceInterval(2271, 2274)), this.terminal(":=").withInterval(decl.sourceInterval(2277, 2281)), this.terminal("+=").withInterval(decl.sourceInterval(2284, 2288)), this.terminal("*").withInterval(decl.sourceInterval(2291, 2294)), this.terminal("+").withInterval(decl.sourceInterval(2297, 2300)), this.terminal("?").withInterval(decl.sourceInterval(2303, 2306)), this.terminal("~").withInterval(decl.sourceInterval(2309, 2312)), this.terminal("&").withInterval(decl.sourceInterval(2315, 2318))).withInterval(decl.sourceInterval(2264, 2318))) - .define("punctuation", [], this.alt(this.terminal("<").withInterval(decl.sourceInterval(2336, 2339)), this.terminal(">").withInterval(decl.sourceInterval(2342, 2345)), this.terminal(",").withInterval(decl.sourceInterval(2348, 2351)), this.terminal("--").withInterval(decl.sourceInterval(2354, 2358))).withInterval(decl.sourceInterval(2336, 2358))) - .build(); -}); - +module.exports = ohm.makeRecipe(["grammar",{"source":"Ohm {\n\n Grammars\n = Grammar*\n\n Grammar\n = ident SuperGrammar? \"{\" Rule* \"}\"\n\n SuperGrammar\n = \"<:\" ident\n\n Rule\n = ident Formals? ruleDescr? \"=\" RuleBody -- define\n | ident Formals? \":=\" RuleBody -- override\n | ident Formals? \"+=\" RuleBody -- extend\n\n RuleBody\n = \"|\"? NonemptyListOf\n\n TopLevelTerm\n = Seq caseName -- inline\n | Seq\n\n Formals\n = \"<\" ListOf \">\"\n\n Params\n = \"<\" ListOf \">\"\n\n Alt\n = NonemptyListOf\n\n Seq\n = Iter*\n\n Iter\n = Pred \"*\" -- star\n | Pred \"+\" -- plus\n | Pred \"?\" -- opt\n | Pred\n\n Pred\n = \"~\" Lex -- not\n | \"&\" Lex -- lookahead\n | Lex\n\n Lex\n = \"#\" Base -- lex\n | Base\n\n Base\n = ident Params? ~(ruleDescr? \"=\" | \":=\" | \"+=\") -- application\n | terminal \"..\" terminal -- range\n | terminal -- terminal\n | \"(\" Alt \")\" -- paren\n\n ruleDescr (a rule description)\n = \"(\" ruleDescrText \")\"\n\n ruleDescrText\n = (~\")\" any)*\n\n caseName\n = \"--\" (~\"\\n\" space)* name (~\"\\n\" space)* (\"\\n\" | &\"}\")\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = \"_\"\n | letter\n\n nameRest\n = \"_\"\n | alnum\n\n ident (an identifier)\n = name\n\n terminal\n = \"\\\"\" terminalChar* \"\\\"\"\n\n terminalChar\n = escapeChar\n | ~\"\\\\\" ~\"\\\"\" ~\"\\n\" any\n\n escapeChar (an escape sequence)\n = \"\\\\\\\\\" -- backslash\n | \"\\\\\\\"\" -- doubleQuote\n | \"\\\\\\'\" -- singleQuote\n | \"\\\\b\" -- backspace\n | \"\\\\n\" -- lineFeed\n | \"\\\\r\" -- carriageReturn\n | \"\\\\t\" -- tab\n | \"\\\\u\" hexDigit hexDigit hexDigit hexDigit -- unicodeEscape\n | \"\\\\x\" hexDigit hexDigit -- hexEscape\n\n space\n += comment\n\n comment\n = \"//\" (~\"\\n\" any)* \"\\n\" -- singleLine\n | \"/*\" (~\"*/\" any)* \"*/\" -- multiLine\n\n tokens = token*\n\n token = caseName | comment | ident | operator | punctuation | terminal | any\n\n operator = \"<:\" | \"=\" | \":=\" | \"+=\" | \"*\" | \"+\" | \"?\" | \"~\" | \"&\"\n\n punctuation = \"<\" | \">\" | \",\" | \"--\"\n}"},"Ohm",null,"Grammars",{"Grammars":["define",{"sourceInterval":[9,32]},null,[],["star",{"sourceInterval":[24,32]},["app",{"sourceInterval":[24,31]},"Grammar",[]]]],"Grammar":["define",{"sourceInterval":[36,83]},null,[],["seq",{"sourceInterval":[50,83]},["app",{"sourceInterval":[50,55]},"ident",[]],["opt",{"sourceInterval":[56,69]},["app",{"sourceInterval":[56,68]},"SuperGrammar",[]]],["terminal",{"sourceInterval":[70,73]},"{"],["star",{"sourceInterval":[74,79]},["app",{"sourceInterval":[74,78]},"Rule",[]]],["terminal",{"sourceInterval":[80,83]},"}"]]],"SuperGrammar":["define",{"sourceInterval":[87,116]},null,[],["seq",{"sourceInterval":[106,116]},["terminal",{"sourceInterval":[106,110]},"<:"],["app",{"sourceInterval":[111,116]},"ident",[]]]],"Rule_define":["define",{"sourceInterval":[131,181]},null,[],["seq",{"sourceInterval":[131,170]},["app",{"sourceInterval":[131,136]},"ident",[]],["opt",{"sourceInterval":[137,145]},["app",{"sourceInterval":[137,144]},"Formals",[]]],["opt",{"sourceInterval":[146,156]},["app",{"sourceInterval":[146,155]},"ruleDescr",[]]],["terminal",{"sourceInterval":[157,160]},"="],["app",{"sourceInterval":[162,170]},"RuleBody",[]]]],"Rule_override":["define",{"sourceInterval":[188,240]},null,[],["seq",{"sourceInterval":[188,227]},["app",{"sourceInterval":[188,193]},"ident",[]],["opt",{"sourceInterval":[194,202]},["app",{"sourceInterval":[194,201]},"Formals",[]]],["terminal",{"sourceInterval":[214,218]},":="],["app",{"sourceInterval":[219,227]},"RuleBody",[]]]],"Rule_extend":["define",{"sourceInterval":[247,297]},null,[],["seq",{"sourceInterval":[247,286]},["app",{"sourceInterval":[247,252]},"ident",[]],["opt",{"sourceInterval":[253,261]},["app",{"sourceInterval":[253,260]},"Formals",[]]],["terminal",{"sourceInterval":[273,277]},"+="],["app",{"sourceInterval":[278,286]},"RuleBody",[]]]],"Rule":["define",{"sourceInterval":[120,297]},null,[],["alt",{"sourceInterval":[131,297]},["app",{"sourceInterval":[131,170]},"Rule_define",[]],["app",{"sourceInterval":[188,227]},"Rule_override",[]],["app",{"sourceInterval":[247,286]},"Rule_extend",[]]]],"RuleBody":["define",{"sourceInterval":[301,354]},null,[],["seq",{"sourceInterval":[316,354]},["opt",{"sourceInterval":[316,320]},["terminal",{"sourceInterval":[316,319]},"|"]],["app",{"sourceInterval":[321,354]},"NonemptyListOf",[["app",{"sourceInterval":[336,348]},"TopLevelTerm",[]],["terminal",{"sourceInterval":[350,353]},"|"]]]]],"TopLevelTerm_inline":["define",{"sourceInterval":[377,400]},null,[],["seq",{"sourceInterval":[377,389]},["app",{"sourceInterval":[377,380]},"Seq",[]],["app",{"sourceInterval":[381,389]},"caseName",[]]]],"TopLevelTerm":["define",{"sourceInterval":[358,410]},null,[],["alt",{"sourceInterval":[377,410]},["app",{"sourceInterval":[377,389]},"TopLevelTerm_inline",[]],["app",{"sourceInterval":[407,410]},"Seq",[]]]],"Formals":["define",{"sourceInterval":[414,454]},null,[],["seq",{"sourceInterval":[428,454]},["terminal",{"sourceInterval":[428,431]},"<"],["app",{"sourceInterval":[432,450]},"ListOf",[["app",{"sourceInterval":[439,444]},"ident",[]],["terminal",{"sourceInterval":[446,449]},","]]],["terminal",{"sourceInterval":[451,454]},">"]]],"Params":["define",{"sourceInterval":[458,495]},null,[],["seq",{"sourceInterval":[471,495]},["terminal",{"sourceInterval":[471,474]},"<"],["app",{"sourceInterval":[475,491]},"ListOf",[["app",{"sourceInterval":[482,485]},"Seq",[]],["terminal",{"sourceInterval":[487,490]},","]]],["terminal",{"sourceInterval":[492,495]},">"]]],"Alt":["define",{"sourceInterval":[499,533]},null,[],["app",{"sourceInterval":[509,533]},"NonemptyListOf",[["app",{"sourceInterval":[524,527]},"Seq",[]],["terminal",{"sourceInterval":[529,532]},"|"]]]],"Seq":["define",{"sourceInterval":[537,552]},null,[],["star",{"sourceInterval":[547,552]},["app",{"sourceInterval":[547,551]},"Iter",[]]]],"Iter_star":["define",{"sourceInterval":[567,584]},null,[],["seq",{"sourceInterval":[567,575]},["app",{"sourceInterval":[567,571]},"Pred",[]],["terminal",{"sourceInterval":[572,575]},"*"]]],"Iter_plus":["define",{"sourceInterval":[591,608]},null,[],["seq",{"sourceInterval":[591,599]},["app",{"sourceInterval":[591,595]},"Pred",[]],["terminal",{"sourceInterval":[596,599]},"+"]]],"Iter_opt":["define",{"sourceInterval":[615,631]},null,[],["seq",{"sourceInterval":[615,623]},["app",{"sourceInterval":[615,619]},"Pred",[]],["terminal",{"sourceInterval":[620,623]},"?"]]],"Iter":["define",{"sourceInterval":[556,642]},null,[],["alt",{"sourceInterval":[567,642]},["app",{"sourceInterval":[567,575]},"Iter_star",[]],["app",{"sourceInterval":[591,599]},"Iter_plus",[]],["app",{"sourceInterval":[615,623]},"Iter_opt",[]],["app",{"sourceInterval":[638,642]},"Pred",[]]]],"Pred_not":["define",{"sourceInterval":[657,672]},null,[],["seq",{"sourceInterval":[657,664]},["terminal",{"sourceInterval":[657,660]},"~"],["app",{"sourceInterval":[661,664]},"Lex",[]]]],"Pred_lookahead":["define",{"sourceInterval":[679,700]},null,[],["seq",{"sourceInterval":[679,686]},["terminal",{"sourceInterval":[679,682]},"&"],["app",{"sourceInterval":[683,686]},"Lex",[]]]],"Pred":["define",{"sourceInterval":[646,710]},null,[],["alt",{"sourceInterval":[657,710]},["app",{"sourceInterval":[657,664]},"Pred_not",[]],["app",{"sourceInterval":[679,686]},"Pred_lookahead",[]],["app",{"sourceInterval":[707,710]},"Lex",[]]]],"Lex_lex":["define",{"sourceInterval":[724,740]},null,[],["seq",{"sourceInterval":[724,732]},["terminal",{"sourceInterval":[724,727]},"#"],["app",{"sourceInterval":[728,732]},"Base",[]]]],"Lex":["define",{"sourceInterval":[714,751]},null,[],["alt",{"sourceInterval":[724,751]},["app",{"sourceInterval":[724,732]},"Lex_lex",[]],["app",{"sourceInterval":[747,751]},"Base",[]]]],"Base_application":["define",{"sourceInterval":[766,827]},null,[],["seq",{"sourceInterval":[766,811]},["app",{"sourceInterval":[766,771]},"ident",[]],["opt",{"sourceInterval":[772,779]},["app",{"sourceInterval":[772,778]},"Params",[]]],["not",{"sourceInterval":[780,811]},["alt",{"sourceInterval":[782,810]},["seq",{"sourceInterval":[782,796]},["opt",{"sourceInterval":[782,792]},["app",{"sourceInterval":[782,791]},"ruleDescr",[]]],["terminal",{"sourceInterval":[793,796]},"="]],["terminal",{"sourceInterval":[799,803]},":="],["terminal",{"sourceInterval":[806,810]},"+="]]]]],"Base_range":["define",{"sourceInterval":[834,889]},null,[],["seq",{"sourceInterval":[834,856]},["app",{"sourceInterval":[834,842]},"terminal",[]],["terminal",{"sourceInterval":[843,847]},".."],["app",{"sourceInterval":[848,856]},"terminal",[]]]],"Base_terminal":["define",{"sourceInterval":[896,954]},null,[],["app",{"sourceInterval":[896,904]},"terminal",[]]],"Base_paren":["define",{"sourceInterval":[961,1016]},null,[],["seq",{"sourceInterval":[961,972]},["terminal",{"sourceInterval":[961,964]},"("],["app",{"sourceInterval":[965,968]},"Alt",[]],["terminal",{"sourceInterval":[969,972]},")"]]],"Base":["define",{"sourceInterval":[755,1016]},null,[],["alt",{"sourceInterval":[766,1016]},["app",{"sourceInterval":[766,811]},"Base_application",[]],["app",{"sourceInterval":[834,856]},"Base_range",[]],["app",{"sourceInterval":[896,904]},"Base_terminal",[]],["app",{"sourceInterval":[961,972]},"Base_paren",[]]]],"ruleDescr":["define",{"sourceInterval":[1020,1079]},"a rule description",[],["seq",{"sourceInterval":[1058,1079]},["terminal",{"sourceInterval":[1058,1061]},"("],["app",{"sourceInterval":[1062,1075]},"ruleDescrText",[]],["terminal",{"sourceInterval":[1076,1079]},")"]]],"ruleDescrText":["define",{"sourceInterval":[1083,1114]},null,[],["star",{"sourceInterval":[1103,1114]},["seq",{"sourceInterval":[1104,1112]},["not",{"sourceInterval":[1104,1108]},["terminal",{"sourceInterval":[1105,1108]},")"]],["app",{"sourceInterval":[1109,1112]},"any",[]]]]],"caseName":["define",{"sourceInterval":[1118,1186]},null,[],["seq",{"sourceInterval":[1133,1186]},["terminal",{"sourceInterval":[1133,1137]},"--"],["star",{"sourceInterval":[1138,1152]},["seq",{"sourceInterval":[1139,1150]},["not",{"sourceInterval":[1139,1144]},["terminal",{"sourceInterval":[1140,1144]},"\n"]],["app",{"sourceInterval":[1145,1150]},"space",[]]]],["app",{"sourceInterval":[1153,1157]},"name",[]],["star",{"sourceInterval":[1158,1172]},["seq",{"sourceInterval":[1159,1170]},["not",{"sourceInterval":[1159,1164]},["terminal",{"sourceInterval":[1160,1164]},"\n"]],["app",{"sourceInterval":[1165,1170]},"space",[]]]],["alt",{"sourceInterval":[1174,1185]},["terminal",{"sourceInterval":[1174,1178]},"\n"],["lookahead",{"sourceInterval":[1181,1185]},["terminal",{"sourceInterval":[1182,1185]},"}"]]]]],"name":["define",{"sourceInterval":[1190,1230]},"a name",[],["seq",{"sourceInterval":[1211,1230]},["app",{"sourceInterval":[1211,1220]},"nameFirst",[]],["star",{"sourceInterval":[1221,1230]},["app",{"sourceInterval":[1221,1229]},"nameRest",[]]]]],"nameFirst":["define",{"sourceInterval":[1234,1266]},null,[],["alt",{"sourceInterval":[1250,1266]},["terminal",{"sourceInterval":[1250,1253]},"_"],["app",{"sourceInterval":[1260,1266]},"letter",[]]]],"nameRest":["define",{"sourceInterval":[1270,1300]},null,[],["alt",{"sourceInterval":[1285,1300]},["terminal",{"sourceInterval":[1285,1288]},"_"],["app",{"sourceInterval":[1295,1300]},"alnum",[]]]],"ident":["define",{"sourceInterval":[1304,1337]},"an identifier",[],["app",{"sourceInterval":[1333,1337]},"name",[]]],"terminal":["define",{"sourceInterval":[1341,1379]},null,[],["seq",{"sourceInterval":[1356,1379]},["terminal",{"sourceInterval":[1356,1360]},"\""],["star",{"sourceInterval":[1361,1374]},["app",{"sourceInterval":[1361,1373]},"terminalChar",[]]],["terminal",{"sourceInterval":[1375,1379]},"\""]]],"terminalChar":["define",{"sourceInterval":[1383,1440]},null,[],["alt",{"sourceInterval":[1402,1440]},["app",{"sourceInterval":[1402,1412]},"escapeChar",[]],["seq",{"sourceInterval":[1419,1440]},["not",{"sourceInterval":[1419,1424]},["terminal",{"sourceInterval":[1420,1424]},"\\"]],["not",{"sourceInterval":[1425,1430]},["terminal",{"sourceInterval":[1426,1430]},"\""]],["not",{"sourceInterval":[1431,1436]},["terminal",{"sourceInterval":[1432,1436]},"\n"]],["app",{"sourceInterval":[1437,1440]},"any",[]]]]],"escapeChar_backslash":["define",{"sourceInterval":[1483,1538]},null,[],["terminal",{"sourceInterval":[1483,1489]},"\\\\"]],"escapeChar_doubleQuote":["define",{"sourceInterval":[1545,1602]},null,[],["terminal",{"sourceInterval":[1545,1551]},"\\\""]],"escapeChar_singleQuote":["define",{"sourceInterval":[1609,1666]},null,[],["terminal",{"sourceInterval":[1609,1615]},"\\'"]],"escapeChar_backspace":["define",{"sourceInterval":[1673,1728]},null,[],["terminal",{"sourceInterval":[1673,1678]},"\\b"]],"escapeChar_lineFeed":["define",{"sourceInterval":[1735,1789]},null,[],["terminal",{"sourceInterval":[1735,1740]},"\\n"]],"escapeChar_carriageReturn":["define",{"sourceInterval":[1796,1856]},null,[],["terminal",{"sourceInterval":[1796,1801]},"\\r"]],"escapeChar_tab":["define",{"sourceInterval":[1863,1912]},null,[],["terminal",{"sourceInterval":[1863,1868]},"\\t"]],"escapeChar_unicodeEscape":["define",{"sourceInterval":[1919,1978]},null,[],["seq",{"sourceInterval":[1919,1960]},["terminal",{"sourceInterval":[1919,1924]},"\\u"],["app",{"sourceInterval":[1925,1933]},"hexDigit",[]],["app",{"sourceInterval":[1934,1942]},"hexDigit",[]],["app",{"sourceInterval":[1943,1951]},"hexDigit",[]],["app",{"sourceInterval":[1952,1960]},"hexDigit",[]]]],"escapeChar_hexEscape":["define",{"sourceInterval":[1985,2040]},null,[],["seq",{"sourceInterval":[1985,2008]},["terminal",{"sourceInterval":[1985,1990]},"\\x"],["app",{"sourceInterval":[1991,1999]},"hexDigit",[]],["app",{"sourceInterval":[2000,2008]},"hexDigit",[]]]],"escapeChar":["define",{"sourceInterval":[1444,2040]},"an escape sequence",[],["alt",{"sourceInterval":[1483,2040]},["app",{"sourceInterval":[1483,1489]},"escapeChar_backslash",[]],["app",{"sourceInterval":[1545,1551]},"escapeChar_doubleQuote",[]],["app",{"sourceInterval":[1609,1615]},"escapeChar_singleQuote",[]],["app",{"sourceInterval":[1673,1678]},"escapeChar_backspace",[]],["app",{"sourceInterval":[1735,1740]},"escapeChar_lineFeed",[]],["app",{"sourceInterval":[1796,1801]},"escapeChar_carriageReturn",[]],["app",{"sourceInterval":[1863,1868]},"escapeChar_tab",[]],["app",{"sourceInterval":[1919,1960]},"escapeChar_unicodeEscape",[]],["app",{"sourceInterval":[1985,2008]},"escapeChar_hexEscape",[]]]],"space":["extend",{"sourceInterval":[2044,2063]},null,[],["app",{"sourceInterval":[2056,2063]},"comment",[]]],"comment_singleLine":["define",{"sourceInterval":[2081,2118]},null,[],["seq",{"sourceInterval":[2081,2103]},["terminal",{"sourceInterval":[2081,2085]},"//"],["star",{"sourceInterval":[2086,2098]},["seq",{"sourceInterval":[2087,2096]},["not",{"sourceInterval":[2087,2092]},["terminal",{"sourceInterval":[2088,2092]},"\n"]],["app",{"sourceInterval":[2093,2096]},"any",[]]]],["terminal",{"sourceInterval":[2099,2103]},"\n"]]],"comment_multiLine":["define",{"sourceInterval":[2125,2161]},null,[],["seq",{"sourceInterval":[2125,2147]},["terminal",{"sourceInterval":[2125,2129]},"/*"],["star",{"sourceInterval":[2130,2142]},["seq",{"sourceInterval":[2131,2140]},["not",{"sourceInterval":[2131,2136]},["terminal",{"sourceInterval":[2132,2136]},"*/"]],["app",{"sourceInterval":[2137,2140]},"any",[]]]],["terminal",{"sourceInterval":[2143,2147]},"*/"]]],"comment":["define",{"sourceInterval":[2067,2161]},null,[],["alt",{"sourceInterval":[2081,2161]},["app",{"sourceInterval":[2081,2103]},"comment_singleLine",[]],["app",{"sourceInterval":[2125,2147]},"comment_multiLine",[]]]],"tokens":["define",{"sourceInterval":[2165,2180]},null,[],["star",{"sourceInterval":[2174,2180]},["app",{"sourceInterval":[2174,2179]},"token",[]]]],"token":["define",{"sourceInterval":[2184,2260]},null,[],["alt",{"sourceInterval":[2192,2260]},["app",{"sourceInterval":[2192,2200]},"caseName",[]],["app",{"sourceInterval":[2203,2210]},"comment",[]],["app",{"sourceInterval":[2213,2218]},"ident",[]],["app",{"sourceInterval":[2221,2229]},"operator",[]],["app",{"sourceInterval":[2232,2243]},"punctuation",[]],["app",{"sourceInterval":[2246,2254]},"terminal",[]],["app",{"sourceInterval":[2257,2260]},"any",[]]]],"operator":["define",{"sourceInterval":[2264,2329]},null,[],["alt",{"sourceInterval":[2275,2329]},["terminal",{"sourceInterval":[2275,2279]},"<:"],["terminal",{"sourceInterval":[2282,2285]},"="],["terminal",{"sourceInterval":[2288,2292]},":="],["terminal",{"sourceInterval":[2295,2299]},"+="],["terminal",{"sourceInterval":[2302,2305]},"*"],["terminal",{"sourceInterval":[2308,2311]},"+"],["terminal",{"sourceInterval":[2314,2317]},"?"],["terminal",{"sourceInterval":[2320,2323]},"~"],["terminal",{"sourceInterval":[2326,2329]},"&"]]],"punctuation":["define",{"sourceInterval":[2333,2369]},null,[],["alt",{"sourceInterval":[2347,2369]},["terminal",{"sourceInterval":[2347,2350]},"<"],["terminal",{"sourceInterval":[2353,2356]},">"],["terminal",{"sourceInterval":[2359,2362]},","],["terminal",{"sourceInterval":[2365,2369]},"--"]]]}]); },{"..":50}],12:[function(require,module,exports){ var ohm = require('..'); -module.exports = ohm.makeRecipe(function() { - var decl = this.newGrammar("OperationsAndAttributes") - .withSource("OperationsAndAttributes {\n\n AttributeSignature =\n name\n\n OperationSignature =\n name Formals?\n\n Formals\n = \"(\" ListOf \")\"\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = \"_\"\n | letter\n\n nameRest\n = \"_\"\n | alnum\n\n}") - .withDefaultStartRule("AttributeSignature") - return decl - .define("AttributeSignature", [], this.app("name").withInterval(decl.sourceInterval(54, 58))) - .define("OperationSignature", [], this.seq(this.app("name").withInterval(decl.sourceInterval(87, 91)), this.opt(this.app("Formals").withInterval(decl.sourceInterval(92, 99))).withInterval(decl.sourceInterval(92, 100))).withInterval(decl.sourceInterval(87, 100))) - .define("Formals", [], this.seq(this.terminal("(").withInterval(decl.sourceInterval(118, 121)), this.app("ListOf", [this.app("name").withInterval(decl.sourceInterval(129, 133)), this.terminal(",").withInterval(decl.sourceInterval(135, 138))]).withInterval(decl.sourceInterval(122, 139)), this.terminal(")").withInterval(decl.sourceInterval(140, 143))).withInterval(decl.sourceInterval(118, 143))) - .define("name", [], this.seq(this.app("nameFirst").withInterval(decl.sourceInterval(168, 177)), this.star(this.app("nameRest").withInterval(decl.sourceInterval(178, 186))).withInterval(decl.sourceInterval(178, 187))).withInterval(decl.sourceInterval(168, 187)), "a name") - .define("nameFirst", [], this.alt(this.terminal("_").withInterval(decl.sourceInterval(207, 210)), this.app("letter").withInterval(decl.sourceInterval(217, 223))).withInterval(decl.sourceInterval(207, 223))) - .define("nameRest", [], this.alt(this.terminal("_").withInterval(decl.sourceInterval(242, 245)), this.app("alnum").withInterval(decl.sourceInterval(252, 257))).withInterval(decl.sourceInterval(242, 257))) - .build(); -}); - +module.exports = ohm.makeRecipe(["grammar",{"source":"OperationsAndAttributes {\n\n AttributeSignature =\n name\n\n OperationSignature =\n name Formals?\n\n Formals\n = \"(\" ListOf \")\"\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = \"_\"\n | letter\n\n nameRest\n = \"_\"\n | alnum\n\n}"},"OperationsAndAttributes",null,"AttributeSignature",{"AttributeSignature":["define",{"sourceInterval":[29,58]},null,[],["app",{"sourceInterval":[54,58]},"name",[]]],"OperationSignature":["define",{"sourceInterval":[62,100]},null,[],["seq",{"sourceInterval":[87,100]},["app",{"sourceInterval":[87,91]},"name",[]],["opt",{"sourceInterval":[92,100]},["app",{"sourceInterval":[92,99]},"Formals",[]]]]],"Formals":["define",{"sourceInterval":[104,143]},null,[],["seq",{"sourceInterval":[118,143]},["terminal",{"sourceInterval":[118,121]},"("],["app",{"sourceInterval":[122,139]},"ListOf",[["app",{"sourceInterval":[129,133]},"name",[]],["terminal",{"sourceInterval":[135,138]},","]]],["terminal",{"sourceInterval":[140,143]},")"]]],"name":["define",{"sourceInterval":[147,187]},"a name",[],["seq",{"sourceInterval":[168,187]},["app",{"sourceInterval":[168,177]},"nameFirst",[]],["star",{"sourceInterval":[178,187]},["app",{"sourceInterval":[178,186]},"nameRest",[]]]]],"nameFirst":["define",{"sourceInterval":[191,223]},null,[],["alt",{"sourceInterval":[207,223]},["terminal",{"sourceInterval":[207,210]},"_"],["app",{"sourceInterval":[217,223]},"letter",[]]]],"nameRest":["define",{"sourceInterval":[227,257]},null,[],["alt",{"sourceInterval":[242,257]},["terminal",{"sourceInterval":[242,245]},"_"],["app",{"sourceInterval":[252,257]},"alnum",[]]]]}]); },{"..":50}],13:[function(require,module,exports){ 'use strict'; @@ -3450,6 +3364,7 @@ function extend(origin, add) { // -------------------------------------------------------------------- var GrammarDecl = require('./GrammarDecl'); +var Interval = require('./Interval'); var pexprs = require('./pexprs'); // -------------------------------------------------------------------- @@ -3459,10 +3374,45 @@ var pexprs = require('./pexprs'); function Builder() {} Builder.prototype = { + currentDecl: null, + newGrammar: function(name) { return new GrammarDecl(name); }, + grammar: function(metaInfo, name, superGrammar, defaultStartRule, rules) { + var gDecl = new GrammarDecl(name); + if (superGrammar) { + gDecl.withSuperGrammar(this.fromRecipe(superGrammar)); + } + if (defaultStartRule) { + gDecl.withDefaultStartRule(defaultStartRule); + } + if (metaInfo && metaInfo.source) { + gDecl.withSource(metaInfo.source); + } + + var self = this; + this.currentDecl = gDecl; + Object.keys(rules).forEach(function(ruleName) { + var ruleRecipe = rules[ruleName]; + + var action = ruleRecipe[0]; // define/extend/override + var metaInfo = ruleRecipe[1]; + var optDescription = ruleRecipe[2]; + var formals = ruleRecipe[3]; + var body = self.fromRecipe(ruleRecipe[4]); + if (gDecl.interval && metaInfo && metaInfo.sourceInterval) { + body.definitionInterval = new Interval(gDecl.interval.inputStream, + metaInfo.sourceInterval[0], metaInfo.sourceInterval[1]); + } + + gDecl[action](ruleName, formals, body, optDescription); + }); + this.currentDecl = null; + return gDecl.build(); + }, + terminal: function(x) { return new pexprs.Terminal(x); }, @@ -3479,6 +3429,9 @@ Builder.prototype = { var terms = []; for (var idx = 0; idx < arguments.length; idx++) { var arg = arguments[idx]; + if (!(arg instanceof pexprs.PExpr)) { + arg = this.fromRecipe(arg); + } if (arg instanceof pexprs.Alt) { terms = terms.concat(arg.terms); } else { @@ -3492,6 +3445,9 @@ Builder.prototype = { var factors = []; for (var idx = 0; idx < arguments.length; idx++) { var arg = arguments[idx]; + if (!(arg instanceof pexprs.PExpr)) { + arg = this.fromRecipe(arg); + } if (arg instanceof pexprs.Seq) { factors = factors.concat(arg.factors); } else { @@ -3502,31 +3458,76 @@ Builder.prototype = { }, star: function(expr) { + if (!(expr instanceof pexprs.PExpr)) { + expr = this.fromRecipe(expr); + } return new pexprs.Star(expr); }, plus: function(expr) { + if (!(expr instanceof pexprs.PExpr)) { + expr = this.fromRecipe(expr); + } return new pexprs.Plus(expr); }, opt: function(expr) { + if (!(expr instanceof pexprs.PExpr)) { + expr = this.fromRecipe(expr); + } return new pexprs.Opt(expr); }, not: function(expr) { + if (!(expr instanceof pexprs.PExpr)) { + expr = this.fromRecipe(expr); + } return new pexprs.Not(expr); }, la: function(expr) { + // TODO: temporary to still be able to read old recipes + return this.lookahead(expr); + }, + + lookahead: function(expr) { + if (!(expr instanceof pexprs.PExpr)) { + expr = this.fromRecipe(expr); + } return new pexprs.Lookahead(expr); }, lex: function(expr) { + if (!(expr instanceof pexprs.PExpr)) { + expr = this.fromRecipe(expr); + } return new pexprs.Lex(expr); }, app: function(ruleName, optParams) { + if (optParams && optParams.length > 0) { + optParams = optParams.map(function(param) { + return param instanceof pexprs.PExpr ? param : + this.fromRecipe(param); + }, this); + } return new pexprs.Apply(ruleName, optParams); + }, + + fromRecipe: function(recipe) { + // the meta-info of 'grammar' is proccessed in Builder.grammar + var result = this[recipe[0]].apply(this, + recipe[0] === 'grammar' ? recipe.slice(1) : recipe.slice(2)); + + var metaInfo = recipe[1]; + if (metaInfo) { + if (metaInfo.sourceInterval && this.currentDecl) { + result.withInterval( + this.currentDecl.sourceInterval.apply(this.currentDecl, metaInfo.sourceInterval) + ); + } + } + return result; } }; @@ -3536,7 +3537,7 @@ Builder.prototype = { module.exports = Builder; -},{"./GrammarDecl":39,"./pexprs":67}],37:[function(require,module,exports){ +},{"./GrammarDecl":39,"./Interval":41,"./pexprs":67}],37:[function(require,module,exports){ 'use strict'; // -------------------------------------------------------------------- @@ -3561,16 +3562,20 @@ function isValidType(type) { return type === 'description' || type === 'string' || type === 'code'; } -function Failure(text, type) { +function Failure(pexpr, text, type) { if (!isValidType(type)) { throw new Error('invalid Failure type: ' + type); } - + this.pexpr = pexpr; this.text = text; this.type = type; this.fluffy = false; } +Failure.prototype.getPExpr = function() { + return this.pexpr; +}; + Failure.prototype.getText = function() { return this.text; }; @@ -3616,7 +3621,7 @@ Failure.prototype.toString = function() { }; Failure.prototype.clone = function() { - var failure = new Failure(this.text, this.type); + var failure = new Failure(this.pexpr, this.text, this.type); if (this.isFluffy()) { failure.makeFluffy(); } @@ -3778,56 +3783,66 @@ Grammar.prototype = { }, toRecipe: function(optVarName) { - if (this.isBuiltIn()) { - throw new Error( - 'Why would anyone want to generate a recipe for the ' + this.name + ' grammar?!?!'); - } - var sb = new common.StringBuffer(); - if (optVarName) { - sb.append('var ' + optVarName + ' = '); - } - sb.append('(function() {\n'); - - // Include the supergrammar in the recipe if it's not a built-in grammar. - var superGrammarDecl = ''; - if (!this.superGrammar.isBuiltIn()) { - sb.append(this.superGrammar.toRecipe('buildSuperGrammar')); - superGrammarDecl = ' .withSuperGrammar(buildSuperGrammar.call(this))\n'; - } - sb.append(' var decl = this.newGrammar(' + JSON.stringify(this.name) + ')\n'); - + var metaInfo = {}; // Include the grammar source if it is available. if (this.definitionInterval) { - sb.append(' .withSource(' + JSON.stringify(this.definitionInterval.contents) + ')\n'); + metaInfo.source = this.definitionInterval.contents; } - sb.append(superGrammarDecl); + var superGrammar = null; + if (this.superGrammar && !this.superGrammar.isBuiltIn()) { + superGrammar = JSON.parse(this.superGrammar.toRecipe()); + } + + var startRule = null; if (this.defaultStartRule) { - sb.append(' .withDefaultStartRule("' + this.defaultStartRule + '")\n'); + startRule = this.defaultStartRule; } - sb.append(' return decl\n'); + var rules = {}; var self = this; Object.keys(this.ruleBodies).forEach(function(ruleName) { var body = self.ruleBodies[ruleName]; - sb.append(' .'); - if (self.superGrammar.ruleBodies[ruleName]) { - sb.append(body instanceof pexprs.Extend ? 'extend' : 'override'); - } else { - sb.append('define'); - } - var formals = self.ruleFormals[ruleName]; - var formalsString = '[' + formals.map(JSON.stringify).join(', ') + ']'; - sb.append('(' + JSON.stringify(ruleName) + ', ' + formalsString + ', '); - body.outputRecipe(sb, formals, self.definitionInterval); + var isDefinition = !self.superGrammar || !self.superGrammar.ruleBodies[ruleName]; - if (!self.superGrammar.ruleBodies[ruleName] && self.ruleDescriptions[ruleName]) { - sb.append(', ' + JSON.stringify(self.ruleDescriptions[ruleName])); + var operation; + if (isDefinition) { + operation = 'define'; + } else { + operation = body instanceof pexprs.Extend ? 'extend' : 'override'; } - sb.append(')\n'); + + var metaInfo = {}; + if (body.definitionInterval && self.definitionInterval) { + var adjusted = body.definitionInterval.relativeTo(self.definitionInterval); + metaInfo.sourceInterval = [adjusted.startIdx, adjusted.endIdx]; + } + + var description = null; + if (isDefinition && self.ruleDescriptions[ruleName]) { + description = self.ruleDescriptions[ruleName]; + } + + var formals = self.ruleFormals[ruleName]; + var ruleBody = body.outputRecipe(formals, self.definitionInterval); + + rules[ruleName] = [ + operation, // "define"/"extend"/"override" + metaInfo, + description, + formals, + ruleBody + ]; }); - sb.append(' .build();\n});\n'); - return sb.contents(); + + return JSON.stringify([ + 'grammar', + metaInfo, + this.name, + superGrammar, + startRule, + rules + ]); }, // TODO: Come up with better names for these methods. @@ -4132,6 +4147,7 @@ GrammarDecl.prototype.extend = function(name, formals, fragment) { } var body = new pexprs.Extend(this.superGrammar, name, fragment); body.interval = fragment.interval; + body.definitionInterval = fragment.definitionInterval; this.installOverriddenOrExtendedRule(name, formals, body); return this; }; @@ -4317,6 +4333,10 @@ Object.defineProperties(Interval.prototype, { return this._contents; }, enumerable: true + }, + length: { + get: function() { return this.endIdx - this.startIdx; }, + enumerable: true } }); @@ -4936,8 +4956,7 @@ Semantics.prototype.toRecipe = function(semanticsOnly) { if (!semanticsOnly) { str = '(function() {\n' + - ' var buildGrammar = ' + this.grammar.toRecipe() + - ' var grammar = buildGrammar.call(this);\n' + + ' var grammar = this.fromRecipe(' + this.grammar.toRecipe() + ');\n' + ' var semantics = ' + str + '(grammar);\n' + ' return semantics;\n' + '});\n'; @@ -5090,7 +5109,10 @@ Semantics.prototype.addOperationOrAttribute = function(type, signature, actionDi return '[' + name + ' operation]'; }; } else { - Object.defineProperty(this.Wrapper.prototype, name, {get: doIt}); + Object.defineProperty(this.Wrapper.prototype, name, { + get: doIt, + configurable: true // So the property can be deleted. + }); this.attributeKeys[name] = Symbol(); } }; @@ -5175,7 +5197,7 @@ Semantics.createSemantics = function(grammar, optSuperSemantics) { var cst = matchResult._cst; if (cst.grammar !== grammar) { throw new Error( - "Cannot use a CST node created by grammar '" + cst.grammar.name + + "Cannot use a MatchResult from grammar '" + cst.grammar.name + "' with a semantics for '" + grammar.name + "'"); } return s.wrap(cst); @@ -5206,6 +5228,18 @@ Semantics.createSemantics = function(grammar, optSuperSemantics) { } return action.actionDict; }; + proxy._remove = function(operationOrAttributeName) { + var semantic; + if (operationOrAttributeName in s.operations) { + semantic = s.operations[operationOrAttributeName]; + delete s.operations[operationOrAttributeName]; + } else if (operationOrAttributeName in s.attributes) { + semantic = s.attributes[operationOrAttributeName]; + delete s.attributes[operationOrAttributeName]; + } + delete s.Wrapper.prototype[operationOrAttributeName]; + return semantic; + }; proxy.getOperationNames = function() { return Object.keys(s.operations); }; @@ -5455,7 +5489,8 @@ State.prototype = { }, truncateBindings: function(newLength) { - // TODO: is this really faster than setting the `length` property? + // Yes, this is this really faster than setting the `length` property (tested with + // bin/es5bench on Node v6.1.0). while (this.bindings.length > newLength) { this.bindings.pop(); } @@ -5543,8 +5578,10 @@ State.prototype = { var posInfo = this.posInfos[pos]; if (posInfo && expr.ruleName) { var memoRec = posInfo.memo[expr.toMemoKey()]; - if (memoRec) { - return memoRec.traceEntry; + if (memoRec && memoRec.traceEntry) { + var entry = memoRec.traceEntry.cloneWithExpr(expr); + entry.isMemoized = true; + return entry; } } return null; @@ -5552,9 +5589,8 @@ State.prototype = { // Returns a new trace entry, with the currently active trace array as its children. getTraceEntry: function(pos, expr, succeeded, bindings) { - var memoEntry = this.getMemoizedTraceEntry(pos, expr); - return memoEntry ? memoEntry.cloneWithExpr(expr) - : new Trace(this.inputStream, pos, expr, succeeded, bindings, this.trace); + return this.getMemoizedTraceEntry(pos, expr) || + new Trace(this.inputStream, pos, expr, succeeded, bindings, this.trace); }, isTracing: function() { @@ -5734,10 +5770,12 @@ function Trace(inputStream, pos, expr, succeeded, bindings, optChildren) { this.bindings = bindings; this.children = optChildren || []; + this.isHeadOfLeftRecursion = false; // Is this the outermost LR application? this.isImplicitSpaces = false; - this.isLeftRecursive = false; this.isMemoized = false; this.isRootNode = false; + this.terminatesLR = false; + this.terminatingLREntry = null; } // A value that can be returned from visitor functions to indicate that a @@ -5748,15 +5786,30 @@ Object.defineProperty(Trace.prototype, 'displayString', { get: function() { return this.expr.toDisplayString(); } }); +Trace.prototype.clone = function() { + return this.cloneWithExpr(this.expr); +}; + Trace.prototype.cloneWithExpr = function(expr) { var ans = new Trace( this.inputStream, this.pos, expr, this.succeeded, this.bindings, this.children); - ans.isLeftRecursive = this.isLeftRecursive; + + ans.isHeadOfLeftRecursion = this.isHeadOfLeftRecursion; + ans.isImplicitSpaces = this.isImplicitSpaces; + ans.isMemoized = this.isMemoized; ans.isRootNode = this.isRootNode; - ans.isMemoized = true; + ans.terminatesLR = this.terminatesLR; + ans.terminatingLREntry = this.terminatingLREntry; return ans; }; +// Record the trace information for the terminating condition of the LR loop. +Trace.prototype.recordLRTermination = function(ruleBodyTrace, value) { + this.terminatingLREntry = + new Trace(this.inputStream, this.pos, this.expr, false, [value], [ruleBodyTrace]); + this.terminatingLREntry.terminatesLR = true; +}; + // Recursively traverse this trace node and all its descendents, calling a visitor function // for each node that is visited. If `vistorObjOrFn` is an object, then its 'enter' property // is a function to call before visiting the children of a node, and its 'exit' property is @@ -5780,14 +5833,8 @@ Trace.prototype.walk = function(visitorObjOrFn, optThisArg) { } } if (recurse) { - node.children.forEach(function(child, i) { - var nextChild = node.children[i + 1]; - if (nextChild && nextChild.expr === child.expr && nextChild.pos === child.pos) { - // Skip this child -- it is an intermediate left-recursive result. - common.assert(node.isLeftRecursive); - } else { - _walk(child, node, depth + 1); - } + node.children.forEach(function(child) { + _walk(child, node, depth + 1); }); if (visitor.exit) { visitor.exit.call(optThisArg, node, parent, depth); @@ -5820,7 +5867,7 @@ Trace.prototype.toString = function() { } sb.append(getInputExcerpt(node.inputStream, node.pos, 10) + spaces(depth * 2 + 1)); sb.append((node.succeeded ? CHECK_MARK : BALLOT_X) + ' ' + node.displayString); - if (node.isLeftRecursive) { + if (node.isHeadOfLeftRecursion) { sb.append(' (LR)'); } if (node.succeeded) { @@ -5872,10 +5919,13 @@ escapeStringFor['\u000b'.charCodeAt(0)] = '\\v'; // Exports // -------------------------------------------------------------------- -exports.abstract = function() { - throw new Error( - 'this method is abstract! ' + +exports.abstract = function(optMethodName) { + var methodName = optMethodName || ''; + return function() { + throw new Error( + 'this method ' + methodName + ' is abstract! ' + '(it has no implementation in class ' + this.constructor.name + ')'); + }; }; exports.assert = function(cond, message) { @@ -6380,8 +6430,8 @@ function buildGrammar(match, namespace, optOhmGrammarForTesting) { decl.ruleBodies[currentRuleName].definitionInterval = this.interval.trimmed(); return ans; }, - RuleBody: function(_, term, _bars, terms) { - var args = [term.visit()].concat(terms.visit()); + RuleBody: function(_, terms) { + var args = terms.visit(); return builder.alt.apply(builder, args).withInterval(this.interval); }, @@ -6393,8 +6443,8 @@ function buildGrammar(match, namespace, optOhmGrammarForTesting) { return ps.visit(); }, - Alt: function(seq, _, seqs) { - var args = [seq.visit()].concat(seqs.visit()); + Alt: function(seqs) { + var args = seqs.visit(); return builder.alt.apply(builder, args).withInterval(this.interval); }, @@ -6431,7 +6481,7 @@ function buildGrammar(match, namespace, optOhmGrammarForTesting) { return builder.not(x.visit()).withInterval(this.interval); }, Pred_lookahead: function(_, x) { - return builder.la(x.visit()).withInterval(this.interval); + return builder.lookahead(x.visit()).withInterval(this.interval); }, Lex_lex: function(_, x) { @@ -6579,8 +6629,16 @@ function grammarsFromScriptElements(optNodeOrNodeList) { return ns; } -function makeRecipe(recipeFn) { - return recipeFn.call(new Builder()); +function makeRecipe(recipe) { + if (typeof recipe === 'function') { + return recipe.call(new Builder()); + } else { + if (typeof recipe === 'string') { + // stringified JSON recipe + recipe = JSON.parse(recipe); + } + return (new Builder()).fromRecipe(recipe); + } } // -------------------------------------------------------------------- @@ -6802,7 +6860,9 @@ var pexprs = require('./pexprs'); /* Return true if we should skip spaces preceding this expression in a syntactic context. */ -pexprs.PExpr.prototype.allowsSkippingPrecedingSpace = common.abstract; +pexprs.PExpr.prototype.allowsSkippingPrecedingSpace = common.abstract( + 'allowsSkippingPrecedingSpace' +); /* Generally, these are all first-order expressions that operate on strings and (with the @@ -6853,7 +6913,9 @@ pexprs.PExpr.prototype.assertAllApplicationsAreValid = function(ruleName, gramma this._assertAllApplicationsAreValid(ruleName, grammar); }; -pexprs.PExpr.prototype._assertAllApplicationsAreValid = common.abstract; +pexprs.PExpr.prototype._assertAllApplicationsAreValid = common.abstract( + '_assertAllApplicationsAreValid' +); pexprs.any._assertAllApplicationsAreValid = pexprs.end._assertAllApplicationsAreValid = @@ -6933,7 +6995,9 @@ var pexprs = require('./pexprs'); // Operations // -------------------------------------------------------------------- -pexprs.PExpr.prototype.assertChoicesHaveUniformArity = common.abstract; +pexprs.PExpr.prototype.assertChoicesHaveUniformArity = common.abstract( + 'assertChoicesHaveUniformArity' +); pexprs.any.assertChoicesHaveUniformArity = pexprs.end.assertChoicesHaveUniformArity = @@ -7008,7 +7072,9 @@ var pexprs = require('./pexprs'); // Operations // -------------------------------------------------------------------- -pexprs.PExpr.prototype.assertIteratedExprsAreNotNullable = common.abstract; +pexprs.PExpr.prototype.assertIteratedExprsAreNotNullable = common.abstract( + 'assertIteratedExprsAreNotNullable' +); pexprs.any.assertIteratedExprsAreNotNullable = pexprs.end.assertIteratedExprsAreNotNullable = @@ -7068,7 +7134,7 @@ var pexprs = require('./pexprs'); // Operations // -------------------------------------------------------------------- -pexprs.PExpr.prototype.check = common.abstract; +pexprs.PExpr.prototype.check = common.abstract('check'); pexprs.any.check = function(grammar, vals) { return vals.length >= 1; @@ -7211,7 +7277,7 @@ var IterationNode = nodes.IterationNode; Note that `State.prototype.eval(expr)`, unlike this method, guarantees that neither the state object's bindings nor its input stream's position will change if the expression fails to match. */ -pexprs.PExpr.prototype.eval = common.abstract; // function(state) { ... } +pexprs.PExpr.prototype.eval = common.abstract('eval'); // function(state) { ... } pexprs.any.eval = function(state) { var inputStream = state.inputStream; @@ -7424,7 +7490,7 @@ pexprs.Apply.prototype.reallyEval = function(state) { var value = this.evalOnce(body, state); var currentLR = origPosInfo.currentLeftRecursion; var memoKey = this.toMemoKey(); - var isHeadOfLeftRecursion = currentLR && currentLR.headApplication.toMemoKey() === memoKey; + var isHeadOfLeftRecursion = !!currentLR && currentLR.headApplication.toMemoKey() === memoKey; var memoized = true; if (isHeadOfLeftRecursion) { @@ -7457,7 +7523,10 @@ pexprs.Apply.prototype.reallyEval = function(state) { if (state.isTracing() && origPosInfo.memo[memoKey]) { var succeeded = !!value; var entry = state.getTraceEntry(origPos, this, succeeded, succeeded ? [value] : []); - entry.isLeftRecursive = isHeadOfLeftRecursion; + if (isHeadOfLeftRecursion) { + common.assert(entry.terminatingLREntry != null || !succeeded); + entry.isHeadOfLeftRecursion = true; + } origPosInfo.memo[memoKey].traceEntry = entry; } @@ -7500,21 +7569,24 @@ pexprs.Apply.prototype.growSeedResult = function(body, state, origPos, lrMemoRec if (state.isTracing()) { // Before evaluating the body again, add a trace node for this application to the memo entry. - // Its only child is the trace node from `newValue`, which will always be the last element - // in `state.trace`. - var children = state.trace.slice(-1); + // Its only child is a copy of the trace node from `newValue`, which will always be the last + // element in `state.trace`. + var seedTrace = state.trace[state.trace.length - 1]; lrMemoRec.traceEntry = new Trace( - state.inputStream, origPos, this, true, [newValue], children); + state.inputStream, origPos, this, true, [newValue], [seedTrace.clone()]); } inputStream.pos = origPos; newValue = this.evalOnce(body, state); if (inputStream.pos <= lrMemoRec.pos) { break; } + if (state.isTracing()) { + state.trace.splice(-2, 1); // Drop the trace for the old seed. + } } if (state.isTracing()) { - state.trace.pop(); // Drop last trace entry since `value` was unused. - lrMemoRec.traceEntry = null; + // The last entry is for an unused result -- pop it and save it in the "real" entry. + lrMemoRec.traceEntry.recordLRTermination(state.trace.pop(), newValue); } inputStream.pos = lrMemoRec.pos; return lrMemoRec.value; @@ -7548,7 +7620,7 @@ var pexprs = require('./pexprs'); // Operations // -------------------------------------------------------------------- -pexprs.PExpr.prototype.getArity = common.abstract; +pexprs.PExpr.prototype.getArity = common.abstract('getArity'); pexprs.any.getArity = pexprs.end.getArity = @@ -7606,7 +7678,7 @@ var pexprs = require('./pexprs'); parameter with a `Param` node. Returns a PExpr -- either a new one, or the original one if it was modified in place. */ -pexprs.PExpr.prototype.introduceParams = common.abstract; +pexprs.PExpr.prototype.introduceParams = common.abstract('introduceParams'); pexprs.any.introduceParams = pexprs.end.introduceParams = @@ -7674,7 +7746,7 @@ pexprs.PExpr.prototype.isNullable = function(grammar) { return this._isNullable(grammar, Object.create(null)); }; -pexprs.PExpr.prototype._isNullable = common.abstract; +pexprs.PExpr.prototype._isNullable = common.abstract('_isNullable'); pexprs.any._isNullable = pexprs.Range.prototype._isNullable = @@ -7743,118 +7815,107 @@ var pexprs = require('./pexprs'); // Private stuff // -------------------------------------------------------------------- -function escapeString(str) { - var output = JSON.stringify(str); - output = output.replace(/[\u2028\u2029]/g, function(char, pos, str) { - var hex = char.codePointAt(0).toString(16); - return '\\u' + '0000'.slice(hex.length) + hex; - }); - return output; -} - -function getIntervalInfo(expr, grammarInterval) { +function getMetaInfo(expr, grammarInterval) { + var metaInfo = {}; if (expr.interval && grammarInterval) { var adjusted = expr.interval.relativeTo(grammarInterval); - var start = adjusted.startIdx; - var end = adjusted.endIdx; - return '.withInterval(decl.sourceInterval(' + start + ', ' + end + '))'; + metaInfo.sourceInterval = [adjusted.startIdx, adjusted.endIdx]; } - return ''; + return metaInfo; } // -------------------------------------------------------------------- // Operations // -------------------------------------------------------------------- -pexprs.PExpr.prototype.outputRecipe = common.abstract; +pexprs.PExpr.prototype.outputRecipe = common.abstract('outputRecipe'); -pexprs.any.outputRecipe = function(sb, formals, grammarInterval) { - throw new Error('should never output a recipe for `any` expression'); +pexprs.any.outputRecipe = function(formals, grammarInterval) { + return ['any', getMetaInfo(this, grammarInterval)]; }; -pexprs.end.outputRecipe = function(sb, formals, grammarInterval) { - throw new Error('should never output a recipe for `end` expression'); +pexprs.end.outputRecipe = function(formals, grammarInterval) { + return ['end', getMetaInfo(this, grammarInterval)]; }; -pexprs.Terminal.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.terminal('); - sb.append(typeof this.obj === 'string' ? escapeString(this.obj) : '' + this.obj); - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.Terminal.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'terminal', + getMetaInfo(this, grammarInterval), + this.obj + ]; }; -pexprs.Range.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.range('); - sb.append(JSON.stringify(this.from)); - sb.append(', '); - sb.append(JSON.stringify(this.to)); - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.Range.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'range', + getMetaInfo(this, grammarInterval), + this.from, + this.to + ]; }; -pexprs.Param.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.param(' + this.index + ')' + getIntervalInfo(this, grammarInterval)); +pexprs.Param.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'param', + getMetaInfo(this, grammarInterval), + this.index + ]; }; -pexprs.Alt.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.alt('); - for (var idx = 0; idx < this.terms.length; idx++) { - if (idx > 0) { - sb.append(', '); - } - this.terms[idx].outputRecipe(sb, formals, grammarInterval); - } - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.Alt.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'alt', + getMetaInfo(this, grammarInterval) + ].concat(this.terms.map(function(term) { + return term.outputRecipe(formals, grammarInterval); + })); }; -pexprs.Extend.prototype.outputRecipe = function(sb, formals, grammarInterval) { +pexprs.Extend.prototype.outputRecipe = function(formals, grammarInterval) { var extension = this.terms[0]; // [extension, orginal] - extension.outputRecipe(sb, formals, grammarInterval); + return extension.outputRecipe(formals, grammarInterval); }; -pexprs.Seq.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.seq('); - for (var idx = 0; idx < this.factors.length; idx++) { - if (idx > 0) { - sb.append(', '); - } - this.factors[idx].outputRecipe(sb, formals, grammarInterval); - } - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.Seq.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'seq', + getMetaInfo(this, grammarInterval) + ].concat(this.factors.map(function(factor) { + return factor.outputRecipe(formals, grammarInterval); + })); }; pexprs.Star.prototype.outputRecipe = pexprs.Plus.prototype.outputRecipe = pexprs.Opt.prototype.outputRecipe = pexprs.Not.prototype.outputRecipe = -pexprs.Lex.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.' + this.constructor.name.toLowerCase() + '('); - this.expr.outputRecipe(sb, formals, grammarInterval); - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.Lookahead.prototype.outputRecipe = +pexprs.Lex.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + this.constructor.name.toLowerCase(), + getMetaInfo(this, grammarInterval), + this.expr.outputRecipe(formals, grammarInterval) + ]; }; -pexprs.Lookahead.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.la('); - this.expr.outputRecipe(sb, formals, grammarInterval); - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.Apply.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'app', + getMetaInfo(this, grammarInterval), + this.ruleName, + this.args.map(function(arg) { + return arg.outputRecipe(formals, grammarInterval); + }) + ]; }; -pexprs.Apply.prototype.outputRecipe = function(sb, formals, grammarInterval) { - sb.append('this.app('); - sb.append(JSON.stringify(this.ruleName)); - if (this.ruleName.indexOf('_') >= 0 && formals.length > 0) { - var apps = formals. - map(function(_, idx) { return 'this.param(' + idx + ')'; }); - sb.append(', [' + apps.join(', ') + ']'); - } else if (this.args.length > 0) { - sb.append(', ['); - this.args.forEach(function(arg, idx) { - if (idx > 0) { - sb.append(', '); - } - arg.outputRecipe(sb, formals, grammarInterval); - }); - sb.append(']'); - } - sb.append(')' + getIntervalInfo(this, grammarInterval)); +pexprs.UnicodeChar.prototype.outputRecipe = function(formals, grammarInterval) { + return [ + 'unicodeChar', + getMetaInfo(this, grammarInterval), + this.category + ]; }; },{"./common":48,"./pexprs":67}],62:[function(require,module,exports){ @@ -7877,7 +7938,8 @@ var pexprs = require('./pexprs'); The receiver must not be modified; a new PExpr must be returned if any replacement is necessary. */ -pexprs.PExpr.prototype.substituteParams = common.abstract; // function(actuals) { ... } +// function(actuals) { ... } +pexprs.PExpr.prototype.substituteParams = common.abstract('substituteParams'); pexprs.any.substituteParams = pexprs.end.substituteParams = @@ -7932,86 +7994,14 @@ var pexprs = require('./pexprs'); var copyWithoutDuplicates = common.copyWithoutDuplicates; // -------------------------------------------------------------------- -// Operations +// Private stuff // -------------------------------------------------------------------- -/* - Returns a list of strings that will be used as the default argument names for its receiver - (a pexpr) in a semantic action. This is used exclusively by the Semantics Editor. - - `firstArgIndex` is the 1-based index of the first argument name that will be generated for this - pexpr. It enables us to name arguments positionally, e.g., if the second argument is a - non-alphanumeric terminal like "+", it will be named '$2'. - - Here is a more elaborate example that illustrates how this method works: - `(a "+" b).toArgumentNameList(1)` evaluates to `['a', '$2', 'b']` with the following recursive - calls: - - (a).toArgumentNameList(1) -> ['a'], - ("+").toArgumentNameList(2) -> ['$2'], - (b).toArgumentNameList(3) -> ['b'] - - Notes: - * This method must only be called on well-formed expressions, e.g., the receiver must - not have any Alt sub-expressions with inconsistent arities. - * e.getArity() === e.toArgumentNameList(1).length -*/ -pexprs.PExpr.prototype.toArgumentNameList = common.abstract; // function(firstArgIndex) { ... } - -pexprs.any.toArgumentNameList = function(firstArgIndex) { - return ['any']; -}; - -pexprs.end.toArgumentNameList = function(firstArgIndex) { - return ['end']; -}; - -pexprs.Terminal.prototype.toArgumentNameList = function(firstArgIndex) { - if (typeof this.obj === 'string' && /^[_a-zA-Z0-9]+$/.test(this.obj)) { - // If this terminal is a valid suffix for a JS identifier, just prepend it with '_' - return ['_' + this.obj]; - } else { - // Otherwise, name it positionally. - return ['$' + firstArgIndex]; - } -}; - -pexprs.Range.prototype.toArgumentNameList = function(firstArgIndex) { - return [this.from + '_to_' + this.to]; -}; - -pexprs.Alt.prototype.toArgumentNameList = function(firstArgIndex) { - // `termArgNameLists` is an array of arrays where each row is the - // argument name list that corresponds to a term in this alternation. - var termArgNameLists = this.terms.map(function(term) { - return term.toArgumentNameList(firstArgIndex); - }); - - var argumentNameList = []; - var numArgs = termArgNameLists[0].length; - for (var colIdx = 0; colIdx < numArgs; colIdx++) { - var col = []; - for (var rowIdx = 0; rowIdx < this.terms.length; rowIdx++) { - col.push(termArgNameLists[rowIdx][colIdx]); - } - var uniqueNames = copyWithoutDuplicates(col); - argumentNameList.push(uniqueNames.join('_or_')); - } - - return argumentNameList; -}; - -pexprs.Seq.prototype.toArgumentNameList = function(firstArgIndex) { - // Generate the argument name list, without worrying about duplicates. - var argumentNameList = []; - this.factors.forEach(function(factor) { - var factorArgumentNameList = factor.toArgumentNameList(firstArgIndex); - argumentNameList = argumentNameList.concat(factorArgumentNameList); - - // Shift the firstArgIndex to take this factor's argument names into account. - firstArgIndex += factorArgumentNameList.length; - }); +function isRestrictedJSIdentifier(str) { + return /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(str); +} +function resolveDuplicatedNames(argumentNameList) { // `count` is used to record the number of times each argument name occurs in the list, // this is useful for checking duplicated argument name. It maps argument names to ints. var count = Object.create(null); @@ -8033,39 +8023,149 @@ pexprs.Seq.prototype.toArgumentNameList = function(firstArgIndex) { } }); }); +} +// -------------------------------------------------------------------- +// Operations +// -------------------------------------------------------------------- + +/* + Returns a list of strings that will be used as the default argument names for its receiver + (a pexpr) in a semantic action. This is used exclusively by the Semantics Editor. + + `firstArgIndex` is the 1-based index of the first argument name that will be generated for this + pexpr. It enables us to name arguments positionally, e.g., if the second argument is a + non-alphanumeric terminal like "+", it will be named '$2'. + + `noDupCheck` is true if the caller of `toArgumentNameList` is not a top level caller. It enables + us to avoid nested duplication subscripts appending, e.g., '_1_1', '_1_2', by only checking + duplicates at the top level. + + Here is a more elaborate example that illustrates how this method works: + `(a "+" b).toArgumentNameList(1)` evaluates to `['a', '$2', 'b']` with the following recursive + calls: + + (a).toArgumentNameList(1) -> ['a'], + ("+").toArgumentNameList(2) -> ['$2'], + (b).toArgumentNameList(3) -> ['b'] + + Notes: + * This method must only be called on well-formed expressions, e.g., the receiver must + not have any Alt sub-expressions with inconsistent arities. + * e.getArity() === e.toArgumentNameList(1).length +*/ +// function(firstArgIndex, noDupCheck) { ... } +pexprs.PExpr.prototype.toArgumentNameList = common.abstract('toArgumentNameList'); + +pexprs.any.toArgumentNameList = function(firstArgIndex, noDupCheck) { + return ['any']; +}; + +pexprs.end.toArgumentNameList = function(firstArgIndex, noDupCheck) { + return ['end']; +}; + +pexprs.Terminal.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + if (typeof this.obj === 'string' && /^[_a-zA-Z0-9]+$/.test(this.obj)) { + // If this terminal is a valid suffix for a JS identifier, just prepend it with '_' + return ['_' + this.obj]; + } else { + // Otherwise, name it positionally. + return ['$' + firstArgIndex]; + } +}; + +pexprs.Range.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + var argName = this.from + '_to_' + this.to; + // If the `argName` is not valid then try to prepend a `_`. + if (!isRestrictedJSIdentifier(argName)) { + argName = '_' + argName; + } + // If the `argName` still not valid after prepending a `_`, then name it positionally. + if (!isRestrictedJSIdentifier(argName)) { + argName = '$' + firstArgIndex; + } + return [argName]; +}; + +pexprs.Alt.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + // `termArgNameLists` is an array of arrays where each row is the + // argument name list that corresponds to a term in this alternation. + var termArgNameLists = this.terms.map(function(term) { + return term.toArgumentNameList(firstArgIndex, true); + }); + + var argumentNameList = []; + var numArgs = termArgNameLists[0].length; + for (var colIdx = 0; colIdx < numArgs; colIdx++) { + var col = []; + for (var rowIdx = 0; rowIdx < this.terms.length; rowIdx++) { + col.push(termArgNameLists[rowIdx][colIdx]); + } + var uniqueNames = copyWithoutDuplicates(col); + argumentNameList.push(uniqueNames.join('_or_')); + } + + if (!noDupCheck) { + resolveDuplicatedNames(argumentNameList); + } return argumentNameList; }; -pexprs.Iter.prototype.toArgumentNameList = function(firstArgIndex) { - return this.expr.toArgumentNameList(firstArgIndex).map(function(exprArgumentString) { - return exprArgumentString[exprArgumentString.length - 1] === 's' ? - exprArgumentString + 'es' : - exprArgumentString + 's'; +pexprs.Seq.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + // Generate the argument name list, without worrying about duplicates. + var argumentNameList = []; + this.factors.forEach(function(factor) { + var factorArgumentNameList = factor.toArgumentNameList(firstArgIndex, true); + argumentNameList = argumentNameList.concat(factorArgumentNameList); + + // Shift the firstArgIndex to take this factor's argument names into account. + firstArgIndex += factorArgumentNameList.length; }); + if (!noDupCheck) { + resolveDuplicatedNames(argumentNameList); + } + return argumentNameList; }; -pexprs.Opt.prototype.toArgumentNameList = function(firstArgIndex) { - return this.expr.toArgumentNameList(firstArgIndex).map(function(argName) { +pexprs.Iter.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + var argumentNameList = this.expr.toArgumentNameList(firstArgIndex, noDupCheck) + .map(function(exprArgumentString) { + return exprArgumentString[exprArgumentString.length - 1] === 's' ? + exprArgumentString + 'es' : + exprArgumentString + 's'; + }); + if (!noDupCheck) { + resolveDuplicatedNames(argumentNameList); + } + return argumentNameList; +}; + +pexprs.Opt.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + return this.expr.toArgumentNameList(firstArgIndex, noDupCheck).map(function(argName) { return 'opt' + argName[0].toUpperCase() + argName.slice(1); }); }; -pexprs.Not.prototype.toArgumentNameList = function(firstArgIndex) { +pexprs.Not.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { return []; }; pexprs.Lookahead.prototype.toArgumentNameList = -pexprs.Lex.prototype.toArgumentNameList = function(firstArgIndex) { - return this.expr.toArgumentNameList(firstArgIndex); +pexprs.Lex.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + return this.expr.toArgumentNameList(firstArgIndex, noDupCheck); }; -pexprs.Apply.prototype.toArgumentNameList = function(firstArgIndex) { +pexprs.Apply.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { return [this.ruleName]; }; -pexprs.UnicodeChar.prototype.toArgumentNameList = function(firstArgIndex) { - return '$' + firstArgIndex; +pexprs.UnicodeChar.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + return ['$' + firstArgIndex]; +}; + +pexprs.Param.prototype.toArgumentNameList = function(firstArgIndex, noDupCheck) { + return ['param' + this.index]; }; // "Value pexprs" (Value, Str, Arr, Obj) are going away soon, so we don't worry about them here. @@ -8085,7 +8185,7 @@ var pexprs = require('./pexprs'); // -------------------------------------------------------------------- // Returns a string representing the PExpr, for use as a UI label, etc. -pexprs.PExpr.prototype.toDisplayString = common.abstract; +pexprs.PExpr.prototype.toDisplayString = common.abstract('toDisplayString'); pexprs.Alt.prototype.toDisplayString = pexprs.Seq.prototype.toDisplayString = @@ -8142,47 +8242,46 @@ var pexprs = require('./pexprs'); // Operations // -------------------------------------------------------------------- -pexprs.PExpr.prototype.toFailure = common.abstract; +pexprs.PExpr.prototype.toFailure = function(grammar) { + return new Failure(this, 'something unsupported', 'description'); +}; +//common.abstract('toFailure'); pexprs.any.toFailure = function(grammar) { - return new Failure('any object', 'description'); + return new Failure(this, 'any object', 'description'); }; pexprs.end.toFailure = function(grammar) { - return new Failure('end of input', 'description'); + return new Failure(this, 'end of input', 'description'); }; pexprs.Terminal.prototype.toFailure = function(grammar) { - return typeof this.obj === 'string' ? - new Failure(this.obj, 'string') : - new Failure(JSON.stringify(this.obj), 'code'); + return new Failure(this, this.obj, 'string'); }; pexprs.Range.prototype.toFailure = function(grammar) { // TODO: come up with something better - return new Failure(JSON.stringify(this.from) + '..' + JSON.stringify(this.to), 'code'); + return new Failure(this, JSON.stringify(this.from) + '..' + JSON.stringify(this.to), 'code'); }; pexprs.Not.prototype.toFailure = function(grammar) { var description = this.expr === pexprs.any ? 'nothing' : 'not ' + this.expr.toFailure(grammar); - return new Failure(description, 'description'); + return new Failure(this, description, 'description'); }; -// TODO: think about Arr, Str, and Obj - pexprs.Apply.prototype.toFailure = function(grammar) { var description = grammar.ruleDescriptions[this.ruleName]; if (!description) { var article = (/^[aeiouAEIOU]/.test(this.ruleName) ? 'an' : 'a'); description = article + ' ' + this.ruleName; } - return new Failure(description, 'description'); + return new Failure(this, description, 'description'); }; pexprs.UnicodeChar.prototype.toFailure = function(grammar) { - return new Failure(this.toDisplayString(), 'description'); + return new Failure(this, this.toDisplayString(), 'description'); }; },{"./Failure":37,"./common":48,"./pexprs":67}],66:[function(require,module,exports){ @@ -8206,7 +8305,7 @@ var pexprs = require('./pexprs'); ~"b" "a" and "a" are interchangeable in any grammar, both in terms of the languages they accept and their arities. */ -pexprs.PExpr.prototype.toString = common.abstract; +pexprs.PExpr.prototype.toString = common.abstract('toString'); pexprs.any.toString = function() { return 'any'; diff --git a/dist/syndicatecompiler.min.js b/dist/syndicatecompiler.min.js index 25f418b..9220a91 100644 --- a/dist/syndicatecompiler.min.js +++ b/dist/syndicatecompiler.min.js @@ -1,8 +1,8 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SyndicateCompiler=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o1){switch(this.args.mode){case"pattern":rhsExpr.buildSubscription(this.args.acc,this.args.mode);break;case"instantiated":lhsExpr.buildSubscription(this.args.acc,this.args.mode);break;case"projection":{this.args.acc.push("(Syndicate._$("+JSON.stringify(i.slice(1))+",");rhsExpr.buildSubscription(this.args.acc,this.args.mode);this.args.acc.push("))");break}default:throw new Error("Unexpected buildSubscription mode "+this.args.mode)}}else{lhsExpr.buildSubscription(this.args.acc,this.args.mode);_assignmentOperator.buildSubscription(this.args.acc,this.args.mode);rhsExpr.buildSubscription(this.args.acc,this.args.mode)}},identifier:function(_name){var i=this.interval.contents;if(i[0]==="$"&&i.length>1){switch(this.args.mode){case"pattern":this.args.acc.push("_");break;case"instantiated":this.args.acc.push(i.slice(1));break;case"projection":this.args.acc.push("(Syndicate._$("+JSON.stringify(i.slice(1))+"))");break;default:throw new Error("Unexpected buildSubscription mode "+this.args.mode)}}else{this.args.acc.push(i)}},_terminal:function(){this.args.acc.push(this.interval.contents)},_nonterminal:function(children){var self=this;forEachChild(children,function(c){c.buildSubscription(self.args.acc,self.args.mode)})}});semantics.addAttribute("bindings",{_default:function(children){var result=[];this.pushBindings(result);return result}});semantics.addOperation("pushBindings(accumulator)",{identifier:function(_name){var i=this.interval.contents;if(i[0]==="$"&&i.length>1){this.args.accumulator.push(i.slice(1))}},_terminal:function(){},_nonterminal:function(children){var self=this;children.forEach(function(c){c.pushBindings(self.args.accumulator)})}});function compileSyndicateSource(inputSource,onError){var parseResult=grammar.match(inputSource);if(parseResult.failed()){if(onError){return onError(parseResult.message,parseResult)}else{console.error(parseResult.message);return false}}else{return'"use strict";\n'+semantics(parseResult).asES5}}module.exports.grammar=grammar;module.exports.semantics=semantics;module.exports.compileSyndicateSource=compileSyndicateSource}).call(this,require("buffer").Buffer)},{"./es5.js":2,buffer:4,"ohm-js":50,path:8}],2:[function(require,module,exports){(function(Buffer){"use strict";var path=require("path");var ohm=require("ohm-js");function isUndefined(x){return x===void 0}function flattenIterNodes(nodes){var result=[];for(var i=0;i=kMaxLength()){throw new RangeError("Attempt to allocate Buffer larger than maximum "+"size: 0x"+kMaxLength().toString(16)+" bytes")}return length|0}function SlowBuffer(length){if(+length!=length){length=0}return Buffer.alloc(+length)}Buffer.isBuffer=function isBuffer(b){return!!(b!=null&&b._isBuffer)};Buffer.compare=function compare(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){throw new TypeError("Arguments must be Buffers")}if(a===b)return 0;var x=a.length;var y=b.length;for(var i=0,len=Math.min(x,y);i>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase();loweredCase=true}}}Buffer.byteLength=byteLength;function slowToString(encoding,start,end){var loweredCase=false;if(start===undefined||start<0){start=0}if(start>this.length){return""}if(end===undefined||end>this.length){end=this.length}if(end<=0){return""}end>>>=0;start>>>=0;if(end<=start){return""}if(!encoding)encoding="utf8";while(true){switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"binary":return binarySlice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase();loweredCase=true}}}Buffer.prototype._isBuffer=true;function swap(b,n,m){var i=b[n];b[n]=b[m];b[m]=i}Buffer.prototype.swap16=function swap16(){var len=this.length;if(len%2!==0){throw new RangeError("Buffer size must be a multiple of 16-bits")}for(var i=0;i0){str=this.toString("hex",0,max).match(/.{2}/g).join(" ");if(this.length>max)str+=" ... "}return""};Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target)){throw new TypeError("Argument must be a Buffer")}if(start===undefined){start=0}if(end===undefined){end=target?target.length:0}if(thisStart===undefined){thisStart=0}if(thisEnd===undefined){thisEnd=this.length}if(start<0||end>target.length||thisStart<0||thisEnd>this.length){throw new RangeError("out of range index")}if(thisStart>=thisEnd&&start>=end){return 0}if(thisStart>=thisEnd){return-1}if(start>=end){return 1}start>>>=0;end>>>=0;thisStart>>>=0;thisEnd>>>=0;if(this===target)return 0;var x=thisEnd-thisStart;var y=end-start;var len=Math.min(x,y);var thisCopy=this.slice(thisStart,thisEnd);var targetCopy=target.slice(start,end);for(var i=0;i2147483647){byteOffset=2147483647}else if(byteOffset<-2147483648){byteOffset=-2147483648}byteOffset>>=0;if(this.length===0)return-1;if(byteOffset>=this.length)return-1;if(byteOffset<0)byteOffset=Math.max(this.length+byteOffset,0);if(typeof val==="string"){val=Buffer.from(val,encoding)}if(Buffer.isBuffer(val)){if(val.length===0){return-1}return arrayIndexOf(this,val,byteOffset,encoding)}if(typeof val==="number"){if(Buffer.TYPED_ARRAY_SUPPORT&&Uint8Array.prototype.indexOf==="function"){return Uint8Array.prototype.indexOf.call(this,val,byteOffset)}return arrayIndexOf(this,[val],byteOffset,encoding)}throw new TypeError("val must be string, number or Buffer")};Buffer.prototype.includes=function includes(val,byteOffset,encoding){return this.indexOf(val,byteOffset,encoding)!==-1};function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;if(!length){length=remaining}else{length=Number(length);if(length>remaining){length=remaining}}var strLen=string.length;if(strLen%2!==0)throw new Error("Invalid hex string");if(length>strLen/2){length=strLen/2}for(var i=0;iremaining)length=remaining;if(string.length>0&&(length<0||offset<0)||offset>this.length){throw new RangeError("Attempt to write outside buffer bounds")}if(!encoding)encoding="utf8";var loweredCase=false;for(;;){switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"binary":return binaryWrite(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase();loweredCase=true}}};Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(buf,start,end){if(start===0&&end===buf.length){return base64.fromByteArray(buf)}else{return base64.fromByteArray(buf.slice(start,end))}}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);var res=[];var i=start;while(i239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:if(firstByte<128){codePoint=firstByte}break;case 2:secondByte=buf[i+1];if((secondByte&192)===128){tempCodePoint=(firstByte&31)<<6|secondByte&63;if(tempCodePoint>127){codePoint=tempCodePoint}}break;case 3:secondByte=buf[i+1];thirdByte=buf[i+2];if((secondByte&192)===128&&(thirdByte&192)===128){tempCodePoint=(firstByte&15)<<12|(secondByte&63)<<6|thirdByte&63;if(tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)){codePoint=tempCodePoint}}break;case 4:secondByte=buf[i+1];thirdByte=buf[i+2];fourthByte=buf[i+3];if((secondByte&192)===128&&(thirdByte&192)===128&&(fourthByte&192)===128){tempCodePoint=(firstByte&15)<<18|(secondByte&63)<<12|(thirdByte&63)<<6|fourthByte&63;if(tempCodePoint>65535&&tempCodePoint<1114112){codePoint=tempCodePoint}}}}if(codePoint===null){codePoint=65533;bytesPerSequence=1}else if(codePoint>65535){codePoint-=65536;res.push(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}res.push(codePoint);i+=bytesPerSequence}return decodeCodePointsArray(res)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH){return String.fromCharCode.apply(String,codePoints)}var res="";var i=0;while(ilen)end=len;var out="";for(var i=start;ilen){start=len}if(end<0){end+=len;if(end<0)end=0}else if(end>len){end=len}if(endlength)throw new RangeError("Trying to access beyond buffer length")}Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i0&&(mul*=256)){val+=this[offset+--byteLength]*mul}return val};Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);return this[offset]};Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]|this[offset+1]<<8};Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]<<8|this[offset+1]};Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+this[offset+3]*16777216};Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]*16777216+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])};Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var i=byteLength;var mul=1;var val=this[offset+--i];while(i>0&&(mul*=256)){val+=this[offset+--i]*mul}mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readInt8=function readInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);if(!(this[offset]&128))return this[offset];return(255-this[offset]+1)*-1};Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24};Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]};Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,true,23,4)};Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,false,23,4)};Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,true,52,8)};Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,false,52,8)};function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||valuebuf.length)throw new RangeError("Index out of range")}Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;byteLength=byteLength|0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1;var i=0;this[offset]=value&255;while(++i=0&&(mul*=256)){this[offset+i]=value/mul&255}return offset+byteLength};Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,255,0);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);this[offset]=value&255;return offset+1};function objectWriteUInt16(buf,value,offset,littleEndian){if(value<0)value=65535+value+1;for(var i=0,j=Math.min(buf.length-offset,2);i>>(littleEndian?i:1-i)*8}}Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};function objectWriteUInt32(buf,value,offset,littleEndian){if(value<0)value=4294967295+value+1;for(var i=0,j=Math.min(buf.length-offset,4);i>>(littleEndian?i:3-i)*8&255}}Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset+3]=value>>>24;this[offset+2]=value>>>16;this[offset+1]=value>>>8;this[offset]=value&255}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0;var mul=1;var sub=0;this[offset]=value&255;while(++i>0)-sub&255}return offset+byteLength};Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1;var mul=1;var sub=0;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){if(value<0&&sub===0&&this[offset+i+1]!==0){sub=1}this[offset+i]=(value/mul>>0)-sub&255}return offset+byteLength};Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,127,-128);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);if(value<0)value=255+value+1;this[offset]=value&255;return offset+1};Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8;this[offset+2]=value>>>16;this[offset+3]=value>>>24}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(value<0)value=4294967295+value+1;if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38)}ieee754.write(buf,value,offset,littleEndian,23,4);return offset+4}Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){return writeFloat(this,value,offset,true,noAssert)};Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){return writeFloat(this,value,offset,false,noAssert)};function writeDouble(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308)}ieee754.write(buf,value,offset,littleEndian,52,8);return offset+8}Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){return writeDouble(this,value,offset,true,noAssert)};Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){return writeDouble(this,value,offset,false,noAssert)};Buffer.prototype.copy=function copy(target,targetStart,start,end){if(!start)start=0;if(!end&&end!==0)end=this.length;if(targetStart>=target.length)targetStart=target.length;if(!targetStart)targetStart=0;if(end>0&&end=this.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");if(end>this.length)end=this.length;if(target.length-targetStart=0;i--){target[i+targetStart]=this[i+start]}}else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT){for(i=0;i>>0;end=end===undefined?this.length:end>>>0;if(!val)val=0;var i;if(typeof val==="number"){for(i=start;i55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189)}leadSurrogate=null;if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<1114112){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error("Invalid code point")}}return bytes}function asciiToBytes(str){var byteArray=[];for(var i=0;i>8;lo=c%256;byteArray.push(lo);byteArray.push(hi)}return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i=dst.length||i>=src.length)break;dst[i+offset]=src[i]}return i}function isnan(val){return val!==val}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"base64-js":5,ieee754:6,isarray:7}],5:[function(require,module,exports){"use strict";exports.toByteArray=toByteArray;exports.fromByteArray=fromByteArray;var lookup=[];var revLookup=[];var Arr=typeof Uint8Array!=="undefined"?Uint8Array:Array;function init(){var code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var i=0,len=code.length;i0){throw new Error("Invalid string. Length must be a multiple of 4")}placeHolders=b64[len-2]==="="?2:b64[len-1]==="="?1:0;arr=new Arr(len*3/4-placeHolders);l=placeHolders>0?len-4:len;var L=0;for(i=0,j=0;i>16&255;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}if(placeHolders===2){tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4;arr[L++]=tmp&255}else if(placeHolders===1){tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}return arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[num&63]}function encodeChunk(uint8,start,end){var tmp;var output=[];for(var i=start;ilen2?len2:i+maxChunkLength))}if(extraBytes===1){tmp=uint8[len-1];output+=lookup[tmp>>2];output+=lookup[tmp<<4&63];output+="=="}else if(extraBytes===2){tmp=(uint8[len-2]<<8)+uint8[len-1];output+=lookup[tmp>>10];output+=lookup[tmp>>4&63];output+=lookup[tmp<<2&63];output+="="}parts.push(output);return parts.join("")}},{}],6:[function(require,module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m;var eLen=nBytes*8-mLen-1;var eMax=(1<>1;var nBits=-7;var i=isLE?nBytes-1:0;var d=isLE?-1:1;var s=buffer[offset+i];i+=d;e=s&(1<<-nBits)-1;s>>=-nBits;nBits+=eLen;for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}m=e&(1<<-nBits)-1;e>>=-nBits;nBits+=mLen;for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}if(e===0){e=1-eBias}else if(e===eMax){return m?NaN:(s?-1:1)*Infinity}else{m=m+Math.pow(2,mLen);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)};exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c;var eLen=nBytes*8-mLen-1;var eMax=(1<>1;var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;var i=isLE?0:nBytes-1;var d=isLE?1:-1;var s=value<0||value===0&&1/value<0?1:0;value=Math.abs(value);if(isNaN(value)||value===Infinity){m=isNaN(value)?1:0;e=eMax}else{e=Math.floor(Math.log(value)/Math.LN2);if(value*(c=Math.pow(2,-e))<1){e--;c*=2}if(e+eBias>=1){value+=rt/c}else{value+=rt*Math.pow(2,1-eBias)}if(value*c>=2){e++;c/=2}if(e+eBias>=eMax){m=0;e=eMax}else if(e+eBias>=1){m=(value*c-1)*Math.pow(2,mLen);e=e+eBias}else{m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);e=0}}for(;mLen>=8;buffer[offset+i]=m&255,i+=d,m/=256,mLen-=8){}e=e<0;buffer[offset+i]=e&255,i+=d,e/=256,eLen-=8){}buffer[offset+i-d]|=s*128}},{}],7:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return toString.call(arr)=="[object Array]"}},{}],8:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function(filename){return splitPathRe.exec(filename).slice(1)};exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i1){for(var i=1;i\n = NonemptyListOf\n | EmptyListOf\n\n NonemptyListOf\n = elem (sep elem)*\n\n EmptyListOf\n = /* nothing */\n\n listOf\n = nonemptyListOf\n | emptyListOf\n\n nonemptyListOf\n = elem (sep elem)*\n\n emptyListOf\n = /* nothing */\n\n}');return decl.define("alnum",[],this.alt(this.app("letter").withInterval(decl.sourceInterval(60,66)),this.app("digit").withInterval(decl.sourceInterval(73,78))).withInterval(decl.sourceInterval(60,78)),"an alpha-numeric character").define("letter",[],this.alt(this.app("lower").withInterval(decl.sourceInterval(107,112)),this.app("upper").withInterval(decl.sourceInterval(119,124)),this.app("unicodeLtmo").withInterval(decl.sourceInterval(131,142))).withInterval(decl.sourceInterval(107,142)),"a letter").define("digit",[],this.range("0","9").withInterval(decl.sourceInterval(169,177)),"a digit").define("hexDigit",[],this.alt(this.app("digit").withInterval(decl.sourceInterval(219,224)),this.range("a","f").withInterval(decl.sourceInterval(231,239)),this.range("A","F").withInterval(decl.sourceInterval(246,254))).withInterval(decl.sourceInterval(219,254)),"a hexadecimal digit").define("ListOf",["elem","sep"],this.alt(this.app("NonemptyListOf",[this.param(0),this.param(1)]).withInterval(decl.sourceInterval(282,307)),this.app("EmptyListOf",[this.param(0),this.param(1)]).withInterval(decl.sourceInterval(314,336))).withInterval(decl.sourceInterval(282,336))).define("NonemptyListOf",["elem","sep"],this.seq(this.param(0),this.star(this.seq(this.param(1),this.param(0)).withInterval(decl.sourceInterval(378,386))).withInterval(decl.sourceInterval(377,388))).withInterval(decl.sourceInterval(372,388))).define("EmptyListOf",["elem","sep"],this.seq().withInterval(decl.sourceInterval(438,438))).define("listOf",["elem","sep"],this.alt(this.app("nonemptyListOf",[this.param(0),this.param(1)]).withInterval(decl.sourceInterval(462,487)),this.app("emptyListOf",[this.param(0),this.param(1)]).withInterval(decl.sourceInterval(494,516))).withInterval(decl.sourceInterval(462,516))).define("nonemptyListOf",["elem","sep"],this.seq(this.param(0),this.star(this.seq(this.param(1),this.param(0)).withInterval(decl.sourceInterval(558,566))).withInterval(decl.sourceInterval(557,568))).withInterval(decl.sourceInterval(552,568))).define("emptyListOf",["elem","sep"],this.seq().withInterval(decl.sourceInterval(616,616))).build()})},{"..":50}],11:[function(require,module,exports){var ohm=require("..");module.exports=ohm.makeRecipe(function(){var decl=this.newGrammar("Ohm").withSource('Ohm {\n\n Grammars\n = Grammar*\n\n Grammar\n = ident SuperGrammar? "{" Rule* "}"\n\n SuperGrammar\n = "<:" ident\n\n Rule\n = ident Formals? ruleDescr? "=" RuleBody -- define\n | ident Formals? ":=" RuleBody -- override\n | ident Formals? "+=" RuleBody -- extend\n\n RuleBody\n = "|"? TopLevelTerm ("|" TopLevelTerm)*\n\n TopLevelTerm\n = Seq caseName -- inline\n | Seq\n\n Formals\n = "<" ListOf ">"\n\n Params\n = "<" ListOf ">"\n\n Alt\n = Seq ("|" Seq)*\n\n Seq\n = Iter*\n\n Iter\n = Pred "*" -- star\n | Pred "+" -- plus\n | Pred "?" -- opt\n | Pred\n\n Pred\n = "~" Lex -- not\n | "&" Lex -- lookahead\n | Lex\n\n Lex\n = "#" Base -- lex\n | Base\n\n Base\n = ident Params? ~(ruleDescr? "=" | ":=" | "+=") -- application\n | terminal ".." terminal -- range\n | terminal -- terminal\n | "(" Alt ")" -- paren\n\n ruleDescr (a rule description)\n = "(" ruleDescrText ")"\n\n ruleDescrText\n = (~")" any)*\n\n caseName\n = "--" (~"\\n" space)* name (~"\\n" space)* ("\\n" | &"}")\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = "_"\n | letter\n\n nameRest\n = "_"\n | alnum\n\n ident (an identifier)\n = name\n\n terminal\n = "\\"" terminalChar* "\\""\n\n terminalChar\n = escapeChar\n | ~"\\\\" ~"\\"" ~"\\n" any\n\n escapeChar (an escape sequence)\n = "\\\\\\\\" -- backslash\n | "\\\\\\"" -- doubleQuote\n | "\\\\\\\'" -- singleQuote\n | "\\\\b" -- backspace\n | "\\\\n" -- lineFeed\n | "\\\\r" -- carriageReturn\n | "\\\\t" -- tab\n | "\\\\u" hexDigit hexDigit hexDigit hexDigit -- unicodeEscape\n | "\\\\x" hexDigit hexDigit -- hexEscape\n\n space\n += comment\n\n comment\n = "//" (~"\\n" any)* "\\n" -- singleLine\n | "/*" (~"*/" any)* "*/" -- multiLine\n\n tokens = token*\n\n token = caseName | comment | ident | operator | punctuation | terminal | any\n\n operator = "<:" | "=" | ":=" | "+=" | "*" | "+" | "?" | "~" | "&"\n\n punctuation = "<" | ">" | "," | "--"\n}').withDefaultStartRule("Grammars");return decl.define("Grammars",[],this.star(this.app("Grammar").withInterval(decl.sourceInterval(24,31))).withInterval(decl.sourceInterval(24,32))).define("Grammar",[],this.seq(this.app("ident").withInterval(decl.sourceInterval(50,55)),this.opt(this.app("SuperGrammar").withInterval(decl.sourceInterval(56,68))).withInterval(decl.sourceInterval(56,69)),this.terminal("{").withInterval(decl.sourceInterval(70,73)),this.star(this.app("Rule").withInterval(decl.sourceInterval(74,78))).withInterval(decl.sourceInterval(74,79)),this.terminal("}").withInterval(decl.sourceInterval(80,83))).withInterval(decl.sourceInterval(50,83))).define("SuperGrammar",[],this.seq(this.terminal("<:").withInterval(decl.sourceInterval(106,110)),this.app("ident").withInterval(decl.sourceInterval(111,116))).withInterval(decl.sourceInterval(106,116))).define("Rule_define",[],this.seq(this.app("ident").withInterval(decl.sourceInterval(131,136)),this.opt(this.app("Formals").withInterval(decl.sourceInterval(137,144))).withInterval(decl.sourceInterval(137,145)),this.opt(this.app("ruleDescr").withInterval(decl.sourceInterval(146,155))).withInterval(decl.sourceInterval(146,156)),this.terminal("=").withInterval(decl.sourceInterval(157,160)),this.app("RuleBody").withInterval(decl.sourceInterval(162,170))).withInterval(decl.sourceInterval(131,170))).define("Rule_override",[],this.seq(this.app("ident").withInterval(decl.sourceInterval(188,193)),this.opt(this.app("Formals").withInterval(decl.sourceInterval(194,201))).withInterval(decl.sourceInterval(194,202)),this.terminal(":=").withInterval(decl.sourceInterval(214,218)),this.app("RuleBody").withInterval(decl.sourceInterval(219,227))).withInterval(decl.sourceInterval(188,227))).define("Rule_extend",[],this.seq(this.app("ident").withInterval(decl.sourceInterval(247,252)),this.opt(this.app("Formals").withInterval(decl.sourceInterval(253,260))).withInterval(decl.sourceInterval(253,261)),this.terminal("+=").withInterval(decl.sourceInterval(273,277)),this.app("RuleBody").withInterval(decl.sourceInterval(278,286))).withInterval(decl.sourceInterval(247,286))).define("Rule",[],this.alt(this.app("Rule_define").withInterval(decl.sourceInterval(131,170)),this.app("Rule_override").withInterval(decl.sourceInterval(188,227)),this.app("Rule_extend").withInterval(decl.sourceInterval(247,286))).withInterval(decl.sourceInterval(131,297))).define("RuleBody",[],this.seq(this.opt(this.terminal("|").withInterval(decl.sourceInterval(316,319))).withInterval(decl.sourceInterval(316,320)),this.app("TopLevelTerm").withInterval(decl.sourceInterval(321,333)),this.star(this.seq(this.terminal("|").withInterval(decl.sourceInterval(335,338)),this.app("TopLevelTerm").withInterval(decl.sourceInterval(339,351))).withInterval(decl.sourceInterval(335,351))).withInterval(decl.sourceInterval(334,353))).withInterval(decl.sourceInterval(316,353))).define("TopLevelTerm_inline",[],this.seq(this.app("Seq").withInterval(decl.sourceInterval(376,379)),this.app("caseName").withInterval(decl.sourceInterval(380,388))).withInterval(decl.sourceInterval(376,388))).define("TopLevelTerm",[],this.alt(this.app("TopLevelTerm_inline").withInterval(decl.sourceInterval(376,388)),this.app("Seq").withInterval(decl.sourceInterval(406,409))).withInterval(decl.sourceInterval(376,409))).define("Formals",[],this.seq(this.terminal("<").withInterval(decl.sourceInterval(427,430)),this.app("ListOf",[this.app("ident").withInterval(decl.sourceInterval(438,443)),this.terminal(",").withInterval(decl.sourceInterval(445,448))]).withInterval(decl.sourceInterval(431,449)),this.terminal(">").withInterval(decl.sourceInterval(450,453))).withInterval(decl.sourceInterval(427,453))).define("Params",[],this.seq(this.terminal("<").withInterval(decl.sourceInterval(470,473)),this.app("ListOf",[this.app("Seq").withInterval(decl.sourceInterval(481,484)),this.terminal(",").withInterval(decl.sourceInterval(486,489))]).withInterval(decl.sourceInterval(474,490)),this.terminal(">").withInterval(decl.sourceInterval(491,494))).withInterval(decl.sourceInterval(470,494))).define("Alt",[],this.seq(this.app("Seq").withInterval(decl.sourceInterval(508,511)),this.star(this.seq(this.terminal("|").withInterval(decl.sourceInterval(513,516)),this.app("Seq").withInterval(decl.sourceInterval(517,520))).withInterval(decl.sourceInterval(513,520))).withInterval(decl.sourceInterval(512,522))).withInterval(decl.sourceInterval(508,522))).define("Seq",[],this.star(this.app("Iter").withInterval(decl.sourceInterval(536,540))).withInterval(decl.sourceInterval(536,541))).define("Iter_star",[],this.seq(this.app("Pred").withInterval(decl.sourceInterval(556,560)),this.terminal("*").withInterval(decl.sourceInterval(561,564))).withInterval(decl.sourceInterval(556,564))).define("Iter_plus",[],this.seq(this.app("Pred").withInterval(decl.sourceInterval(580,584)),this.terminal("+").withInterval(decl.sourceInterval(585,588))).withInterval(decl.sourceInterval(580,588))).define("Iter_opt",[],this.seq(this.app("Pred").withInterval(decl.sourceInterval(604,608)),this.terminal("?").withInterval(decl.sourceInterval(609,612))).withInterval(decl.sourceInterval(604,612))).define("Iter",[],this.alt(this.app("Iter_star").withInterval(decl.sourceInterval(556,564)),this.app("Iter_plus").withInterval(decl.sourceInterval(580,588)),this.app("Iter_opt").withInterval(decl.sourceInterval(604,612)),this.app("Pred").withInterval(decl.sourceInterval(627,631))).withInterval(decl.sourceInterval(556,631))).define("Pred_not",[],this.seq(this.terminal("~").withInterval(decl.sourceInterval(646,649)),this.app("Lex").withInterval(decl.sourceInterval(650,653))).withInterval(decl.sourceInterval(646,653))).define("Pred_lookahead",[],this.seq(this.terminal("&").withInterval(decl.sourceInterval(668,671)),this.app("Lex").withInterval(decl.sourceInterval(672,675))).withInterval(decl.sourceInterval(668,675))).define("Pred",[],this.alt(this.app("Pred_not").withInterval(decl.sourceInterval(646,653)),this.app("Pred_lookahead").withInterval(decl.sourceInterval(668,675)),this.app("Lex").withInterval(decl.sourceInterval(696,699))).withInterval(decl.sourceInterval(646,699))).define("Lex_lex",[],this.seq(this.terminal("#").withInterval(decl.sourceInterval(713,716)),this.app("Base").withInterval(decl.sourceInterval(717,721))).withInterval(decl.sourceInterval(713,721))).define("Lex",[],this.alt(this.app("Lex_lex").withInterval(decl.sourceInterval(713,721)),this.app("Base").withInterval(decl.sourceInterval(736,740))).withInterval(decl.sourceInterval(713,740))).define("Base_application",[],this.seq(this.app("ident").withInterval(decl.sourceInterval(755,760)),this.opt(this.app("Params").withInterval(decl.sourceInterval(761,767))).withInterval(decl.sourceInterval(761,768)),this.not(this.alt(this.seq(this.opt(this.app("ruleDescr").withInterval(decl.sourceInterval(771,780))).withInterval(decl.sourceInterval(771,781)),this.terminal("=").withInterval(decl.sourceInterval(782,785))).withInterval(decl.sourceInterval(771,785)),this.terminal(":=").withInterval(decl.sourceInterval(788,792)),this.terminal("+=").withInterval(decl.sourceInterval(795,799))).withInterval(decl.sourceInterval(771,799))).withInterval(decl.sourceInterval(769,800))).withInterval(decl.sourceInterval(755,800))).define("Base_range",[],this.seq(this.app("terminal").withInterval(decl.sourceInterval(823,831)),this.terminal("..").withInterval(decl.sourceInterval(832,836)),this.app("terminal").withInterval(decl.sourceInterval(837,845))).withInterval(decl.sourceInterval(823,845))).define("Base_terminal",[],this.app("terminal").withInterval(decl.sourceInterval(885,893))).define("Base_paren",[],this.seq(this.terminal("(").withInterval(decl.sourceInterval(950,953)),this.app("Alt").withInterval(decl.sourceInterval(954,957)),this.terminal(")").withInterval(decl.sourceInterval(958,961))).withInterval(decl.sourceInterval(950,961))).define("Base",[],this.alt(this.app("Base_application").withInterval(decl.sourceInterval(755,800)),this.app("Base_range").withInterval(decl.sourceInterval(823,845)),this.app("Base_terminal").withInterval(decl.sourceInterval(885,893)),this.app("Base_paren").withInterval(decl.sourceInterval(950,961))).withInterval(decl.sourceInterval(755,1005))).define("ruleDescr",[],this.seq(this.terminal("(").withInterval(decl.sourceInterval(1047,1050)),this.app("ruleDescrText").withInterval(decl.sourceInterval(1051,1064)),this.terminal(")").withInterval(decl.sourceInterval(1065,1068))).withInterval(decl.sourceInterval(1047,1068)),"a rule description").define("ruleDescrText",[],this.star(this.seq(this.not(this.terminal(")").withInterval(decl.sourceInterval(1094,1097))).withInterval(decl.sourceInterval(1093,1097)),this.app("any").withInterval(decl.sourceInterval(1098,1101))).withInterval(decl.sourceInterval(1093,1101))).withInterval(decl.sourceInterval(1092,1103))).define("caseName",[],this.seq(this.terminal("--").withInterval(decl.sourceInterval(1122,1126)),this.star(this.seq(this.not(this.terminal("\n").withInterval(decl.sourceInterval(1129,1133))).withInterval(decl.sourceInterval(1128,1133)),this.app("space").withInterval(decl.sourceInterval(1134,1139))).withInterval(decl.sourceInterval(1128,1139))).withInterval(decl.sourceInterval(1127,1141)),this.app("name").withInterval(decl.sourceInterval(1142,1146)),this.star(this.seq(this.not(this.terminal("\n").withInterval(decl.sourceInterval(1149,1153))).withInterval(decl.sourceInterval(1148,1153)),this.app("space").withInterval(decl.sourceInterval(1154,1159))).withInterval(decl.sourceInterval(1148,1159))).withInterval(decl.sourceInterval(1147,1161)),this.alt(this.terminal("\n").withInterval(decl.sourceInterval(1163,1167)),this.la(this.terminal("}").withInterval(decl.sourceInterval(1171,1174))).withInterval(decl.sourceInterval(1170,1174))).withInterval(decl.sourceInterval(1163,1174))).withInterval(decl.sourceInterval(1122,1175))).define("name",[],this.seq(this.app("nameFirst").withInterval(decl.sourceInterval(1200,1209)),this.star(this.app("nameRest").withInterval(decl.sourceInterval(1210,1218))).withInterval(decl.sourceInterval(1210,1219))).withInterval(decl.sourceInterval(1200,1219)),"a name").define("nameFirst",[],this.alt(this.terminal("_").withInterval(decl.sourceInterval(1239,1242)),this.app("letter").withInterval(decl.sourceInterval(1249,1255))).withInterval(decl.sourceInterval(1239,1255))).define("nameRest",[],this.alt(this.terminal("_").withInterval(decl.sourceInterval(1274,1277)),this.app("alnum").withInterval(decl.sourceInterval(1284,1289))).withInterval(decl.sourceInterval(1274,1289))).define("ident",[],this.app("name").withInterval(decl.sourceInterval(1322,1326)),"an identifier").define("terminal",[],this.seq(this.terminal('"').withInterval(decl.sourceInterval(1345,1349)),this.star(this.app("terminalChar").withInterval(decl.sourceInterval(1350,1362))).withInterval(decl.sourceInterval(1350,1363)),this.terminal('"').withInterval(decl.sourceInterval(1364,1368))).withInterval(decl.sourceInterval(1345,1368))).define("terminalChar",[],this.alt(this.app("escapeChar").withInterval(decl.sourceInterval(1391,1401)),this.seq(this.not(this.terminal("\\").withInterval(decl.sourceInterval(1409,1413))).withInterval(decl.sourceInterval(1408,1413)),this.not(this.terminal('"').withInterval(decl.sourceInterval(1415,1419))).withInterval(decl.sourceInterval(1414,1419)),this.not(this.terminal("\n").withInterval(decl.sourceInterval(1421,1425))).withInterval(decl.sourceInterval(1420,1425)),this.app("any").withInterval(decl.sourceInterval(1426,1429))).withInterval(decl.sourceInterval(1408,1429))).withInterval(decl.sourceInterval(1391,1429))).define("escapeChar_backslash",[],this.terminal("\\\\").withInterval(decl.sourceInterval(1472,1478))).define("escapeChar_doubleQuote",[],this.terminal('\\"').withInterval(decl.sourceInterval(1534,1540))).define("escapeChar_singleQuote",[],this.terminal("\\'").withInterval(decl.sourceInterval(1598,1604))).define("escapeChar_backspace",[],this.terminal("\\b").withInterval(decl.sourceInterval(1662,1667))).define("escapeChar_lineFeed",[],this.terminal("\\n").withInterval(decl.sourceInterval(1724,1729))).define("escapeChar_carriageReturn",[],this.terminal("\\r").withInterval(decl.sourceInterval(1785,1790))).define("escapeChar_tab",[],this.terminal("\\t").withInterval(decl.sourceInterval(1852,1857))).define("escapeChar_unicodeEscape",[],this.seq(this.terminal("\\u").withInterval(decl.sourceInterval(1908,1913)),this.app("hexDigit").withInterval(decl.sourceInterval(1914,1922)),this.app("hexDigit").withInterval(decl.sourceInterval(1923,1931)),this.app("hexDigit").withInterval(decl.sourceInterval(1932,1940)),this.app("hexDigit").withInterval(decl.sourceInterval(1941,1949))).withInterval(decl.sourceInterval(1908,1949))).define("escapeChar_hexEscape",[],this.seq(this.terminal("\\x").withInterval(decl.sourceInterval(1974,1979)),this.app("hexDigit").withInterval(decl.sourceInterval(1980,1988)),this.app("hexDigit").withInterval(decl.sourceInterval(1989,1997))).withInterval(decl.sourceInterval(1974,1997))).define("escapeChar",[],this.alt(this.app("escapeChar_backslash").withInterval(decl.sourceInterval(1472,1478)),this.app("escapeChar_doubleQuote").withInterval(decl.sourceInterval(1534,1540)),this.app("escapeChar_singleQuote").withInterval(decl.sourceInterval(1598,1604)),this.app("escapeChar_backspace").withInterval(decl.sourceInterval(1662,1667)),this.app("escapeChar_lineFeed").withInterval(decl.sourceInterval(1724,1729)),this.app("escapeChar_carriageReturn").withInterval(decl.sourceInterval(1785,1790)),this.app("escapeChar_tab").withInterval(decl.sourceInterval(1852,1857)),this.app("escapeChar_unicodeEscape").withInterval(decl.sourceInterval(1908,1949)),this.app("escapeChar_hexEscape").withInterval(decl.sourceInterval(1974,1997))).withInterval(decl.sourceInterval(1472,2029)),"an escape sequence").extend("space",[],this.app("comment").withInterval(decl.sourceInterval(2045,2052))).define("comment_singleLine",[],this.seq(this.terminal("//").withInterval(decl.sourceInterval(2070,2074)),this.star(this.seq(this.not(this.terminal("\n").withInterval(decl.sourceInterval(2077,2081))).withInterval(decl.sourceInterval(2076,2081)),this.app("any").withInterval(decl.sourceInterval(2082,2085))).withInterval(decl.sourceInterval(2076,2085))).withInterval(decl.sourceInterval(2075,2087)),this.terminal("\n").withInterval(decl.sourceInterval(2088,2092))).withInterval(decl.sourceInterval(2070,2092))).define("comment_multiLine",[],this.seq(this.terminal("/*").withInterval(decl.sourceInterval(2114,2118)),this.star(this.seq(this.not(this.terminal("*/").withInterval(decl.sourceInterval(2121,2125))).withInterval(decl.sourceInterval(2120,2125)),this.app("any").withInterval(decl.sourceInterval(2126,2129))).withInterval(decl.sourceInterval(2120,2129))).withInterval(decl.sourceInterval(2119,2131)),this.terminal("*/").withInterval(decl.sourceInterval(2132,2136))).withInterval(decl.sourceInterval(2114,2136))).define("comment",[],this.alt(this.app("comment_singleLine").withInterval(decl.sourceInterval(2070,2092)),this.app("comment_multiLine").withInterval(decl.sourceInterval(2114,2136))).withInterval(decl.sourceInterval(2070,2150))).define("tokens",[],this.star(this.app("token").withInterval(decl.sourceInterval(2163,2168))).withInterval(decl.sourceInterval(2163,2169))).define("token",[],this.alt(this.app("caseName").withInterval(decl.sourceInterval(2181,2189)),this.app("comment").withInterval(decl.sourceInterval(2192,2199)),this.app("ident").withInterval(decl.sourceInterval(2202,2207)),this.app("operator").withInterval(decl.sourceInterval(2210,2218)),this.app("punctuation").withInterval(decl.sourceInterval(2221,2232)),this.app("terminal").withInterval(decl.sourceInterval(2235,2243)),this.app("any").withInterval(decl.sourceInterval(2246,2249))).withInterval(decl.sourceInterval(2181,2249))).define("operator",[],this.alt(this.terminal("<:").withInterval(decl.sourceInterval(2264,2268)),this.terminal("=").withInterval(decl.sourceInterval(2271,2274)),this.terminal(":=").withInterval(decl.sourceInterval(2277,2281)),this.terminal("+=").withInterval(decl.sourceInterval(2284,2288)),this.terminal("*").withInterval(decl.sourceInterval(2291,2294)),this.terminal("+").withInterval(decl.sourceInterval(2297,2300)),this.terminal("?").withInterval(decl.sourceInterval(2303,2306)),this.terminal("~").withInterval(decl.sourceInterval(2309,2312)),this.terminal("&").withInterval(decl.sourceInterval(2315,2318))).withInterval(decl.sourceInterval(2264,2318))).define("punctuation",[],this.alt(this.terminal("<").withInterval(decl.sourceInterval(2336,2339)),this.terminal(">").withInterval(decl.sourceInterval(2342,2345)),this.terminal(",").withInterval(decl.sourceInterval(2348,2351)),this.terminal("--").withInterval(decl.sourceInterval(2354,2358))).withInterval(decl.sourceInterval(2336,2358))).build()})},{"..":50}],12:[function(require,module,exports){var ohm=require("..");module.exports=ohm.makeRecipe(function(){var decl=this.newGrammar("OperationsAndAttributes").withSource('OperationsAndAttributes {\n\n AttributeSignature =\n name\n\n OperationSignature =\n name Formals?\n\n Formals\n = "(" ListOf ")"\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = "_"\n | letter\n\n nameRest\n = "_"\n | alnum\n\n}').withDefaultStartRule("AttributeSignature");return decl.define("AttributeSignature",[],this.app("name").withInterval(decl.sourceInterval(54,58))).define("OperationSignature",[],this.seq(this.app("name").withInterval(decl.sourceInterval(87,91)),this.opt(this.app("Formals").withInterval(decl.sourceInterval(92,99))).withInterval(decl.sourceInterval(92,100))).withInterval(decl.sourceInterval(87,100))).define("Formals",[],this.seq(this.terminal("(").withInterval(decl.sourceInterval(118,121)),this.app("ListOf",[this.app("name").withInterval(decl.sourceInterval(129,133)),this.terminal(",").withInterval(decl.sourceInterval(135,138))]).withInterval(decl.sourceInterval(122,139)),this.terminal(")").withInterval(decl.sourceInterval(140,143))).withInterval(decl.sourceInterval(118,143))).define("name",[],this.seq(this.app("nameFirst").withInterval(decl.sourceInterval(168,177)),this.star(this.app("nameRest").withInterval(decl.sourceInterval(178,186))).withInterval(decl.sourceInterval(178,187))).withInterval(decl.sourceInterval(168,187)),"a name").define("nameFirst",[],this.alt(this.terminal("_").withInterval(decl.sourceInterval(207,210)),this.app("letter").withInterval(decl.sourceInterval(217,223))).withInterval(decl.sourceInterval(207,223))).define("nameRest",[],this.alt(this.terminal("_").withInterval(decl.sourceInterval(242,245)),this.app("alnum").withInterval(decl.sourceInterval(252,257))).withInterval(decl.sourceInterval(242,257))).build(); -})},{"..":50}],13:[function(require,module,exports){"use strict";module.exports={toAST:require("./semantics-toAST").helper,semanticsForToAST:require("./semantics-toAST").semantics}},{"./semantics-toAST":14}],14:[function(require,module,exports){"use strict";var pexprs=require("../src/pexprs");var MatchResult=require("../src/MatchResult");var Grammar=require("../src/Grammar");var extend=require("util-extend");var defaultOperation={_terminal:function(){return this.primitiveValue},_nonterminal:function(children){var ctorName=this._node.ctorName;var mapping=this.args.mapping;if(!mapping.hasOwnProperty(ctorName)){if(this._node instanceof pexprs.Alt||this._node instanceof pexprs.Apply){return children[0].toAST(mapping)}if(this.isLexical()){return this.interval.contents}var realChildren=children.filter(function(child){return!child.isTerminal()});if(realChildren.length===1){return realChildren[0].toAST(mapping)}}if(typeof mapping[ctorName]==="number"){return children[mapping[ctorName]].toAST(mapping)}var propMap=mapping[ctorName]||children;var node={type:ctorName};for(var prop in propMap){var mappedProp=mapping[ctorName]&&mapping[ctorName][prop];if(typeof mappedProp==="number"){node[prop]=children[mappedProp].toAST(mapping)}else if(typeof mappedProp==="string"||typeof mappedProp==="boolean"||mappedProp===null){node[prop]=mappedProp}else if(typeof mappedProp==="object"&&mappedProp instanceof Number){node[prop]=Number(mappedProp)}else if(typeof mappedProp==="function"){node[prop]=mappedProp.call(this,children)}else if(mappedProp===undefined){if(children[prop]&&!children[prop].isTerminal()){node[prop]=children[prop].toAST(mapping)}else{delete node[prop]}}}return node},_iter:function(children){if(this._node.isOptional()){if(this.numChildren===0){return null}else{return children[0].toAST(this.args.mapping)}}return children.map(function(child){return child.toAST(this.args.mapping)},this)},NonemptyListOf:function(first,sep,rest){return[first.toAST(this.args.mapping)].concat(rest.toAST(this.args.mapping))},EmptyListOf:function(){return[]}};function toAST(res,mapping){if(!(res instanceof MatchResult)||res.failed()){throw new Error("toAST() expects a succesfull MatchResult as first parameter")}mapping=extend({},mapping);var operation=extend({},defaultOperation);for(var termName in mapping){if(typeof mapping[termName]==="function"){operation[termName]=mapping[termName];delete mapping[termName]}}var g=res._cst.grammar;var s=g.semantics().addOperation("toAST(mapping)",operation);return s(res).toAST(mapping)}function semanticsForToAST(g){if(!(g instanceof Grammar)){throw new Error("semanticsToAST() expects a Grammar as parameter")}return g.semantics().addOperation("toAST(mapping)",defaultOperation)}module.exports={helper:toAST,semantics:semanticsForToAST}},{"../src/Grammar":38,"../src/MatchResult":42,"../src/pexprs":67,"util-extend":35}],15:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Symbol:require("./polyfill")},{"./is-implemented":16,"./polyfill":31}],16:[function(require,module,exports){"use strict";module.exports=function(){var symbol;if(typeof Symbol!=="function")return false;symbol=Symbol("test symbol");try{String(symbol)}catch(e){return false}if(typeof Symbol.iterator==="symbol")return true;if(typeof Symbol.isConcatSpreadable!=="object")return false;if(typeof Symbol.iterator!=="object")return false;if(typeof Symbol.toPrimitive!=="object")return false;if(typeof Symbol.toStringTag!=="object")return false;if(typeof Symbol.unscopables!=="object")return false;return true}},{}],17:[function(require,module,exports){"use strict";module.exports=function(x){return x&&(typeof x==="symbol"||x["@@toStringTag"]==="Symbol")||false}},{}],18:[function(require,module,exports){"use strict";var assign=require("es5-ext/object/assign"),normalizeOpts=require("es5-ext/object/normalize-options"),isCallable=require("es5-ext/object/is-callable"),contains=require("es5-ext/string/#/contains"),d;d=module.exports=function(dscr,value){var c,e,w,options,desc;if(arguments.length<2||typeof dscr!=="string"){options=value;value=dscr;dscr=null}else{options=arguments[2]}if(dscr==null){c=w=true;e=false}else{c=contains.call(dscr,"c");e=contains.call(dscr,"e");w=contains.call(dscr,"w")}desc={value:value,configurable:c,enumerable:e,writable:w};return!options?desc:assign(normalizeOpts(options),desc)};d.gs=function(dscr,get,set){var c,e,options,desc;if(typeof dscr!=="string"){options=set;set=get;get=dscr;dscr=null}else{options=arguments[3]}if(get==null){get=undefined}else if(!isCallable(get)){options=get;get=set=undefined}else if(set==null){set=undefined}else if(!isCallable(set)){options=set;set=undefined}if(dscr==null){c=true;e=false}else{c=contains.call(dscr,"c");e=contains.call(dscr,"e")}desc={get:get,set:set,configurable:c,enumerable:e};return!options?desc:assign(normalizeOpts(options),desc)}},{"es5-ext/object/assign":19,"es5-ext/object/is-callable":22,"es5-ext/object/normalize-options":26,"es5-ext/string/#/contains":28}],19:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Object.assign:require("./shim")},{"./is-implemented":20,"./shim":21}],20:[function(require,module,exports){"use strict";module.exports=function(){var assign=Object.assign,obj;if(typeof assign!=="function")return false;obj={foo:"raz"};assign(obj,{bar:"dwa"},{trzy:"trzy"});return obj.foo+obj.bar+obj.trzy==="razdwatrzy"}},{}],21:[function(require,module,exports){"use strict";var keys=require("../keys"),value=require("../valid-value"),max=Math.max;module.exports=function(dest,src){var error,i,l=max(arguments.length,2),assign;dest=Object(value(dest));assign=function(key){try{dest[key]=src[key]}catch(e){if(!error)error=e}};for(i=1;i-1}},{}],31:[function(require,module,exports){"use strict";var d=require("d"),validateSymbol=require("./validate-symbol"),create=Object.create,defineProperties=Object.defineProperties,defineProperty=Object.defineProperty,objPrototype=Object.prototype,Symbol,HiddenSymbol,globalSymbols=create(null);var generateName=function(){var created=create(null);return function(desc){var postfix=0,name;while(created[desc+(postfix||"")])++postfix;desc+=postfix||"";created[desc]=true;name="@@"+desc;defineProperty(objPrototype,name,d.gs(null,function(value){defineProperty(this,name,d(value))}));return name}}();HiddenSymbol=function Symbol(description){if(this instanceof HiddenSymbol)throw new TypeError("TypeError: Symbol is not a constructor");return Symbol(description)};module.exports=Symbol=function Symbol(description){var symbol;if(this instanceof Symbol)throw new TypeError("TypeError: Symbol is not a constructor");symbol=create(HiddenSymbol.prototype);description=description===undefined?"":String(description);return defineProperties(symbol,{__description__:d("",description),__name__:d("",generateName(description))})};defineProperties(Symbol,{"for":d(function(key){if(globalSymbols[key])return globalSymbols[key];return globalSymbols[key]=Symbol(String(key))}),keyFor:d(function(s){var key;validateSymbol(s);for(key in globalSymbols)if(globalSymbols[key]===s)return key}),hasInstance:d("",Symbol("hasInstance")),isConcatSpreadable:d("",Symbol("isConcatSpreadable")),iterator:d("",Symbol("iterator")),match:d("",Symbol("match")),replace:d("",Symbol("replace")),search:d("",Symbol("search")),species:d("",Symbol("species")),split:d("",Symbol("split")),toPrimitive:d("",Symbol("toPrimitive")),toStringTag:d("",Symbol("toStringTag")),unscopables:d("",Symbol("unscopables"))});defineProperties(HiddenSymbol.prototype,{constructor:d(Symbol),toString:d("",function(){return this.__name__})});defineProperties(Symbol.prototype,{toString:d(function(){return"Symbol ("+validateSymbol(this).__description__+")"}),valueOf:d(function(){return validateSymbol(this)})});defineProperty(Symbol.prototype,Symbol.toPrimitive,d("",function(){return validateSymbol(this)}));defineProperty(Symbol.prototype,Symbol.toStringTag,d("c","Symbol"));defineProperty(HiddenSymbol.prototype,Symbol.toPrimitive,d("c",Symbol.prototype[Symbol.toPrimitive]));defineProperty(HiddenSymbol.prototype,Symbol.toStringTag,d("c",Symbol.prototype[Symbol.toStringTag]))},{"./validate-symbol":32,d:18}],32:[function(require,module,exports){"use strict";var isSymbol=require("./is-symbol");module.exports=function(value){if(!isSymbol(value))throw new TypeError(value+" is not a symbol");return value}},{"./is-symbol":17}],33:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],34:[function(require,module,exports){module.exports=function(obj){return!!(obj!=null&&obj.constructor&&typeof obj.constructor.isBuffer==="function"&&obj.constructor.isBuffer(obj))}},{}],35:[function(require,module,exports){module.exports=extend;function extend(origin,add){if(!add||typeof add!=="object")return origin;var keys=Object.keys(add);var i=keys.length;while(i--){origin[keys[i]]=add[keys[i]]}return origin}},{}],36:[function(require,module,exports){"use strict";var GrammarDecl=require("./GrammarDecl");var pexprs=require("./pexprs");function Builder(){}Builder.prototype={newGrammar:function(name){return new GrammarDecl(name)},terminal:function(x){return new pexprs.Terminal(x)},range:function(from,to){return new pexprs.Range(from,to)},param:function(index){return new pexprs.Param(index)},alt:function(){var terms=[];for(var idx=0;idx0){var prettyProblems=problems.map(function(problem){return"- "+problem});var error=new Error("Found errors in the action dictionary of the '"+name+"' "+what+":\n"+prettyProblems.join("\n"));error.problems=problems;throw error}},_topDownActionArity:function(actionName){if(actionName==="_iter"||actionName==="_nonterminal"||actionName==="_default"){return 1}else if(actionName==="_terminal"){return 0}return this.ruleBodies[actionName].getArity()},_inheritsFrom:function(grammar){var g=this.superGrammar;while(g){if(g===grammar){return true}g=g.superGrammar}return false},toRecipe:function(optVarName){if(this.isBuiltIn()){throw new Error("Why would anyone want to generate a recipe for the "+this.name+" grammar?!?!")}var sb=new common.StringBuffer;if(optVarName){sb.append("var "+optVarName+" = ")}sb.append("(function() {\n");var superGrammarDecl="";if(!this.superGrammar.isBuiltIn()){sb.append(this.superGrammar.toRecipe("buildSuperGrammar"));superGrammarDecl=" .withSuperGrammar(buildSuperGrammar.call(this))\n"}sb.append(" var decl = this.newGrammar("+JSON.stringify(this.name)+")\n");if(this.definitionInterval){sb.append(" .withSource("+JSON.stringify(this.definitionInterval.contents)+")\n")}sb.append(superGrammarDecl);if(this.defaultStartRule){sb.append(' .withDefaultStartRule("'+this.defaultStartRule+'")\n')}sb.append(" return decl\n");var self=this;Object.keys(this.ruleBodies).forEach(function(ruleName){var body=self.ruleBodies[ruleName];sb.append(" .");if(self.superGrammar.ruleBodies[ruleName]){sb.append(body instanceof pexprs.Extend?"extend":"override")}else{sb.append("define")}var formals=self.ruleFormals[ruleName];var formalsString="["+formals.map(JSON.stringify).join(", ")+"]";sb.append("("+JSON.stringify(ruleName)+", "+formalsString+", ");body.outputRecipe(sb,formals,self.definitionInterval);if(!self.superGrammar.ruleBodies[ruleName]&&self.ruleDescriptions[ruleName]){sb.append(", "+JSON.stringify(self.ruleDescriptions[ruleName]))}sb.append(")\n")});sb.append(" .build();\n});\n");return sb.contents()},toOperationActionDictionaryTemplate:function(){return this._toOperationOrAttributeActionDictionaryTemplate()},toAttributeActionDictionaryTemplate:function(){return this._toOperationOrAttributeActionDictionaryTemplate()},_toOperationOrAttributeActionDictionaryTemplate:function(){var sb=new common.StringBuffer;sb.append("{");var first=true;for(var ruleName in this.ruleBodies){var body=this.ruleBodies[ruleName];if(first){first=false}else{sb.append(",")}sb.append("\n");sb.append(" ");this.addSemanticActionTemplate(ruleName,body,sb)}sb.append("\n}");return sb.contents()},addSemanticActionTemplate:function(ruleName,body,sb){sb.append(ruleName);sb.append(": function(");var arity=this._topDownActionArity(ruleName);sb.append(common.repeat("_",arity).join(", "));sb.append(") {\n");sb.append(" }")},parseApplication:function(str){var app;if(str.indexOf("<")===-1){app=new pexprs.Apply(str)}else{var cst=ohmGrammar.match(str,"Base_application");app=buildGrammar(cst,{})}if(!(app.ruleName in this.ruleBodies)){throw errors.undeclaredRule(app.ruleName,this.name)}else if(this.ruleFormals[app.ruleName].length!==app.args.length){throw errors.wrongNumberOfParameters(app.ruleName,this.ruleFormals[app.ruleName].length,app.args.length)}return app}};Grammar.ProtoBuiltInRules=new Grammar("ProtoBuiltInRules",undefined,{any:pexprs.any,end:pexprs.end,spaces:new pexprs.Star(new pexprs.Apply("space")),space:new pexprs.Range("\x00"," "),lower:new pexprs.UnicodeChar("Ll"),upper:new pexprs.UnicodeChar("Lu"),unicodeLtmo:new pexprs.UnicodeChar("Ltmo")},{any:[],end:[],spaces:[],space:[],lower:[],upper:[],unicodeLtmo:[]},{any:"any object",end:"end of input",space:"a space",lower:"a lowercase letter",upper:"an uppercase letter"});module.exports=Grammar},{"./MatchResult":42,"./Semantics":45,"./State":46,"./common":48,"./errors":49,"./pexprs":67}],39:[function(require,module,exports){"use strict";var Grammar=require("./Grammar");var InputStream=require("./InputStream");var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");function GrammarDecl(name){this.name=name}GrammarDecl.prototype.sourceInterval=function(startIdx,endIdx){var inputStream=this.interval.inputStream;return inputStream.interval(startIdx,endIdx)};GrammarDecl.prototype.ensureSuperGrammar=function(){if(!this.superGrammar){this.withSuperGrammar(this.name==="BuiltInRules"?Grammar.ProtoBuiltInRules:Grammar.BuiltInRules)}return this.superGrammar};GrammarDecl.prototype.installOverriddenOrExtendedRule=function(name,formals,body){var duplicateParameterNames=common.getDuplicates(formals);if(duplicateParameterNames.length>0){throw errors.duplicateParameterNames(name,duplicateParameterNames,body)}var expectedFormals=this.ensureSuperGrammar().ruleFormals[name];var expectedNumFormals=expectedFormals?expectedFormals.length:0;if(formals.length!==expectedNumFormals){throw errors.wrongNumberOfParameters(name,expectedNumFormals,formals.length,body)}return this.install(name,formals,body)};GrammarDecl.prototype.install=function(name,formals,body,optDescription){body=body.introduceParams(formals);this.ruleFormals[name]=formals;if(optDescription){this.ruleDescriptions[name]=optDescription}this.ruleBodies[name]=body;return this};GrammarDecl.prototype.withSuperGrammar=function(superGrammar){if(this.superGrammar){throw new Error("the super grammar of a GrammarDecl cannot be set more than once")}this.superGrammar=superGrammar;this.ruleBodies=Object.create(superGrammar.ruleBodies);this.ruleFormals=Object.create(superGrammar.ruleFormals);this.ruleDescriptions=Object.create(superGrammar.ruleDescriptions);if(!superGrammar.isBuiltIn()){this.defaultStartRule=superGrammar.defaultStartRule}return this};GrammarDecl.prototype.withDefaultStartRule=function(ruleName){this.defaultStartRule=ruleName;return this};GrammarDecl.prototype.withSource=function(source){this.interval=new InputStream(source).interval(0,source.length);return this};GrammarDecl.prototype.build=function(){var grammar=new Grammar(this.name,this.ensureSuperGrammar(),this.ruleBodies,this.ruleFormals,this.ruleDescriptions,this.defaultStartRule);var grammarErrors=[];var grammarHasInvalidApplications=false;Object.keys(grammar.ruleBodies).forEach(function(ruleName){var body=grammar.ruleBodies[ruleName];try{body.assertChoicesHaveUniformArity(ruleName)}catch(e){grammarErrors.push(e)}try{body.assertAllApplicationsAreValid(ruleName,grammar)}catch(e){grammarErrors.push(e);grammarHasInvalidApplications=true}});if(!grammarHasInvalidApplications){Object.keys(grammar.ruleBodies).forEach(function(ruleName){var body=grammar.ruleBodies[ruleName];try{body.assertIteratedExprsAreNotNullable(grammar,ruleName)}catch(e){grammarErrors.push(e)}})}if(grammarErrors.length>0){errors.throwErrors(grammarErrors)}if(this.interval){grammar.definitionInterval=this.interval}return grammar};GrammarDecl.prototype.define=function(name,formals,body,optDescr){this.ensureSuperGrammar();if(this.superGrammar.ruleBodies[name]){throw errors.duplicateRuleDeclaration(name,this.name,this.superGrammar.name,body)}else if(this.ruleBodies[name]){throw errors.duplicateRuleDeclaration(name,this.name,this.name,body)}var duplicateParameterNames=common.getDuplicates(formals);if(duplicateParameterNames.length>0){throw errors.duplicateParameterNames(name,duplicateParameterNames,body)}return this.install(name,formals,body,optDescr)};GrammarDecl.prototype.override=function(name,formals,body){var baseRule=this.ensureSuperGrammar().ruleBodies[name];if(!baseRule){throw errors.cannotOverrideUndeclaredRule(name,this.superGrammar.name,body)}this.installOverriddenOrExtendedRule(name,formals,body);return this};GrammarDecl.prototype.extend=function(name,formals,fragment){var baseRule=this.ensureSuperGrammar().ruleBodies[name];if(!baseRule){throw errors.cannotExtendUndeclaredRule(name,this.superGrammar.name,fragment)}var body=new pexprs.Extend(this.superGrammar,name,fragment);body.interval=fragment.interval;this.installOverriddenOrExtendedRule(name,formals,body);return this};module.exports=GrammarDecl},{"./Grammar":38,"./InputStream":40,"./common":48,"./errors":49,"./pexprs":67}],40:[function(require,module,exports){"use strict";var Interval=require("./Interval");function InputStream(source){this.source=source;this.pos=0;this.posInfos=[]}InputStream.prototype={atEnd:function(){return this.pos===this.source.length},next:function(){return this.source[this.pos++]},matchString:function(s){for(var idx=0;idx=that.startIdx&&this.endIdx<=that.endIdx,"other interval does not cover this one");return new Interval(newInputStream,this.startIdx-that.startIdx,this.endIdx-that.startIdx)},trimmed:function(){var contents=this.contents;var startIdx=this.startIdx+contents.match(/^\s*/)[0].length;var endIdx=this.endIdx-contents.match(/\s*$/)[0].length;return new Interval(this.inputStream,startIdx,endIdx)}};Object.defineProperties(Interval.prototype,{contents:{get:function(){if(this._contents===undefined){this._contents=this.inputStream.sourceSlice(this.startIdx,this.endIdx)}return this._contents},enumerable:true}});module.exports=Interval},{"./common":48,"./errors":49,"./util":68}],42:[function(require,module,exports){"use strict";var inherits=require("inherits");var common=require("./common");var nodes=require("./nodes");var util=require("./util");var Interval=require("./Interval");function getShortMatchErrorMessage(pos,source,detail){var errorInfo=util.getLineAndColumn(source,pos);return"Line "+errorInfo.lineNum+", col "+errorInfo.colNum+": "+detail}function MatchResult(state){this.state=state;this._cst=state.bindings[0]}MatchResult.newFor=function(state){var succeeded=state.bindings.length>0;return succeeded?new MatchResult(state):new MatchFailure(state)};MatchResult.prototype.failed=function(){return false};MatchResult.prototype.succeeded=function(){return!this.failed()};MatchResult.prototype.getDiscardedSpaces=function(){if(this.failed()){return[]}var state=this.state;var grammar=state.grammar;var inputStream=state.inputStream;var intervals=[new Interval(inputStream,0,inputStream.source.length)];var s=grammar.semantics().addOperation("subtractTerminals",{_nonterminal:function(children){children.forEach(function(child){child.subtractTerminals()})},_terminal:function(){var t=this;intervals=intervals.map(function(interval){return interval.minus(t.interval)}).reduce(function(xs,ys){return xs.concat(ys)},[])}});s(this).subtractTerminals();s.addOperation("fixIntervals(idxOffset)",{_default:function(children){var idxOffset=this.args.idxOffset;this.interval.inputStream=inputStream;this.interval.startIdx+=idxOffset;this.interval.endIdx+=idxOffset;if(!this.isTerminal()){children.forEach(function(child){child.fixIntervals(idxOffset)})}}});var discardedNodes=intervals.map(function(interval){var r=grammar.match(interval.contents,"spaces");s(r).fixIntervals(interval.startIdx);return r._cst});discardedNodes=new nodes.IterationNode(grammar,discardedNodes,discardedNodes.length===0?new Interval(inputStream,0,0):new Interval(inputStream,discardedNodes[0].interval.startIdx,discardedNodes[discardedNodes.length-1].interval.endIdx));var r=Object.create(this);r._cst=discardedNodes;r.getDiscardedSpaces=function(){return r};return r};function MatchFailure(state){this.state=state;common.defineLazyProperty(this,"_failures",function(){return this.state.getFailures()});common.defineLazyProperty(this,"message",function(){var source=this.state.inputStream.source;if(typeof source!=="string"){return"match failed at position "+this.getRightmostFailurePosition()}var detail="Expected "+this.getExpectedText();return util.getLineAndColumnMessage(source,this.getRightmostFailurePosition())+detail});common.defineLazyProperty(this,"shortMessage",function(){if(typeof this.state.inputStream.source!=="string"){return"match failed at position "+this.getRightmostFailurePosition()}var detail="expected "+this.getExpectedText();return getShortMatchErrorMessage(this.getRightmostFailurePosition(),this.state.inputStream.source,detail)})}inherits(MatchFailure,MatchResult);MatchFailure.prototype.toString=function(){return"[MatchFailure at position "+this.getRightmostFailurePosition()+"]"};MatchFailure.prototype.failed=function(){return true};MatchFailure.prototype.getRightmostFailurePosition=function(){return this.state.getRightmostFailurePosition()};MatchFailure.prototype.getRightmostFailures=function(){return this._failures};MatchFailure.prototype.getExpectedText=function(){var sb=new common.StringBuffer;var failures=this.getRightmostFailures();failures=failures.filter(function(failure){return!failure.isFluffy()});for(var idx=0;idx0){if(idx===failures.length-1){sb.append(failures.length>2?", or ":" or ")}else{sb.append(", ")}}sb.append(failures[idx].toString())}return sb.contents()};MatchFailure.prototype.getInterval=function(){var pos=this.state.getRightmostFailurePosition();return new Interval(this.state.inputStream,pos,pos)};module.exports=MatchResult},{"./Interval":41,"./common":48,"./nodes":51,"./util":68,inherits:33}],43:[function(require,module,exports){"use strict";var extend=require("util-extend");function Namespace(){}Namespace.prototype=Object.create(null);Namespace.asNamespace=function(objOrNamespace){if(objOrNamespace instanceof Namespace){return objOrNamespace}return Namespace.createNamespace(objOrNamespace)};Namespace.createNamespace=function(optProps){return Namespace.extend(Namespace.prototype,optProps)};Namespace.extend=function(namespace,optProps){if(namespace!==Namespace.prototype&&!(namespace instanceof Namespace)){throw new TypeError("not a Namespace object: "+namespace)}var ns=Object.create(namespace,{constructor:{value:Namespace,enumerable:false, -writable:true,configurable:true}});return extend(ns,optProps)};Namespace.toString=function(ns){return Object.prototype.toString.call(ns)};module.exports=Namespace},{"util-extend":35}],44:[function(require,module,exports){"use strict";function PosInfo(state){this.state=state;this.applicationMemoKeyStack=[];this.memo={};this.currentLeftRecursion=undefined}PosInfo.prototype={isActive:function(application){return this.applicationMemoKeyStack.indexOf(application.toMemoKey())>=0},enter:function(application){this.state.enter(application);this.applicationMemoKeyStack.push(application.toMemoKey())},exit:function(){this.state.exit();this.applicationMemoKeyStack.pop()},startLeftRecursion:function(headApplication,memoRec){memoRec.isLeftRecursion=true;memoRec.headApplication=headApplication;memoRec.nextLeftRecursion=this.currentLeftRecursion;this.currentLeftRecursion=memoRec;var applicationMemoKeyStack=this.applicationMemoKeyStack;var indexOfFirstInvolvedRule=applicationMemoKeyStack.indexOf(headApplication.toMemoKey())+1;var involvedApplicationMemoKeys=applicationMemoKeyStack.slice(indexOfFirstInvolvedRule);memoRec.isInvolved=function(applicationMemoKey){return involvedApplicationMemoKeys.indexOf(applicationMemoKey)>=0};memoRec.updateInvolvedApplicationMemoKeys=function(){for(var idx=indexOfFirstInvolvedRule;idx0){signature+="("+semanticOperations[name].formals.join(", ")+")"}var method;if(hasSuperSemantics(this)&&this.super[type.toLowerCase()+"s"][name]){method="extend"+type}else{method="add"+type}str+="\n ."+method+"("+JSON.stringify(signature)+", {";var actions=semanticOperations[name].actionDict;var srcArray=[];Object.keys(actions).forEach(function(actionName){if(semanticOperations[name].builtInDefault!==actions[actionName]){srcArray.push("\n "+JSON.stringify(actionName)+": "+actions[actionName].toString())}});str+=srcArray.join(",");str+="\n })"},this)},this);str+=";\n })";if(!semanticsOnly){str="(function() {\n"+" var buildGrammar = "+this.grammar.toRecipe()+" var grammar = buildGrammar.call(this);\n"+" var semantics = "+str+"(grammar);\n"+" return semantics;\n"+"});\n"}return str};var prototypeGrammar;var prototypeGrammarSemantics;Semantics.initPrototypeParser=function(grammar){prototypeGrammarSemantics=grammar.semantics().addOperation("parse",{AttributeSignature:function(name){return{name:name.parse(),formals:[]}},OperationSignature:function(name,optFormals){return{name:name.parse(),formals:optFormals.parse()[0]||[]}},Formals:function(oparen,fs,cparen){return fs.asIteration().parse()},name:function(first,rest){return this.interval.contents}});prototypeGrammar=grammar};function parseSignature(signature,type){if(!prototypeGrammar){common.assert(signature.indexOf("(")===-1);return{name:signature,formals:[]}}var r=prototypeGrammar.match(signature,type==="operation"?"OperationSignature":"AttributeSignature");if(r.failed()){throw new Error(r.message)}return prototypeGrammarSemantics(r).parse()}function newDefaultAction(type,name,doIt){return function(children){var self=this;var thisThing=this._semantics.operations[name]||this._semantics.attributes[name];var args=thisThing.formals.map(function(formal){return self.args[formal]});if(this.isIteration()){return children.map(function(child){return doIt.apply(child,args)})}if(children.length===1){return doIt.apply(children[0],args)}else{throw new Error("Missing semantic action for "+this.ctorName+" in "+name+" "+type)}}}Semantics.prototype.addOperationOrAttribute=function(type,signature,actionDict){var typePlural=type+"s";var parsedNameAndFormalArgs=parseSignature(signature,type);var name=parsedNameAndFormalArgs.name;var formals=parsedNameAndFormalArgs.formals;this.assertNewName(name,type);var builtInDefault=newDefaultAction(type,name,doIt);var realActionDict={_default:builtInDefault};Object.keys(actionDict).forEach(function(name){realActionDict[name]=actionDict[name]});var entry=type==="operation"?new Operation(name,formals,realActionDict,builtInDefault):new Attribute(name,realActionDict,builtInDefault);entry.checkActionDict(this.grammar);this[typePlural][name]=entry;function doIt(){var thisThing=this._semantics[typePlural][name];if(arguments.length!==thisThing.formals.length){throw new Error("Invalid number of arguments passed to "+name+" "+type+" (expected "+thisThing.formals.length+", got "+arguments.length+")")}var args=Object.create(null);for(var idx=0;idxnewLength){this.bindings.pop()}},getCurrentPosInfo:function(){return this.getPosInfo(this.inputStream.pos)},getPosInfo:function(pos){var posInfo=this.posInfos[pos];return posInfo||(this.posInfos[pos]=new PosInfo(this))},processFailure:function(pos,expr){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){if(pos>this.rightmostFailurePosition){this.rightmostFailurePosition=pos}}else if(pos===this.rightmostFailurePosition){this.addRightmostFailure(expr.toFailure(this.grammar),false)}},ensureRightmostFailures:function(){if(!this.rightmostFailures){this.rightmostFailures=Object.create(null)}},addRightmostFailure:function(failure,shouldCloneIfNew){this.ensureRightmostFailures();var key=failure.toKey();if(!this.rightmostFailures[key]){this.rightmostFailures[key]=shouldCloneIfNew?failure.clone():failure}else if(this.rightmostFailures[key].isFluffy()&&!failure.isFluffy()){this.rightmostFailures[key].clearFluffy()}},addRightmostFailures:function(failures,shouldCloneIfNew){var self=this;Object.keys(failures).forEach(function(key){self.addRightmostFailure(failures[key],shouldCloneIfNew)})},cloneRightmostFailures:function(){if(!this.rightmostFailures){return undefined}var ans=Object.create(null);var self=this;Object.keys(this.rightmostFailures).forEach(function(key){ans[key]=self.rightmostFailures[key].clone()});return ans},getRightmostFailurePosition:function(){return this.rightmostFailurePosition},getFailures:function(){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){this.init(RM_RIGHTMOST_FAILURES);this.evalFromStart()}this.ensureRightmostFailures();var self=this;return Object.keys(this.rightmostFailures).map(function(key){return self.rightmostFailures[key]})},getMemoizedTraceEntry:function(pos,expr){var posInfo=this.posInfos[pos];if(posInfo&&expr.ruleName){var memoRec=posInfo.memo[expr.toMemoKey()];if(memoRec){return memoRec.traceEntry}}return null},getTraceEntry:function(pos,expr,succeeded,bindings){var memoEntry=this.getMemoizedTraceEntry(pos,expr);return memoEntry?memoEntry.cloneWithExpr(expr):new Trace(this.inputStream,pos,expr,succeeded,bindings,this.trace)},isTracing:function(){return this.tracingEnabled},useMemoizedResult:function(memoRec){if(this.isTracing()){this.trace.push(memoRec.traceEntry)}if(this.recordingMode===RM_RIGHTMOST_FAILURES&&memoRec.failuresAtRightmostPosition){this.addRightmostFailures(memoRec.failuresAtRightmostPosition,true)}if(memoRec.value){this.inputStream.pos=memoRec.pos;this.bindings.push(memoRec.value);return true}return false},eval:function(expr){var inputStream=this.inputStream;var origNumBindings=this.bindings.length;if(this.recordingMode===RM_RIGHTMOST_FAILURES){var origFailures=this.rightmostFailures;this.rightmostFailures=undefined}var origPos=inputStream.pos;var memoPos=this.maybeSkipSpacesBefore(expr);if(this.isTracing()){var origTrace=this.trace;this.trace=[]}var ans=expr.eval(this);if(this.isTracing()){var bindings=this.bindings.slice(origNumBindings);var traceEntry=this.getTraceEntry(memoPos,expr,ans,bindings);traceEntry.isImplicitSpaces=expr===applySpaces;traceEntry.isRootNode=expr===this.startExpr;origTrace.push(traceEntry);this.trace=origTrace}if(ans){if(this.rightmostFailures&&(inputStream.pos===this.rightmostFailurePosition||this.skipSpacesIfInSyntacticContext()===this.rightmostFailurePosition)){var self=this;Object.keys(this.rightmostFailures).forEach(function(key){self.rightmostFailures[key].makeFluffy()})}}else{inputStream.pos=origPos;this.truncateBindings(origNumBindings)}if(this.recordingMode===RM_RIGHTMOST_FAILURES&&origFailures){this.addRightmostFailures(origFailures,false)}return ans},_getStartExpr:function(grammar,optStartApplication){var applicationStr=optStartApplication||grammar.defaultStartRule;if(!applicationStr){throw new Error("Missing start rule argument -- the grammar has no default start rule.")}var startApp=grammar.parseApplication(applicationStr);return new pexprs.Seq([startApp,pexprs.end])},evalFromStart:function(){this.eval(this.startExpr)},getFailuresInfo:function(){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){return this.rightmostFailurePosition}else{return this.rightmostFailures}},restoreFailuresInfo:function(failuresInfo){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){this.rightmostFailurePosition=failuresInfo}else{this.rightmostFailures=failuresInfo}}};module.exports=State},{"./InputStream":40,"./PosInfo":44,"./Trace":47,"./pexprs":67}],47:[function(require,module,exports){"use strict";var Interval=require("./Interval");var common=require("./common");var BALLOT_X="✗";var CHECK_MARK="✓";var DOT_OPERATOR="⋅";var RIGHTWARDS_DOUBLE_ARROW="⇒";var SYMBOL_FOR_HORIZONTAL_TABULATION="␉";var SYMBOL_FOR_LINE_FEED="␊";var SYMBOL_FOR_CARRIAGE_RETURN="␍";function spaces(n){return common.repeat(" ",n).join("")}function getInputExcerpt(inputStream,pos,len){var excerpt=asEscapedString(inputStream.sourceSlice(pos,pos+len));if(excerpt.length0){arr.push(fn())}return arr};exports.repeatStr=function(str,n){return new Array(n+1).join(str)};exports.repeat=function(x,n){return exports.repeatFn(function(){return x},n)};exports.getDuplicates=function(array){var duplicates=[];for(var idx=0;idx1){throw multipleErrors(errors)}}}},{"./Namespace":43}],50:[function(require,module,exports){"use strict";var Builder=require("./Builder");var Grammar=require("./Grammar");var Namespace=require("./Namespace");var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");var util=require("./util");var isBuffer=require("is-buffer");var ohmGrammar;var documentInterface={querySelector:function(sel){return document.querySelector(sel)},querySelectorAll:function(sel){return document.querySelectorAll(sel)}};function isElement(obj){return!!(obj&&obj.nodeType===1)}function isUndefined(obj){return obj===void 0}var MAX_ARRAY_INDEX=Math.pow(2,53)-1;function isArrayLike(obj){if(obj==null){return false}var length=obj.length;return typeof length==="number"&&length>=0&&length<=MAX_ARRAY_INDEX}function load(url){var req=new XMLHttpRequest;req.open("GET",url,false);try{req.send();if(req.status===0||req.status===200){return req.responseText}}catch(e){}throw new Error("unable to load url "+url)}function buildGrammar(match,namespace,optOhmGrammarForTesting){var builder=new Builder;var decl;var currentRuleName;var currentRuleFormals;var overriding=false;var metaGrammar=optOhmGrammarForTesting||ohmGrammar;var helpers=metaGrammar.semantics().addOperation("visit",{Grammar:function(n,s,open,rs,close){var grammarName=n.visit();decl=builder.newGrammar(grammarName,namespace);s.visit();rs.visit();var g=decl.build();g.definitionInterval=this.interval.trimmed();if(grammarName in namespace){throw errors.duplicateGrammarDeclaration(g,namespace)}namespace[grammarName]=g;return g},SuperGrammar:function(_,n){var superGrammarName=n.visit();if(superGrammarName==="null"){decl.withSuperGrammar(null)}else{if(!namespace||!(superGrammarName in namespace)){throw errors.undeclaredGrammar(superGrammarName,namespace,n.interval)}decl.withSuperGrammar(namespace[superGrammarName])}},Rule_define:function(n,fs,d,_,b){currentRuleName=n.visit();currentRuleFormals=fs.visit()[0]||[];if(!decl.defaultStartRule&&decl.ensureSuperGrammar()!==Grammar.ProtoBuiltInRules){decl.withDefaultStartRule(currentRuleName)}var body=b.visit();body.definitionInterval=this.interval.trimmed();var description=d.visit()[0];return decl.define(currentRuleName,currentRuleFormals,body,description)},Rule_override:function(n,fs,_,b){currentRuleName=n.visit();currentRuleFormals=fs.visit()[0]||[];overriding=true;var body=b.visit();body.definitionInterval=this.interval.trimmed();var ans=decl.override(currentRuleName,currentRuleFormals,body);overriding=false;return ans},Rule_extend:function(n,fs,_,b){currentRuleName=n.visit();currentRuleFormals=fs.visit()[0]||[];var body=b.visit();var ans=decl.extend(currentRuleName,currentRuleFormals,body);decl.ruleBodies[currentRuleName].definitionInterval=this.interval.trimmed();return ans},RuleBody:function(_,term,_bars,terms){var args=[term.visit()].concat(terms.visit());return builder.alt.apply(builder,args).withInterval(this.interval)},Formals:function(opointy,fs,cpointy){return fs.visit()},Params:function(opointy,ps,cpointy){return ps.visit()},Alt:function(seq,_,seqs){var args=[seq.visit()].concat(seqs.visit());return builder.alt.apply(builder,args).withInterval(this.interval)},TopLevelTerm_inline:function(b,n){var inlineRuleName=currentRuleName+"_"+n.visit();var body=b.visit();body.definitionInterval=this.interval.trimmed();var isNewRuleDeclaration=!(decl.superGrammar&&decl.superGrammar.ruleBodies[inlineRuleName]);if(overriding&&!isNewRuleDeclaration){decl.override(inlineRuleName,currentRuleFormals,body)}else{decl.define(inlineRuleName,currentRuleFormals,body)}var params=currentRuleFormals.map(function(formal){return builder.app(formal)});return builder.app(inlineRuleName,params).withInterval(body.interval)},Seq:function(expr){return builder.seq.apply(builder,expr.visit()).withInterval(this.interval)},Iter_star:function(x,_){return builder.star(x.visit()).withInterval(this.interval)},Iter_plus:function(x,_){return builder.plus(x.visit()).withInterval(this.interval)},Iter_opt:function(x,_){return builder.opt(x.visit()).withInterval(this.interval)},Pred_not:function(_,x){return builder.not(x.visit()).withInterval(this.interval)},Pred_lookahead:function(_,x){return builder.la(x.visit()).withInterval(this.interval)},Lex_lex:function(_,x){return builder.lex(x.visit()).withInterval(this.interval)},Base_application:function(rule,ps){return builder.app(rule.visit(),ps.visit()[0]||[]).withInterval(this.interval)},Base_range:function(from,_,to){return builder.range(from.visit(),to.visit()).withInterval(this.interval)},Base_terminal:function(expr){return builder.terminal(expr.visit()).withInterval(this.interval)},Base_paren:function(open,x,close){return x.visit()},ruleDescr:function(open,t,close){return t.visit()},ruleDescrText:function(_){return this.interval.contents.trim()},caseName:function(_,space1,n,space2,end){return n.visit()},name:function(first,rest){return this.interval.contents},nameFirst:function(expr){},nameRest:function(expr){},terminal:function(open,cs,close){return cs.visit().map(function(c){return common.unescapeChar(c)}).join("")},terminalChar:function(_){return this.interval.contents},escapeChar:function(_){return this.interval.contents},NonemptyListOf:function(x,_,xs){return[x.visit()].concat(xs.visit())},EmptyListOf:function(){return[]},_terminal:function(){return this.primitiveValue}});return helpers(match).visit()}function compileAndLoad(source,namespace){var m=ohmGrammar.match(source,"Grammars");if(m.failed()){throw errors.grammarSyntaxError(m)}return buildGrammar(m,namespace)}function getScriptElementContents(el){if(!isElement(el)){throw new TypeError("Expected a DOM Node, got "+common.unexpectedObjToString(el))}if(el.type!=="text/ohm-js"){throw new Error('Expected a script tag with type="text/ohm-js", got '+el)}return el.getAttribute("src")?load(el.getAttribute("src")):el.innerHTML}function grammar(source,optNamespace){var ns=grammars(source,optNamespace);var grammarNames=Object.keys(ns);if(grammarNames.length===0){throw new Error("Missing grammar definition")}else if(grammarNames.length>1){var secondGrammar=ns[grammarNames[1]];var interval=secondGrammar.definitionInterval;throw new Error(util.getLineAndColumnMessage(interval.inputStream.source,interval.startIdx)+"Found more than one grammar definition -- use ohm.grammars() instead.")}return ns[grammarNames[0]]}function grammars(source,optNamespace){var ns=Namespace.extend(Namespace.asNamespace(optNamespace));if(typeof source!=="string"){if(isBuffer(source)){source=source.toString()}else{throw new TypeError("Expected string as first argument, got "+common.unexpectedObjToString(source))}}compileAndLoad(source,ns);return ns}function grammarFromScriptElement(optNode){var node=optNode;if(isUndefined(node)){var nodeList=documentInterface.querySelectorAll('script[type="text/ohm-js"]');if(nodeList.length!==1){throw new Error('Expected exactly one script tag with type="text/ohm-js", found '+nodeList.length)}node=nodeList[0]}return grammar(getScriptElementContents(node))}function grammarsFromScriptElements(optNodeOrNodeList){if(isElement(optNodeOrNodeList)){return grammars(optNodeOrNodeList)}var nodeList=optNodeOrNodeList;if(isUndefined(nodeList)){nodeList=documentInterface.querySelectorAll('script[type="text/ohm-js"]')}else if(typeof nodeList==="string"||!isElement(nodeList)&&!isArrayLike(nodeList)){throw new TypeError("Expected a Node, NodeList, or Array, but got "+nodeList)}var ns=Namespace.createNamespace();for(var i=0;i0};Node.prototype.hasNoChildren=function(){return!this.hasChildren()};Node.prototype.onlyChild=function(){if(this.children.length!==1){throw new Error("cannot get only child of a node of type "+this.ctorName+" (it has "+this.numChildren()+" children)")}else{return this.firstChild()}};Node.prototype.firstChild=function(){if(this.hasNoChildren()){throw new Error("cannot get first child of a "+this.ctorName+" node, which has no children")}else{return this.childAt(0)}};Node.prototype.lastChild=function(){if(this.hasNoChildren()){throw new Error("cannot get last child of a "+this.ctorName+" node, which has no children")}else{return this.childAt(this.numChildren()-1)}};Node.prototype.childBefore=function(child){var childIdx=this.indexOfChild(child);if(childIdx<0){throw new Error("Node.childBefore() called w/ an argument that is not a child")}else if(childIdx===0){throw new Error("cannot get child before first child")}else{return this.childAt(childIdx-1)}};Node.prototype.childAfter=function(child){var childIdx=this.indexOfChild(child);if(childIdx<0){throw new Error("Node.childAfter() called w/ an argument that is not a child")}else if(childIdx===this.numChildren()-1){throw new Error("cannot get child after last child")}else{return this.childAt(childIdx+1)}};Node.prototype.isTerminal=function(){return false};Node.prototype.isNonterminal=function(){return false};Node.prototype.isIteration=function(){return false};Node.prototype.isOptional=function(){return false};Node.prototype.toJSON=function(){var r={};r[this.ctorName]=this.children;return r};function TerminalNode(grammar,value,interval){Node.call(this,grammar,"_terminal",[],interval);this.primitiveValue=value}inherits(TerminalNode,Node);TerminalNode.prototype.isTerminal=function(){return true};function NonterminalNode(grammar,ruleName,children,interval){Node.call(this,grammar,ruleName,children,interval)}inherits(NonterminalNode,Node);NonterminalNode.prototype.isNonterminal=function(){return true};NonterminalNode.prototype.isLexical=function(){return common.isLexical(this.ctorName)};NonterminalNode.prototype.isSyntactic=function(){return common.isSyntactic(this.ctorName)};function IterationNode(grammar,children,interval,optional){Node.call(this,grammar,"_iter",children,interval);this.optional=optional}inherits(IterationNode,Node);IterationNode.prototype.isIteration=function(){return true};IterationNode.prototype.isOptional=function(){return this.optional};module.exports={Node:Node,TerminalNode:TerminalNode,NonterminalNode:NonterminalNode,IterationNode:IterationNode}},{"./common":48,inherits:33}],52:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");pexprs.PExpr.prototype.allowsSkippingPrecedingSpace=common.abstract;pexprs.any.allowsSkippingPrecedingSpace=pexprs.end.allowsSkippingPrecedingSpace=pexprs.Apply.prototype.allowsSkippingPrecedingSpace=pexprs.Terminal.prototype.allowsSkippingPrecedingSpace=pexprs.Range.prototype.allowsSkippingPrecedingSpace=pexprs.UnicodeChar.prototype.allowsSkippingPrecedingSpace=function(){return true};pexprs.Alt.prototype.allowsSkippingPrecedingSpace=pexprs.Iter.prototype.allowsSkippingPrecedingSpace=pexprs.Lex.prototype.allowsSkippingPrecedingSpace=pexprs.Lookahead.prototype.allowsSkippingPrecedingSpace=pexprs.Not.prototype.allowsSkippingPrecedingSpace=pexprs.Param.prototype.allowsSkippingPrecedingSpace=pexprs.Seq.prototype.allowsSkippingPrecedingSpace=function(){return false}},{"./common":48,"./pexprs":67}],53:[function(require,module,exports){"use strict";var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");var lexifyCount;pexprs.PExpr.prototype.assertAllApplicationsAreValid=function(ruleName,grammar){lexifyCount=0;this._assertAllApplicationsAreValid(ruleName,grammar)};pexprs.PExpr.prototype._assertAllApplicationsAreValid=common.abstract;pexprs.any._assertAllApplicationsAreValid=pexprs.end._assertAllApplicationsAreValid=pexprs.Terminal.prototype._assertAllApplicationsAreValid=pexprs.Range.prototype._assertAllApplicationsAreValid=pexprs.Param.prototype._assertAllApplicationsAreValid=pexprs.UnicodeChar.prototype._assertAllApplicationsAreValid=function(ruleName,grammar){};pexprs.Lex.prototype._assertAllApplicationsAreValid=function(ruleName,grammar){lexifyCount++;this.expr._assertAllApplicationsAreValid(ruleName,grammar);lexifyCount--};pexprs.Alt.prototype._assertAllApplicationsAreValid=function(ruleName,grammar){for(var idx=0;idx0)){throw errors.applicationOfSyntacticRuleFromLexicalContext(this.ruleName,this)}var actual=this.args.length;var expected=grammar.ruleFormals[this.ruleName].length;if(actual!==expected){throw errors.wrongNumberOfArguments(this.ruleName,expected,actual,this)}var self=this;this.args.forEach(function(arg){arg._assertAllApplicationsAreValid(ruleName,grammar);if(arg.getArity()!==1){throw errors.invalidParameter(self.ruleName,arg)}})}},{"./common":48,"./errors":49,"./pexprs":67}],54:[function(require,module,exports){"use strict";var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");pexprs.PExpr.prototype.assertChoicesHaveUniformArity=common.abstract;pexprs.any.assertChoicesHaveUniformArity=pexprs.end.assertChoicesHaveUniformArity=pexprs.Terminal.prototype.assertChoicesHaveUniformArity=pexprs.Range.prototype.assertChoicesHaveUniformArity=pexprs.Param.prototype.assertChoicesHaveUniformArity=pexprs.Lex.prototype.assertChoicesHaveUniformArity=pexprs.UnicodeChar.prototype.assertChoicesHaveUniformArity=function(ruleName){};pexprs.Alt.prototype.assertChoicesHaveUniformArity=function(ruleName){if(this.terms.length===0){return}var arity=this.terms[0].getArity();for(var idx=0;idx=1};pexprs.end.check=function(grammar,vals){return vals[0]instanceof nodes.Node&&vals[0].isTerminal()&&vals[0].primitiveValue===undefined};pexprs.Terminal.prototype.check=function(grammar,vals){return vals[0]instanceof nodes.Node&&vals[0].isTerminal()&&vals[0].primitiveValue===this.obj};pexprs.Range.prototype.check=function(grammar,vals){return vals[0]instanceof nodes.Node&&vals[0].isTerminal()&&typeof vals[0].primitiveValue===typeof this.from};pexprs.Param.prototype.check=function(grammar,vals){return vals.length>=1};pexprs.Alt.prototype.check=function(grammar,vals){for(var i=0;i=0){if(this.args.length>0){throw new Error("Parameterized rules cannot be passed as arguments to another rule.")}return new pexprs.Param(index)}else{this.args.forEach(function(arg,idx,args){args[idx]=arg.introduceParams(formals)});return this}}},{"./common":48,"./pexprs":67}],60:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");pexprs.PExpr.prototype.isNullable=function(grammar){return this._isNullable(grammar,Object.create(null))};pexprs.PExpr.prototype._isNullable=common.abstract;pexprs.any._isNullable=pexprs.Range.prototype._isNullable=pexprs.Param.prototype._isNullable=pexprs.Plus.prototype._isNullable=pexprs.UnicodeChar.prototype._isNullable=function(grammar,memo){return false};pexprs.end._isNullable=function(grammar,memo){return true};pexprs.Terminal.prototype._isNullable=function(grammar,memo){if(typeof this.obj==="string"){return this.obj===""}else{return false}};pexprs.Alt.prototype._isNullable=function(grammar,memo){return this.terms.length===0||this.terms.some(function(term){return term._isNullable(grammar,memo)})};pexprs.Seq.prototype._isNullable=function(grammar,memo){return this.factors.every(function(factor){return factor._isNullable(grammar,memo)})};pexprs.Star.prototype._isNullable=pexprs.Opt.prototype._isNullable=pexprs.Not.prototype._isNullable=pexprs.Lookahead.prototype._isNullable=function(grammar,memo){ -return true};pexprs.Lex.prototype._isNullable=function(grammar,memo){return this.expr._isNullable(grammar,memo)};pexprs.Apply.prototype._isNullable=function(grammar,memo){var key=this.toMemoKey();if(!Object.prototype.hasOwnProperty.call(memo,key)){var body=grammar.ruleBodies[this.ruleName];var inlined=body.substituteParams(this.args);memo[key]=false;memo[key]=inlined._isNullable(grammar,memo)}return memo[key]}},{"./common":48,"./pexprs":67}],61:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");function escapeString(str){var output=JSON.stringify(str);output=output.replace(/[\u2028\u2029]/g,function(char,pos,str){var hex=char.codePointAt(0).toString(16);return"\\u"+"0000".slice(hex.length)+hex});return output}function getIntervalInfo(expr,grammarInterval){if(expr.interval&&grammarInterval){var adjusted=expr.interval.relativeTo(grammarInterval);var start=adjusted.startIdx;var end=adjusted.endIdx;return".withInterval(decl.sourceInterval("+start+", "+end+"))"}return""}pexprs.PExpr.prototype.outputRecipe=common.abstract;pexprs.any.outputRecipe=function(sb,formals,grammarInterval){throw new Error("should never output a recipe for `any` expression")};pexprs.end.outputRecipe=function(sb,formals,grammarInterval){throw new Error("should never output a recipe for `end` expression")};pexprs.Terminal.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.terminal(");sb.append(typeof this.obj==="string"?escapeString(this.obj):""+this.obj);sb.append(")"+getIntervalInfo(this,grammarInterval))};pexprs.Range.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.range(");sb.append(JSON.stringify(this.from));sb.append(", ");sb.append(JSON.stringify(this.to));sb.append(")"+getIntervalInfo(this,grammarInterval))};pexprs.Param.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.param("+this.index+")"+getIntervalInfo(this,grammarInterval))};pexprs.Alt.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.alt(");for(var idx=0;idx0){sb.append(", ")}this.terms[idx].outputRecipe(sb,formals,grammarInterval)}sb.append(")"+getIntervalInfo(this,grammarInterval))};pexprs.Extend.prototype.outputRecipe=function(sb,formals,grammarInterval){var extension=this.terms[0];extension.outputRecipe(sb,formals,grammarInterval)};pexprs.Seq.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.seq(");for(var idx=0;idx0){sb.append(", ")}this.factors[idx].outputRecipe(sb,formals,grammarInterval)}sb.append(")"+getIntervalInfo(this,grammarInterval))};pexprs.Star.prototype.outputRecipe=pexprs.Plus.prototype.outputRecipe=pexprs.Opt.prototype.outputRecipe=pexprs.Not.prototype.outputRecipe=pexprs.Lex.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this."+this.constructor.name.toLowerCase()+"(");this.expr.outputRecipe(sb,formals,grammarInterval);sb.append(")"+getIntervalInfo(this,grammarInterval))};pexprs.Lookahead.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.la(");this.expr.outputRecipe(sb,formals,grammarInterval);sb.append(")"+getIntervalInfo(this,grammarInterval))};pexprs.Apply.prototype.outputRecipe=function(sb,formals,grammarInterval){sb.append("this.app(");sb.append(JSON.stringify(this.ruleName));if(this.ruleName.indexOf("_")>=0&&formals.length>0){var apps=formals.map(function(_,idx){return"this.param("+idx+")"});sb.append(", ["+apps.join(", ")+"]")}else if(this.args.length>0){sb.append(", [");this.args.forEach(function(arg,idx){if(idx>0){sb.append(", ")}arg.outputRecipe(sb,formals,grammarInterval)});sb.append("]")}sb.append(")"+getIntervalInfo(this,grammarInterval))}},{"./common":48,"./pexprs":67}],62:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");pexprs.PExpr.prototype.substituteParams=common.abstract;pexprs.any.substituteParams=pexprs.end.substituteParams=pexprs.Terminal.prototype.substituteParams=pexprs.Range.prototype.substituteParams=pexprs.Terminal.prototype.substituteParams=pexprs.UnicodeChar.prototype.substituteParams=function(actuals){return this};pexprs.Param.prototype.substituteParams=function(actuals){return actuals[this.index]};pexprs.Alt.prototype.substituteParams=function(actuals){return new pexprs.Alt(this.terms.map(function(term){return term.substituteParams(actuals)}))};pexprs.Seq.prototype.substituteParams=function(actuals){return new pexprs.Seq(this.factors.map(function(factor){return factor.substituteParams(actuals)}))};pexprs.Iter.prototype.substituteParams=pexprs.Not.prototype.substituteParams=pexprs.Lookahead.prototype.substituteParams=pexprs.Lex.prototype.substituteParams=function(actuals){return new this.constructor(this.expr.substituteParams(actuals))};pexprs.Apply.prototype.substituteParams=function(actuals){if(this.args.length===0){return this}else{var args=this.args.map(function(arg){return arg.substituteParams(actuals)});return new pexprs.Apply(this.ruleName,args)}}},{"./common":48,"./pexprs":67}],63:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");var copyWithoutDuplicates=common.copyWithoutDuplicates;pexprs.PExpr.prototype.toArgumentNameList=common.abstract;pexprs.any.toArgumentNameList=function(firstArgIndex){return["any"]};pexprs.end.toArgumentNameList=function(firstArgIndex){return["end"]};pexprs.Terminal.prototype.toArgumentNameList=function(firstArgIndex){if(typeof this.obj==="string"&&/^[_a-zA-Z0-9]+$/.test(this.obj)){return["_"+this.obj]}else{return["$"+firstArgIndex]}};pexprs.Range.prototype.toArgumentNameList=function(firstArgIndex){return[this.from+"_to_"+this.to]};pexprs.Alt.prototype.toArgumentNameList=function(firstArgIndex){var termArgNameLists=this.terms.map(function(term){return term.toArgumentNameList(firstArgIndex)});var argumentNameList=[];var numArgs=termArgNameLists[0].length;for(var colIdx=0;colIdx0){var ps=this.args.map(function(arg){return arg.toString()});return this.ruleName+"<"+ps.join(",")+">"}else{return this.ruleName}};pexprs.UnicodeChar.prototype.toString=function(){return"\\p{"+this.category+"}"}},{"./common":48,"./pexprs":67}],67:[function(require,module,exports){"use strict";var UnicodeCategories=require("../third_party/UnicodeCategories");var common=require("./common");var errors=require("./errors");var inherits=require("inherits");function PExpr(){throw new Error("PExpr cannot be instantiated -- it's abstract")}PExpr.prototype.withInterval=function(interval){if(interval){this.interval=interval.trimmed()}return this};var any=Object.create(PExpr.prototype);var end=Object.create(PExpr.prototype);function Terminal(obj){this.obj=obj}inherits(Terminal,PExpr);function Range(from,to){this.from=from;this.to=to}inherits(Range,PExpr);function Param(index){this.index=index}inherits(Param,PExpr);function Alt(terms){this.terms=terms}inherits(Alt,PExpr);function Extend(superGrammar,name,body){this.superGrammar=superGrammar;this.name=name;this.body=body;var origBody=superGrammar.ruleBodies[name];this.terms=[body,origBody]}inherits(Extend,Alt);function Seq(factors){this.factors=factors}inherits(Seq,PExpr);function Iter(expr){this.expr=expr}inherits(Iter,PExpr);function Star(expr){this.expr=expr}inherits(Star,Iter);function Plus(expr){this.expr=expr}inherits(Plus,Iter);function Opt(expr){this.expr=expr}inherits(Opt,Iter);Star.prototype.operator="*";Plus.prototype.operator="+";Opt.prototype.operator="?";Star.prototype.minNumMatches=0;Plus.prototype.minNumMatches=1;Opt.prototype.minNumMatches=0;Star.prototype.maxNumMatches=Number.POSITIVE_INFINITY;Plus.prototype.maxNumMatches=Number.POSITIVE_INFINITY;Opt.prototype.maxNumMatches=1;function Not(expr){this.expr=expr}inherits(Not,PExpr);function Lookahead(expr){this.expr=expr}inherits(Lookahead,PExpr);function Lex(expr){this.expr=expr}inherits(Lex,PExpr);function Arr(expr){this.expr=expr}inherits(Arr,PExpr);function Str(expr){this.expr=expr}inherits(Str,PExpr);function Obj(properties,isLenient){var names=properties.map(function(property){return property.name});var duplicates=common.getDuplicates(names);if(duplicates.length>0){throw errors.duplicatePropertyNames(duplicates)}else{this.properties=properties;this.isLenient=isLenient}}inherits(Obj,PExpr);function Apply(ruleName,optArgs){this.ruleName=ruleName;this.args=optArgs||[]}inherits(Apply,PExpr);Apply.prototype.isSyntactic=function(){return common.isSyntactic(this.ruleName)};Apply.prototype.toMemoKey=function(){if(!this._memoKey){Object.defineProperty(this,"_memoKey",{value:this.toString()})}return this._memoKey};function UnicodeChar(category){this.category=category;this.pattern=UnicodeCategories[category]}inherits(UnicodeChar,PExpr);exports.PExpr=PExpr;exports.any=any;exports.end=end;exports.Terminal=Terminal;exports.Range=Range;exports.Param=Param;exports.Alt=Alt;exports.Extend=Extend;exports.Seq=Seq;exports.Iter=Iter;exports.Star=Star;exports.Plus=Plus;exports.Opt=Opt;exports.Not=Not;exports.Lookahead=Lookahead;exports.Lex=Lex;exports.Arr=Arr;exports.Str=Str;exports.Obj=Obj;exports.Apply=Apply;exports.UnicodeChar=UnicodeChar;require("./pexprs-allowsSkippingPrecedingSpace");require("./pexprs-assertAllApplicationsAreValid");require("./pexprs-assertChoicesHaveUniformArity");require("./pexprs-assertIteratedExprsAreNotNullable");require("./pexprs-check");require("./pexprs-eval");require("./pexprs-getArity");require("./pexprs-outputRecipe");require("./pexprs-introduceParams");require("./pexprs-isNullable");require("./pexprs-substituteParams");require("./pexprs-toDisplayString");require("./pexprs-toArgumentNameList");require("./pexprs-toFailure");require("./pexprs-toString")},{"../third_party/UnicodeCategories":69,"./common":48,"./errors":49,"./pexprs-allowsSkippingPrecedingSpace":52,"./pexprs-assertAllApplicationsAreValid":53,"./pexprs-assertChoicesHaveUniformArity":54,"./pexprs-assertIteratedExprsAreNotNullable":55,"./pexprs-check":56,"./pexprs-eval":57,"./pexprs-getArity":58,"./pexprs-introduceParams":59,"./pexprs-isNullable":60,"./pexprs-outputRecipe":61,"./pexprs-substituteParams":62,"./pexprs-toArgumentNameList":63,"./pexprs-toDisplayString":64,"./pexprs-toFailure":65,"./pexprs-toString":66,inherits:33}],68:[function(require,module,exports){"use strict";var common=require("./common");function padNumbersToEqualLength(arr){var maxLen=0;var strings=arr.map(function(n){var str=n.toString();maxLen=Math.max(maxLen,str.length);return str});return strings.map(function(s){return common.padLeft(s,maxLen)})}function strcpy(dest,src,offset){var origDestLen=dest.length;var start=dest.slice(0,offset);var end=dest.slice(offset+src.length);return(start+src+end).substr(0,origDestLen)}exports.getLineAndColumn=function(str,offset){var lineNum=1;var colNum=1;var currOffset=0;var lineStartOffset=0;var nextLine=null;var prevLine=null;var prevLineStartOffset=-1;while(currOffset=0){prevLine=str.slice(prevLineStartOffset,lineStartOffset).replace(/\r?\n$/,"")}var line=str.slice(lineStartOffset,lineEndOffset).replace(/\r$/,"");return{lineNum:lineNum,colNum:colNum,line:line,prevLine:prevLine,nextLine:nextLine}};exports.getLineAndColumnMessage=function(str,offset){var repeatStr=common.repeatStr;var lineAndCol=exports.getLineAndColumn(str,offset);var sb=new common.StringBuffer;sb.append("Line "+lineAndCol.lineNum+", col "+lineAndCol.colNum+":\n");var lineNumbers=padNumbersToEqualLength([lineAndCol.prevLine==null?0:lineAndCol.lineNum-1,lineAndCol.lineNum,lineAndCol.nextLine==null?0:lineAndCol.lineNum+1]);function appendLine(num,content,prefix){sb.append(prefix+lineNumbers[num]+" | "+content+"\n")}if(lineAndCol.prevLine!=null){appendLine(0,lineAndCol.prevLine," ")}appendLine(1,lineAndCol.line,"> ");var lineLen=lineAndCol.line.length;var indicationLine=repeatStr(" ",lineLen+1);var ranges=Array.prototype.slice.call(arguments,2);for(var i=0;i=0&&startIdx<=endIdx,"range start must be >= 0 and <= end");var lineStartOffset=offset-lineAndCol.colNum+1;startIdx=Math.max(0,startIdx-lineStartOffset);endIdx=Math.min(endIdx-lineStartOffset,lineLen);indicationLine=strcpy(indicationLine,repeatStr("~",endIdx-startIdx),startIdx)}var gutterWidth=2+lineNumbers[1].length+3;sb.append(repeatStr(" ",gutterWidth));indicationLine=strcpy(indicationLine,"^",lineAndCol.colNum-1);sb.append(indicationLine.replace(/ +$/,"")+"\n");if(lineAndCol.nextLine!=null){appendLine(2,lineAndCol.nextLine," ")}return sb.contents()}},{"./common":48}],69:[function(require,module,exports){module.exports={Lu:/[\u0041-\u005A]|[\u00C0-\u00D6]|[\u00D8-\u00DE]|[\u0100-\u0100]|[\u0102-\u0102]|[\u0104-\u0104]|[\u0106-\u0106]|[\u0108-\u0108]|[\u010A-\u010A]|[\u010C-\u010C]|[\u010E-\u010E]|[\u0110-\u0110]|[\u0112-\u0112]|[\u0114-\u0114]|[\u0116-\u0116]|[\u0118-\u0118]|[\u011A-\u011A]|[\u011C-\u011C]|[\u011E-\u011E]|[\u0120-\u0120]|[\u0122-\u0122]|[\u0124-\u0124]|[\u0126-\u0126]|[\u0128-\u0128]|[\u012A-\u012A]|[\u012C-\u012C]|[\u012E-\u012E]|[\u0130-\u0130]|[\u0132-\u0132]|[\u0134-\u0134]|[\u0136-\u0136]|[\u0139-\u0139]|[\u013B-\u013B]|[\u013D-\u013D]|[\u013F-\u013F]|[\u0141-\u0141]|[\u0143-\u0143]|[\u0145-\u0145]|[\u0147-\u0147]|[\u014A-\u014A]|[\u014C-\u014C]|[\u014E-\u014E]|[\u0150-\u0150]|[\u0152-\u0152]|[\u0154-\u0154]|[\u0156-\u0156]|[\u0158-\u0158]|[\u015A-\u015A]|[\u015C-\u015C]|[\u015E-\u015E]|[\u0160-\u0160]|[\u0162-\u0162]|[\u0164-\u0164]|[\u0166-\u0166]|[\u0168-\u0168]|[\u016A-\u016A]|[\u016C-\u016C]|[\u016E-\u016E]|[\u0170-\u0170]|[\u0172-\u0172]|[\u0174-\u0174]|[\u0176-\u0176]|[\u0178-\u0179]|[\u017B-\u017B]|[\u017D-\u017D]|[\u0181-\u0182]|[\u0184-\u0184]|[\u0186-\u0187]|[\u0189-\u018B]|[\u018E-\u0191]|[\u0193-\u0194]|[\u0196-\u0198]|[\u019C-\u019D]|[\u019F-\u01A0]|[\u01A2-\u01A2]|[\u01A4-\u01A4]|[\u01A6-\u01A7]|[\u01A9-\u01A9]|[\u01AC-\u01AC]|[\u01AE-\u01AF]|[\u01B1-\u01B3]|[\u01B5-\u01B5]|[\u01B7-\u01B8]|[\u01BC-\u01BC]|[\u01C4-\u01C4]|[\u01C7-\u01C7]|[\u01CA-\u01CA]|[\u01CD-\u01CD]|[\u01CF-\u01CF]|[\u01D1-\u01D1]|[\u01D3-\u01D3]|[\u01D5-\u01D5]|[\u01D7-\u01D7]|[\u01D9-\u01D9]|[\u01DB-\u01DB]|[\u01DE-\u01DE]|[\u01E0-\u01E0]|[\u01E2-\u01E2]|[\u01E4-\u01E4]|[\u01E6-\u01E6]|[\u01E8-\u01E8]|[\u01EA-\u01EA]|[\u01EC-\u01EC]|[\u01EE-\u01EE]|[\u01F1-\u01F1]|[\u01F4-\u01F4]|[\u01FA-\u01FA]|[\u01FC-\u01FC]|[\u01FE-\u01FE]|[\u0200-\u0200]|[\u0202-\u0202]|[\u0204-\u0204]|[\u0206-\u0206]|[\u0208-\u0208]|[\u020A-\u020A]|[\u020C-\u020C]|[\u020E-\u020E]|[\u0210-\u0210]|[\u0212-\u0212]|[\u0214-\u0214]|[\u0216-\u0216]|[\u0386-\u0386]|[\u0388-\u038A]|[\u038C-\u038C]|[\u038E-\u038F]|[\u0391-\u03A1]|[\u03A3-\u03AB]|[\u03D2-\u03D4]|[\u03DA-\u03DA]|[\u03DC-\u03DC]|[\u03DE-\u03DE]|[\u03E0-\u03E0]|[\u03E2-\u03E2]|[\u03E4-\u03E4]|[\u03E6-\u03E6]|[\u03E8-\u03E8]|[\u03EA-\u03EA]|[\u03EC-\u03EC]|[\u03EE-\u03EE]|[\u0401-\u040C]|[\u040E-\u042F]|[\u0460-\u0460]|[\u0462-\u0462]|[\u0464-\u0464]|[\u0466-\u0466]|[\u0468-\u0468]|[\u046A-\u046A]|[\u046C-\u046C]|[\u046E-\u046E]|[\u0470-\u0470]|[\u0472-\u0472]|[\u0474-\u0474]|[\u0476-\u0476]|[\u0478-\u0478]|[\u047A-\u047A]|[\u047C-\u047C]|[\u047E-\u047E]|[\u0480-\u0480]|[\u0490-\u0490]|[\u0492-\u0492]|[\u0494-\u0494]|[\u0496-\u0496]|[\u0498-\u0498]|[\u049A-\u049A]|[\u049C-\u049C]|[\u049E-\u049E]|[\u04A0-\u04A0]|[\u04A2-\u04A2]|[\u04A4-\u04A4]|[\u04A6-\u04A6]|[\u04A8-\u04A8]|[\u04AA-\u04AA]|[\u04AC-\u04AC]|[\u04AE-\u04AE]|[\u04B0-\u04B0]|[\u04B2-\u04B2]|[\u04B4-\u04B4]|[\u04B6-\u04B6]|[\u04B8-\u04B8]|[\u04BA-\u04BA]|[\u04BC-\u04BC]|[\u04BE-\u04BE]|[\u04C1-\u04C1]|[\u04C3-\u04C3]|[\u04C7-\u04C7]|[\u04CB-\u04CB]|[\u04D0-\u04D0]|[\u04D2-\u04D2]|[\u04D4-\u04D4]|[\u04D6-\u04D6]|[\u04D8-\u04D8]|[\u04DA-\u04DA]|[\u04DC-\u04DC]|[\u04DE-\u04DE]|[\u04E0-\u04E0]|[\u04E2-\u04E2]|[\u04E4-\u04E4]|[\u04E6-\u04E6]|[\u04E8-\u04E8]|[\u04EA-\u04EA]|[\u04EE-\u04EE]|[\u04F0-\u04F0]|[\u04F2-\u04F2]|[\u04F4-\u04F4]|[\u04F8-\u04F8]|[\u0531-\u0556]|[\u10A0-\u10C5]|[\u1E00-\u1E00]|[\u1E02-\u1E02]|[\u1E04-\u1E04]|[\u1E06-\u1E06]|[\u1E08-\u1E08]|[\u1E0A-\u1E0A]|[\u1E0C-\u1E0C]|[\u1E0E-\u1E0E]|[\u1E10-\u1E10]|[\u1E12-\u1E12]|[\u1E14-\u1E14]|[\u1E16-\u1E16]|[\u1E18-\u1E18]|[\u1E1A-\u1E1A]|[\u1E1C-\u1E1C]|[\u1E1E-\u1E1E]|[\u1E20-\u1E20]|[\u1E22-\u1E22]|[\u1E24-\u1E24]|[\u1E26-\u1E26]|[\u1E28-\u1E28]|[\u1E2A-\u1E2A]|[\u1E2C-\u1E2C]|[\u1E2E-\u1E2E]|[\u1E30-\u1E30]|[\u1E32-\u1E32]|[\u1E34-\u1E34]|[\u1E36-\u1E36]|[\u1E38-\u1E38]|[\u1E3A-\u1E3A]|[\u1E3C-\u1E3C]|[\u1E3E-\u1E3E]|[\u1E40-\u1E40]|[\u1E42-\u1E42]|[\u1E44-\u1E44]|[\u1E46-\u1E46]|[\u1E48-\u1E48]|[\u1E4A-\u1E4A]|[\u1E4C-\u1E4C]|[\u1E4E-\u1E4E]|[\u1E50-\u1E50]|[\u1E52-\u1E52]|[\u1E54-\u1E54]|[\u1E56-\u1E56]|[\u1E58-\u1E58]|[\u1E5A-\u1E5A]|[\u1E5C-\u1E5C]|[\u1E5E-\u1E5E]|[\u1E60-\u1E60]|[\u1E62-\u1E62]|[\u1E64-\u1E64]|[\u1E66-\u1E66]|[\u1E68-\u1E68]|[\u1E6A-\u1E6A]|[\u1E6C-\u1E6C]|[\u1E6E-\u1E6E]|[\u1E70-\u1E70]|[\u1E72-\u1E72]|[\u1E74-\u1E74]|[\u1E76-\u1E76]|[\u1E78-\u1E78]|[\u1E7A-\u1E7A]|[\u1E7C-\u1E7C]|[\u1E7E-\u1E7E]|[\u1E80-\u1E80]|[\u1E82-\u1E82]|[\u1E84-\u1E84]|[\u1E86-\u1E86]|[\u1E88-\u1E88]|[\u1E8A-\u1E8A]|[\u1E8C-\u1E8C]|[\u1E8E-\u1E8E]|[\u1E90-\u1E90]|[\u1E92-\u1E92]|[\u1E94-\u1E94]|[\u1EA0-\u1EA0]|[\u1EA2-\u1EA2]|[\u1EA4-\u1EA4]|[\u1EA6-\u1EA6]|[\u1EA8-\u1EA8]|[\u1EAA-\u1EAA]|[\u1EAC-\u1EAC]|[\u1EAE-\u1EAE]|[\u1EB0-\u1EB0]|[\u1EB2-\u1EB2]|[\u1EB4-\u1EB4]|[\u1EB6-\u1EB6]|[\u1EB8-\u1EB8]|[\u1EBA-\u1EBA]|[\u1EBC-\u1EBC]|[\u1EBE-\u1EBE]|[\u1EC0-\u1EC0]|[\u1EC2-\u1EC2]|[\u1EC4-\u1EC4]|[\u1EC6-\u1EC6]|[\u1EC8-\u1EC8]|[\u1ECA-\u1ECA]|[\u1ECC-\u1ECC]|[\u1ECE-\u1ECE]|[\u1ED0-\u1ED0]|[\u1ED2-\u1ED2]|[\u1ED4-\u1ED4]|[\u1ED6-\u1ED6]|[\u1ED8-\u1ED8]|[\u1EDA-\u1EDA]|[\u1EDC-\u1EDC]|[\u1EDE-\u1EDE]|[\u1EE0-\u1EE0]|[\u1EE2-\u1EE2]|[\u1EE4-\u1EE4]|[\u1EE6-\u1EE6]|[\u1EE8-\u1EE8]|[\u1EEA-\u1EEA]|[\u1EEC-\u1EEC]|[\u1EEE-\u1EEE]|[\u1EF0-\u1EF0]|[\u1EF2-\u1EF2]|[\u1EF4-\u1EF4]|[\u1EF6-\u1EF6]|[\u1EF8-\u1EF8]|[\u1F08-\u1F0F]|[\u1F18-\u1F1D]|[\u1F28-\u1F2F]|[\u1F38-\u1F3F]|[\u1F48-\u1F4D]|[\u1F59-\u1F59]|[\u1F5B-\u1F5B]|[\u1F5D-\u1F5D]|[\u1F5F-\u1F5F]|[\u1F68-\u1F6F]|[\u1F88-\u1F8F]|[\u1F98-\u1F9F]|[\u1FA8-\u1FAF]|[\u1FB8-\u1FBC]|[\u1FC8-\u1FCC]|[\u1FD8-\u1FDB]|[\u1FE8-\u1FEC]|[\u1FF8-\u1FFC]|[\u2102-\u2102]|[\u2107-\u2107]|[\u210B-\u210D]|[\u2110-\u2112]|[\u2115-\u2115]|[\u2119-\u211D]|[\u2124-\u2124]|[\u2126-\u2126]|[\u2128-\u2128]|[\u212A-\u212D]|[\u2130-\u2131]|[\u2133-\u2133]|[\uFF21-\uFF3A]/,Ll:/[\u0061-\u007A]|[\u00AA-\u00AA]|[\u00B5-\u00B5]|[\u00BA-\u00BA]|[\u00DF-\u00F6]|[\u00F8-\u00FF]|[\u0101-\u0101]|[\u0103-\u0103]|[\u0105-\u0105]|[\u0107-\u0107]|[\u0109-\u0109]|[\u010B-\u010B]|[\u010D-\u010D]|[\u010F-\u010F]|[\u0111-\u0111]|[\u0113-\u0113]|[\u0115-\u0115]|[\u0117-\u0117]|[\u0119-\u0119]|[\u011B-\u011B]|[\u011D-\u011D]|[\u011F-\u011F]|[\u0121-\u0121]|[\u0123-\u0123]|[\u0125-\u0125]|[\u0127-\u0127]|[\u0129-\u0129]|[\u012B-\u012B]|[\u012D-\u012D]|[\u012F-\u012F]|[\u0131-\u0131]|[\u0133-\u0133]|[\u0135-\u0135]|[\u0137-\u0138]|[\u013A-\u013A]|[\u013C-\u013C]|[\u013E-\u013E]|[\u0140-\u0140]|[\u0142-\u0142]|[\u0144-\u0144]|[\u0146-\u0146]|[\u0148-\u0149]|[\u014B-\u014B]|[\u014D-\u014D]|[\u014F-\u014F]|[\u0151-\u0151]|[\u0153-\u0153]|[\u0155-\u0155]|[\u0157-\u0157]|[\u0159-\u0159]|[\u015B-\u015B]|[\u015D-\u015D]|[\u015F-\u015F]|[\u0161-\u0161]|[\u0163-\u0163]|[\u0165-\u0165]|[\u0167-\u0167]|[\u0169-\u0169]|[\u016B-\u016B]|[\u016D-\u016D]|[\u016F-\u016F]|[\u0171-\u0171]|[\u0173-\u0173]|[\u0175-\u0175]|[\u0177-\u0177]|[\u017A-\u017A]|[\u017C-\u017C]|[\u017E-\u0180]|[\u0183-\u0183]|[\u0185-\u0185]|[\u0188-\u0188]|[\u018C-\u018D]|[\u0192-\u0192]|[\u0195-\u0195]|[\u0199-\u019B]|[\u019E-\u019E]|[\u01A1-\u01A1]|[\u01A3-\u01A3]|[\u01A5-\u01A5]|[\u01A8-\u01A8]|[\u01AB-\u01AB]|[\u01AD-\u01AD]|[\u01B0-\u01B0]|[\u01B4-\u01B4]|[\u01B6-\u01B6]|[\u01B9-\u01BA]|[\u01BD-\u01BD]|[\u01C6-\u01C6]|[\u01C9-\u01C9]|[\u01CC-\u01CC]|[\u01CE-\u01CE]|[\u01D0-\u01D0]|[\u01D2-\u01D2]|[\u01D4-\u01D4]|[\u01D6-\u01D6]|[\u01D8-\u01D8]|[\u01DA-\u01DA]|[\u01DC-\u01DD]|[\u01DF-\u01DF]|[\u01E1-\u01E1]|[\u01E3-\u01E3]|[\u01E5-\u01E5]|[\u01E7-\u01E7]|[\u01E9-\u01E9]|[\u01EB-\u01EB]|[\u01ED-\u01ED]|[\u01EF-\u01F0]|[\u01F3-\u01F3]|[\u01F5-\u01F5]|[\u01FB-\u01FB]|[\u01FD-\u01FD]|[\u01FF-\u01FF]|[\u0201-\u0201]|[\u0203-\u0203]|[\u0205-\u0205]|[\u0207-\u0207]|[\u0209-\u0209]|[\u020B-\u020B]|[\u020D-\u020D]|[\u020F-\u020F]|[\u0211-\u0211]|[\u0213-\u0213]|[\u0215-\u0215]|[\u0217-\u0217]|[\u0250-\u02A8]|[\u0390-\u0390]|[\u03AC-\u03CE]|[\u03D0-\u03D1]|[\u03D5-\u03D6]|[\u03E3-\u03E3]|[\u03E5-\u03E5]|[\u03E7-\u03E7]|[\u03E9-\u03E9]|[\u03EB-\u03EB]|[\u03ED-\u03ED]|[\u03EF-\u03F2]|[\u0430-\u044F]|[\u0451-\u045C]|[\u045E-\u045F]|[\u0461-\u0461]|[\u0463-\u0463]|[\u0465-\u0465]|[\u0467-\u0467]|[\u0469-\u0469]|[\u046B-\u046B]|[\u046D-\u046D]|[\u046F-\u046F]|[\u0471-\u0471]|[\u0473-\u0473]|[\u0475-\u0475]|[\u0477-\u0477]|[\u0479-\u0479]|[\u047B-\u047B]|[\u047D-\u047D]|[\u047F-\u047F]|[\u0481-\u0481]|[\u0491-\u0491]|[\u0493-\u0493]|[\u0495-\u0495]|[\u0497-\u0497]|[\u0499-\u0499]|[\u049B-\u049B]|[\u049D-\u049D]|[\u049F-\u049F]|[\u04A1-\u04A1]|[\u04A3-\u04A3]|[\u04A5-\u04A5]|[\u04A7-\u04A7]|[\u04A9-\u04A9]|[\u04AB-\u04AB]|[\u04AD-\u04AD]|[\u04AF-\u04AF]|[\u04B1-\u04B1]|[\u04B3-\u04B3]|[\u04B5-\u04B5]|[\u04B7-\u04B7]|[\u04B9-\u04B9]|[\u04BB-\u04BB]|[\u04BD-\u04BD]|[\u04BF-\u04BF]|[\u04C2-\u04C2]|[\u04C4-\u04C4]|[\u04C8-\u04C8]|[\u04CC-\u04CC]|[\u04D1-\u04D1]|[\u04D3-\u04D3]|[\u04D5-\u04D5]|[\u04D7-\u04D7]|[\u04D9-\u04D9]|[\u04DB-\u04DB]|[\u04DD-\u04DD]|[\u04DF-\u04DF]|[\u04E1-\u04E1]|[\u04E3-\u04E3]|[\u04E5-\u04E5]|[\u04E7-\u04E7]|[\u04E9-\u04E9]|[\u04EB-\u04EB]|[\u04EF-\u04EF]|[\u04F1-\u04F1]|[\u04F3-\u04F3]|[\u04F5-\u04F5]|[\u04F9-\u04F9]|[\u0561-\u0587]|[\u10D0-\u10F6]|[\u1E01-\u1E01]|[\u1E03-\u1E03]|[\u1E05-\u1E05]|[\u1E07-\u1E07]|[\u1E09-\u1E09]|[\u1E0B-\u1E0B]|[\u1E0D-\u1E0D]|[\u1E0F-\u1E0F]|[\u1E11-\u1E11]|[\u1E13-\u1E13]|[\u1E15-\u1E15]|[\u1E17-\u1E17]|[\u1E19-\u1E19]|[\u1E1B-\u1E1B]|[\u1E1D-\u1E1D]|[\u1E1F-\u1E1F]|[\u1E21-\u1E21]|[\u1E23-\u1E23]|[\u1E25-\u1E25]|[\u1E27-\u1E27]|[\u1E29-\u1E29]|[\u1E2B-\u1E2B]|[\u1E2D-\u1E2D]|[\u1E2F-\u1E2F]|[\u1E31-\u1E31]|[\u1E33-\u1E33]|[\u1E35-\u1E35]|[\u1E37-\u1E37]|[\u1E39-\u1E39]|[\u1E3B-\u1E3B]|[\u1E3D-\u1E3D]|[\u1E3F-\u1E3F]|[\u1E41-\u1E41]|[\u1E43-\u1E43]|[\u1E45-\u1E45]|[\u1E47-\u1E47]|[\u1E49-\u1E49]|[\u1E4B-\u1E4B]|[\u1E4D-\u1E4D]|[\u1E4F-\u1E4F]|[\u1E51-\u1E51]|[\u1E53-\u1E53]|[\u1E55-\u1E55]|[\u1E57-\u1E57]|[\u1E59-\u1E59]|[\u1E5B-\u1E5B]|[\u1E5D-\u1E5D]|[\u1E5F-\u1E5F]|[\u1E61-\u1E61]|[\u1E63-\u1E63]|[\u1E65-\u1E65]|[\u1E67-\u1E67]|[\u1E69-\u1E69]|[\u1E6B-\u1E6B]|[\u1E6D-\u1E6D]|[\u1E6F-\u1E6F]|[\u1E71-\u1E71]|[\u1E73-\u1E73]|[\u1E75-\u1E75]|[\u1E77-\u1E77]|[\u1E79-\u1E79]|[\u1E7B-\u1E7B]|[\u1E7D-\u1E7D]|[\u1E7F-\u1E7F]|[\u1E81-\u1E81]|[\u1E83-\u1E83]|[\u1E85-\u1E85]|[\u1E87-\u1E87]|[\u1E89-\u1E89]|[\u1E8B-\u1E8B]|[\u1E8D-\u1E8D]|[\u1E8F-\u1E8F]|[\u1E91-\u1E91]|[\u1E93-\u1E93]|[\u1E95-\u1E9B]|[\u1EA1-\u1EA1]|[\u1EA3-\u1EA3]|[\u1EA5-\u1EA5]|[\u1EA7-\u1EA7]|[\u1EA9-\u1EA9]|[\u1EAB-\u1EAB]|[\u1EAD-\u1EAD]|[\u1EAF-\u1EAF]|[\u1EB1-\u1EB1]|[\u1EB3-\u1EB3]|[\u1EB5-\u1EB5]|[\u1EB7-\u1EB7]|[\u1EB9-\u1EB9]|[\u1EBB-\u1EBB]|[\u1EBD-\u1EBD]|[\u1EBF-\u1EBF]|[\u1EC1-\u1EC1]|[\u1EC3-\u1EC3]|[\u1EC5-\u1EC5]|[\u1EC7-\u1EC7]|[\u1EC9-\u1EC9]|[\u1ECB-\u1ECB]|[\u1ECD-\u1ECD]|[\u1ECF-\u1ECF]|[\u1ED1-\u1ED1]|[\u1ED3-\u1ED3]|[\u1ED5-\u1ED5]|[\u1ED7-\u1ED7]|[\u1ED9-\u1ED9]|[\u1EDB-\u1EDB]|[\u1EDD-\u1EDD]|[\u1EDF-\u1EDF]|[\u1EE1-\u1EE1]|[\u1EE3-\u1EE3]|[\u1EE5-\u1EE5]|[\u1EE7-\u1EE7]|[\u1EE9-\u1EE9]|[\u1EEB-\u1EEB]|[\u1EED-\u1EED]|[\u1EEF-\u1EEF]|[\u1EF1-\u1EF1]|[\u1EF3-\u1EF3]|[\u1EF5-\u1EF5]|[\u1EF7-\u1EF7]|[\u1EF9-\u1EF9]|[\u1F00-\u1F07]|[\u1F10-\u1F15]|[\u1F20-\u1F27]|[\u1F30-\u1F37]|[\u1F40-\u1F45]|[\u1F50-\u1F57]|[\u1F60-\u1F67]|[\u1F70-\u1F7D]|[\u1F80-\u1F87]|[\u1F90-\u1F97]|[\u1FA0-\u1FA7]|[\u1FB0-\u1FB4]|[\u1FB6-\u1FB7]|[\u1FBE-\u1FBE]|[\u1FC2-\u1FC4]|[\u1FC6-\u1FC7]|[\u1FD0-\u1FD3]|[\u1FD6-\u1FD7]|[\u1FE0-\u1FE7]|[\u1FF2-\u1FF4]|[\u1FF6-\u1FF7]|[\u207F-\u207F]|[\u210A-\u210A]|[\u210E-\u210F]|[\u2113-\u2113]|[\u2118-\u2118]|[\u212E-\u212F]|[\u2134-\u2134]|[\uFB00-\uFB06]|[\uFB13-\uFB17]|[\uFF41-\uFF5A]/,Lt:/[\u01C5-\u01C5]|[\u01C8-\u01C8]|[\u01CB-\u01CB]|[\u01F2-\u01F2]/,Lm:/[\u02B0-\u02B8]|[\u02BB-\u02C1]|[\u02D0-\u02D1]|[\u02E0-\u02E4]|[\u037A-\u037A]|[\u0559-\u0559]|[\u0640-\u0640]|[\u06E5-\u06E6]|[\u0E46-\u0E46]|[\u0EC6-\u0EC6]|[\u3005-\u3005]|[\u3031-\u3035]|[\u309D-\u309E]|[\u30FC-\u30FE]|[\uFF70-\uFF70]|[\uFF9E-\uFF9F]/,Lo:/[\u01AA-\u01AA]|[\u01BB-\u01BB]|[\u01BE-\u01C3]|[\u03F3-\u03F3]|[\u04C0-\u04C0]|[\u05D0-\u05EA]|[\u05F0-\u05F2]|[\u0621-\u063A]|[\u0641-\u064A]|[\u0671-\u06B7]|[\u06BA-\u06BE]|[\u06C0-\u06CE]|[\u06D0-\u06D3]|[\u06D5-\u06D5]|[\u0905-\u0939]|[\u093D-\u093D]|[\u0950-\u0950]|[\u0958-\u0961]|[\u0985-\u098C]|[\u098F-\u0990]|[\u0993-\u09A8]|[\u09AA-\u09B0]|[\u09B2-\u09B2]|[\u09B6-\u09B9]|[\u09DC-\u09DD]|[\u09DF-\u09E1]|[\u09F0-\u09F1]|[\u0A05-\u0A0A]|[\u0A0F-\u0A10]|[\u0A13-\u0A28]|[\u0A2A-\u0A30]|[\u0A32-\u0A33]|[\u0A35-\u0A36]|[\u0A38-\u0A39]|[\u0A59-\u0A5C]|[\u0A5E-\u0A5E]|[\u0A72-\u0A74]|[\u0A85-\u0A8B]|[\u0A8D-\u0A8D]|[\u0A8F-\u0A91]|[\u0A93-\u0AA8]|[\u0AAA-\u0AB0]|[\u0AB2-\u0AB3]|[\u0AB5-\u0AB9]|[\u0ABD-\u0ABD]|[\u0AD0-\u0AD0]|[\u0AE0-\u0AE0]|[\u0B05-\u0B0C]|[\u0B0F-\u0B10]|[\u0B13-\u0B28]|[\u0B2A-\u0B30]|[\u0B32-\u0B33]|[\u0B36-\u0B39]|[\u0B3D-\u0B3D]|[\u0B5C-\u0B5D]|[\u0B5F-\u0B61]|[\u0B85-\u0B8A]|[\u0B8E-\u0B90]|[\u0B92-\u0B95]|[\u0B99-\u0B9A]|[\u0B9C-\u0B9C]|[\u0B9E-\u0B9F]|[\u0BA3-\u0BA4]|[\u0BA8-\u0BAA]|[\u0BAE-\u0BB5]|[\u0BB7-\u0BB9]|[\u0C05-\u0C0C]|[\u0C0E-\u0C10]|[\u0C12-\u0C28]|[\u0C2A-\u0C33]|[\u0C35-\u0C39]|[\u0C60-\u0C61]|[\u0C85-\u0C8C]|[\u0C8E-\u0C90]|[\u0C92-\u0CA8]|[\u0CAA-\u0CB3]|[\u0CB5-\u0CB9]|[\u0CDE-\u0CDE]|[\u0CE0-\u0CE1]|[\u0D05-\u0D0C]|[\u0D0E-\u0D10]|[\u0D12-\u0D28]|[\u0D2A-\u0D39]|[\u0D60-\u0D61]|[\u0E01-\u0E30]|[\u0E32-\u0E33]|[\u0E40-\u0E45]|[\u0E81-\u0E82]|[\u0E84-\u0E84]|[\u0E87-\u0E88]|[\u0E8A-\u0E8A]|[\u0E8D-\u0E8D]|[\u0E94-\u0E97]|[\u0E99-\u0E9F]|[\u0EA1-\u0EA3]|[\u0EA5-\u0EA5]|[\u0EA7-\u0EA7]|[\u0EAA-\u0EAB]|[\u0EAD-\u0EB0]|[\u0EB2-\u0EB3]|[\u0EBD-\u0EBD]|[\u0EC0-\u0EC4]|[\u0EDC-\u0EDD]|[\u0F00-\u0F00]|[\u0F40-\u0F47]|[\u0F49-\u0F69]|[\u0F88-\u0F8B]|[\u1100-\u1159]|[\u115F-\u11A2]|[\u11A8-\u11F9]|[\u2135-\u2138]|[\u3006-\u3006]|[\u3041-\u3094]|[\u30A1-\u30FA]|[\u3105-\u312C]|[\u3131-\u318E]|[\u4E00-\u9FA5]|[\uAC00-\uD7A3]|[\uF900-\uFA2D]|[\uFB1F-\uFB28]|[\uFB2A-\uFB36]|[\uFB38-\uFB3C]|[\uFB3E-\uFB3E]|[\uFB40-\uFB41]|[\uFB43-\uFB44]|[\uFB46-\uFBB1]|[\uFBD3-\uFD3D]|[\uFD50-\uFD8F]|[\uFD92-\uFDC7]|[\uFDF0-\uFDFB]|[\uFE70-\uFE72]|[\uFE74-\uFE74]|[\uFE76-\uFEFC]|[\uFF66-\uFF6F]|[\uFF71-\uFF9D]|[\uFFA0-\uFFBE]|[\uFFC2-\uFFC7]|[\uFFCA-\uFFCF]|[\uFFD2-\uFFD7]|[\uFFDA-\uFFDC]/, +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SyndicateCompiler=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o1){switch(this.args.mode){case"pattern":return rhsExpr.buildSubscription(this.args.mode);case"instantiated":return lhsExpr.buildSubscription(this.args.mode);case"projection":return"(Syndicate._$("+JSON.stringify(i.slice(1))+","+rhsExpr.buildSubscription(this.args.mode)+"))";default:throw new Error("Unexpected buildSubscription mode "+this.args.mode)}}else{return lhsExpr.buildSubscription(this.args.mode)+_assignmentOperator.buildSubscription(this.args.mode)+rhsExpr.buildSubscription(this.args.mode)}},identifier:function(_name){var i=this.interval.contents;if(i[0]==="$"&&i.length>1){switch(this.args.mode){case"pattern":return"_";case"instantiated":return i.slice(1);case"projection":return"(Syndicate._$("+JSON.stringify(i.slice(1))+"))";default:throw new Error("Unexpected buildSubscription mode "+this.args.mode)}}else{return i}},_terminal:function(){return undefined},_nonterminal:function(children){var self=this;return ES5.translateNonterminalCode(children,function(n){return n.buildSubscription(self.args.mode)})}});semantics.addAttribute("bindings",{_default:function(children){var result=[];this.pushBindings(result);return result}});semantics.addOperation("pushBindings(accumulator)",{identifier:function(_name){var i=this.interval.contents;if(i[0]==="$"&&i.length>1){this.args.accumulator.push(i.slice(1))}},_terminal:function(){},_nonterminal:function(children){var self=this;children.forEach(function(c){c.pushBindings(self.args.accumulator)})}});function compileSyndicateSource(inputSource,onError){var parseResult=grammar.match(inputSource);if(parseResult.failed()){if(onError){return onError(parseResult.message,parseResult)}else{console.error(parseResult.message);return false}}else{return'"use strict";\n'+semantics(parseResult).asES5}}module.exports.grammar=grammar;module.exports.semantics=semantics;module.exports.compileSyndicateSource=compileSyndicateSource}).call(this,require("buffer").Buffer)},{"./es5.js":2,buffer:4,"ohm-js":50,path:8}],2:[function(require,module,exports){(function(Buffer){"use strict";var path=require("path");var ohm=require("ohm-js");function isUndefined(x){return x===void 0}function flattenIterNodes(nodes){var result=[];for(var i=0;i=kMaxLength()){throw new RangeError("Attempt to allocate Buffer larger than maximum "+"size: 0x"+kMaxLength().toString(16)+" bytes")}return length|0}function SlowBuffer(length){if(+length!=length){length=0}return Buffer.alloc(+length)}Buffer.isBuffer=function isBuffer(b){return!!(b!=null&&b._isBuffer)};Buffer.compare=function compare(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){throw new TypeError("Arguments must be Buffers")}if(a===b)return 0;var x=a.length;var y=b.length;for(var i=0,len=Math.min(x,y);i>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase();loweredCase=true}}}Buffer.byteLength=byteLength;function slowToString(encoding,start,end){var loweredCase=false;if(start===undefined||start<0){start=0}if(start>this.length){return""}if(end===undefined||end>this.length){end=this.length}if(end<=0){return""}end>>>=0;start>>>=0;if(end<=start){return""}if(!encoding)encoding="utf8";while(true){switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"binary":return binarySlice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase();loweredCase=true}}}Buffer.prototype._isBuffer=true;function swap(b,n,m){var i=b[n];b[n]=b[m];b[m]=i}Buffer.prototype.swap16=function swap16(){var len=this.length;if(len%2!==0){throw new RangeError("Buffer size must be a multiple of 16-bits")}for(var i=0;i0){str=this.toString("hex",0,max).match(/.{2}/g).join(" ");if(this.length>max)str+=" ... "}return""};Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target)){throw new TypeError("Argument must be a Buffer")}if(start===undefined){start=0}if(end===undefined){end=target?target.length:0}if(thisStart===undefined){thisStart=0}if(thisEnd===undefined){thisEnd=this.length}if(start<0||end>target.length||thisStart<0||thisEnd>this.length){throw new RangeError("out of range index")}if(thisStart>=thisEnd&&start>=end){return 0}if(thisStart>=thisEnd){return-1}if(start>=end){return 1}start>>>=0;end>>>=0;thisStart>>>=0;thisEnd>>>=0;if(this===target)return 0;var x=thisEnd-thisStart;var y=end-start;var len=Math.min(x,y);var thisCopy=this.slice(thisStart,thisEnd);var targetCopy=target.slice(start,end);for(var i=0;i2147483647){byteOffset=2147483647}else if(byteOffset<-2147483648){byteOffset=-2147483648}byteOffset>>=0;if(this.length===0)return-1;if(byteOffset>=this.length)return-1;if(byteOffset<0)byteOffset=Math.max(this.length+byteOffset,0);if(typeof val==="string"){val=Buffer.from(val,encoding)}if(Buffer.isBuffer(val)){if(val.length===0){return-1}return arrayIndexOf(this,val,byteOffset,encoding)}if(typeof val==="number"){if(Buffer.TYPED_ARRAY_SUPPORT&&Uint8Array.prototype.indexOf==="function"){return Uint8Array.prototype.indexOf.call(this,val,byteOffset)}return arrayIndexOf(this,[val],byteOffset,encoding)}throw new TypeError("val must be string, number or Buffer")};Buffer.prototype.includes=function includes(val,byteOffset,encoding){return this.indexOf(val,byteOffset,encoding)!==-1};function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;if(!length){length=remaining}else{length=Number(length);if(length>remaining){length=remaining}}var strLen=string.length;if(strLen%2!==0)throw new Error("Invalid hex string");if(length>strLen/2){length=strLen/2}for(var i=0;iremaining)length=remaining;if(string.length>0&&(length<0||offset<0)||offset>this.length){throw new RangeError("Attempt to write outside buffer bounds")}if(!encoding)encoding="utf8";var loweredCase=false;for(;;){switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"binary":return binaryWrite(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase();loweredCase=true}}};Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(buf,start,end){if(start===0&&end===buf.length){return base64.fromByteArray(buf)}else{return base64.fromByteArray(buf.slice(start,end))}}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);var res=[];var i=start;while(i239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:if(firstByte<128){codePoint=firstByte}break;case 2:secondByte=buf[i+1];if((secondByte&192)===128){tempCodePoint=(firstByte&31)<<6|secondByte&63;if(tempCodePoint>127){codePoint=tempCodePoint}}break;case 3:secondByte=buf[i+1];thirdByte=buf[i+2];if((secondByte&192)===128&&(thirdByte&192)===128){tempCodePoint=(firstByte&15)<<12|(secondByte&63)<<6|thirdByte&63;if(tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)){codePoint=tempCodePoint}}break;case 4:secondByte=buf[i+1];thirdByte=buf[i+2];fourthByte=buf[i+3];if((secondByte&192)===128&&(thirdByte&192)===128&&(fourthByte&192)===128){tempCodePoint=(firstByte&15)<<18|(secondByte&63)<<12|(thirdByte&63)<<6|fourthByte&63;if(tempCodePoint>65535&&tempCodePoint<1114112){codePoint=tempCodePoint}}}}if(codePoint===null){codePoint=65533;bytesPerSequence=1}else if(codePoint>65535){codePoint-=65536;res.push(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}res.push(codePoint);i+=bytesPerSequence}return decodeCodePointsArray(res)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH){return String.fromCharCode.apply(String,codePoints)}var res="";var i=0;while(ilen)end=len;var out="";for(var i=start;ilen){start=len}if(end<0){end+=len;if(end<0)end=0}else if(end>len){end=len}if(endlength)throw new RangeError("Trying to access beyond buffer length")}Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i0&&(mul*=256)){val+=this[offset+--byteLength]*mul}return val};Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);return this[offset]};Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]|this[offset+1]<<8};Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]<<8|this[offset+1]};Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+this[offset+3]*16777216};Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]*16777216+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])};Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var i=byteLength;var mul=1;var val=this[offset+--i];while(i>0&&(mul*=256)){val+=this[offset+--i]*mul}mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readInt8=function readInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);if(!(this[offset]&128))return this[offset];return(255-this[offset]+1)*-1};Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24};Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]};Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,true,23,4)};Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,false,23,4)};Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,true,52,8)};Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,false,52,8)};function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||valuebuf.length)throw new RangeError("Index out of range")}Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;byteLength=byteLength|0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1;var i=0;this[offset]=value&255;while(++i=0&&(mul*=256)){this[offset+i]=value/mul&255}return offset+byteLength};Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,255,0);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);this[offset]=value&255;return offset+1};function objectWriteUInt16(buf,value,offset,littleEndian){if(value<0)value=65535+value+1;for(var i=0,j=Math.min(buf.length-offset,2);i>>(littleEndian?i:1-i)*8}}Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};function objectWriteUInt32(buf,value,offset,littleEndian){if(value<0)value=4294967295+value+1;for(var i=0,j=Math.min(buf.length-offset,4);i>>(littleEndian?i:3-i)*8&255}}Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset+3]=value>>>24;this[offset+2]=value>>>16;this[offset+1]=value>>>8;this[offset]=value&255}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0;var mul=1;var sub=0;this[offset]=value&255;while(++i>0)-sub&255}return offset+byteLength};Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1;var mul=1;var sub=0;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){if(value<0&&sub===0&&this[offset+i+1]!==0){sub=1}this[offset+i]=(value/mul>>0)-sub&255}return offset+byteLength};Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,127,-128);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);if(value<0)value=255+value+1;this[offset]=value&255;return offset+1};Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8;this[offset+2]=value>>>16;this[offset+3]=value>>>24}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(value<0)value=4294967295+value+1;if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38)}ieee754.write(buf,value,offset,littleEndian,23,4);return offset+4}Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){return writeFloat(this,value,offset,true,noAssert)};Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){return writeFloat(this,value,offset,false,noAssert)};function writeDouble(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308)}ieee754.write(buf,value,offset,littleEndian,52,8);return offset+8}Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){return writeDouble(this,value,offset,true,noAssert)};Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){return writeDouble(this,value,offset,false,noAssert)};Buffer.prototype.copy=function copy(target,targetStart,start,end){if(!start)start=0;if(!end&&end!==0)end=this.length;if(targetStart>=target.length)targetStart=target.length;if(!targetStart)targetStart=0;if(end>0&&end=this.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");if(end>this.length)end=this.length;if(target.length-targetStart=0;i--){target[i+targetStart]=this[i+start]}}else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT){for(i=0;i>>0;end=end===undefined?this.length:end>>>0;if(!val)val=0;var i;if(typeof val==="number"){for(i=start;i55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189)}leadSurrogate=null;if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<1114112){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error("Invalid code point")}}return bytes}function asciiToBytes(str){var byteArray=[];for(var i=0;i>8;lo=c%256;byteArray.push(lo);byteArray.push(hi)}return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){ +for(var i=0;i=dst.length||i>=src.length)break;dst[i+offset]=src[i]}return i}function isnan(val){return val!==val}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"base64-js":5,ieee754:6,isarray:7}],5:[function(require,module,exports){"use strict";exports.toByteArray=toByteArray;exports.fromByteArray=fromByteArray;var lookup=[];var revLookup=[];var Arr=typeof Uint8Array!=="undefined"?Uint8Array:Array;function init(){var code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var i=0,len=code.length;i0){throw new Error("Invalid string. Length must be a multiple of 4")}placeHolders=b64[len-2]==="="?2:b64[len-1]==="="?1:0;arr=new Arr(len*3/4-placeHolders);l=placeHolders>0?len-4:len;var L=0;for(i=0,j=0;i>16&255;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}if(placeHolders===2){tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4;arr[L++]=tmp&255}else if(placeHolders===1){tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}return arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[num&63]}function encodeChunk(uint8,start,end){var tmp;var output=[];for(var i=start;ilen2?len2:i+maxChunkLength))}if(extraBytes===1){tmp=uint8[len-1];output+=lookup[tmp>>2];output+=lookup[tmp<<4&63];output+="=="}else if(extraBytes===2){tmp=(uint8[len-2]<<8)+uint8[len-1];output+=lookup[tmp>>10];output+=lookup[tmp>>4&63];output+=lookup[tmp<<2&63];output+="="}parts.push(output);return parts.join("")}},{}],6:[function(require,module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m;var eLen=nBytes*8-mLen-1;var eMax=(1<>1;var nBits=-7;var i=isLE?nBytes-1:0;var d=isLE?-1:1;var s=buffer[offset+i];i+=d;e=s&(1<<-nBits)-1;s>>=-nBits;nBits+=eLen;for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}m=e&(1<<-nBits)-1;e>>=-nBits;nBits+=mLen;for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}if(e===0){e=1-eBias}else if(e===eMax){return m?NaN:(s?-1:1)*Infinity}else{m=m+Math.pow(2,mLen);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)};exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c;var eLen=nBytes*8-mLen-1;var eMax=(1<>1;var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;var i=isLE?0:nBytes-1;var d=isLE?1:-1;var s=value<0||value===0&&1/value<0?1:0;value=Math.abs(value);if(isNaN(value)||value===Infinity){m=isNaN(value)?1:0;e=eMax}else{e=Math.floor(Math.log(value)/Math.LN2);if(value*(c=Math.pow(2,-e))<1){e--;c*=2}if(e+eBias>=1){value+=rt/c}else{value+=rt*Math.pow(2,1-eBias)}if(value*c>=2){e++;c/=2}if(e+eBias>=eMax){m=0;e=eMax}else if(e+eBias>=1){m=(value*c-1)*Math.pow(2,mLen);e=e+eBias}else{m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);e=0}}for(;mLen>=8;buffer[offset+i]=m&255,i+=d,m/=256,mLen-=8){}e=e<0;buffer[offset+i]=e&255,i+=d,e/=256,eLen-=8){}buffer[offset+i-d]|=s*128}},{}],7:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return toString.call(arr)=="[object Array]"}},{}],8:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function(filename){return splitPathRe.exec(filename).slice(1)};exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i1){for(var i=1;i\n = NonemptyListOf\n | EmptyListOf\n\n NonemptyListOf\n = elem (sep elem)*\n\n EmptyListOf\n = /* nothing */\n\n listOf\n = nonemptyListOf\n | emptyListOf\n\n nonemptyListOf\n = elem (sep elem)*\n\n emptyListOf\n = /* nothing */\n\n}'},"BuiltInRules",null,null,{alnum:["define",{sourceInterval:[18,78]},"an alpha-numeric character",[],["alt",{sourceInterval:[60,78]},["app",{sourceInterval:[60,66]},"letter",[]],["app",{sourceInterval:[73,78]},"digit",[]]]],letter:["define",{sourceInterval:[82,142]},"a letter",[],["alt",{sourceInterval:[107,142]},["app",{sourceInterval:[107,112]},"lower",[]],["app",{sourceInterval:[119,124]},"upper",[]],["app",{sourceInterval:[131,142]},"unicodeLtmo",[]]]],digit:["define",{sourceInterval:[146,177]},"a digit",[],["range",{sourceInterval:[169,177]},"0","9"]],hexDigit:["define",{sourceInterval:[181,254]},"a hexadecimal digit",[],["alt",{sourceInterval:[219,254]},["app",{sourceInterval:[219,224]},"digit",[]],["range",{sourceInterval:[231,239]},"a","f"],["range",{sourceInterval:[246,254]},"A","F"]]],ListOf:["define",{sourceInterval:[258,336]},null,["elem","sep"],["alt",{sourceInterval:[282,336]},["app",{sourceInterval:[282,307]},"NonemptyListOf",[["param",{},0],["param",{},1]]],["app",{sourceInterval:[314,336]},"EmptyListOf",[["param",{},0],["param",{},1]]]]],NonemptyListOf:["define",{sourceInterval:[340,388]},null,["elem","sep"],["seq",{sourceInterval:[372,388]},["param",{},0],["star",{sourceInterval:[377,388]},["seq",{sourceInterval:[378,386]},["param",{},1],["param",{},0]]]]],EmptyListOf:["define",{sourceInterval:[392,434]},null,["elem","sep"],["seq",{sourceInterval:[438,438]}]],listOf:["define",{sourceInterval:[438,516]},null,["elem","sep"],["alt",{sourceInterval:[462,516]},["app",{sourceInterval:[462,487]},"nonemptyListOf",[["param",{},0],["param",{},1]]],["app",{sourceInterval:[494,516]},"emptyListOf",[["param",{},0],["param",{},1]]]]],nonemptyListOf:["define",{sourceInterval:[520,568]},null,["elem","sep"],["seq",{sourceInterval:[552,568]},["param",{},0],["star",{sourceInterval:[557,568]},["seq",{sourceInterval:[558,566]},["param",{},1],["param",{},0]]]]],emptyListOf:["define",{sourceInterval:[572,614]},null,["elem","sep"],["seq",{sourceInterval:[616,616]}]]}])},{"..":50}],11:[function(require,module,exports){var ohm=require("..");module.exports=ohm.makeRecipe(["grammar",{source:'Ohm {\n\n Grammars\n = Grammar*\n\n Grammar\n = ident SuperGrammar? "{" Rule* "}"\n\n SuperGrammar\n = "<:" ident\n\n Rule\n = ident Formals? ruleDescr? "=" RuleBody -- define\n | ident Formals? ":=" RuleBody -- override\n | ident Formals? "+=" RuleBody -- extend\n\n RuleBody\n = "|"? NonemptyListOf\n\n TopLevelTerm\n = Seq caseName -- inline\n | Seq\n\n Formals\n = "<" ListOf ">"\n\n Params\n = "<" ListOf ">"\n\n Alt\n = NonemptyListOf\n\n Seq\n = Iter*\n\n Iter\n = Pred "*" -- star\n | Pred "+" -- plus\n | Pred "?" -- opt\n | Pred\n\n Pred\n = "~" Lex -- not\n | "&" Lex -- lookahead\n | Lex\n\n Lex\n = "#" Base -- lex\n | Base\n\n Base\n = ident Params? ~(ruleDescr? "=" | ":=" | "+=") -- application\n | terminal ".." terminal -- range\n | terminal -- terminal\n | "(" Alt ")" -- paren\n\n ruleDescr (a rule description)\n = "(" ruleDescrText ")"\n\n ruleDescrText\n = (~")" any)*\n\n caseName\n = "--" (~"\\n" space)* name (~"\\n" space)* ("\\n" | &"}")\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = "_"\n | letter\n\n nameRest\n = "_"\n | alnum\n\n ident (an identifier)\n = name\n\n terminal\n = "\\"" terminalChar* "\\""\n\n terminalChar\n = escapeChar\n | ~"\\\\" ~"\\"" ~"\\n" any\n\n escapeChar (an escape sequence)\n = "\\\\\\\\" -- backslash\n | "\\\\\\"" -- doubleQuote\n | "\\\\\\\'" -- singleQuote\n | "\\\\b" -- backspace\n | "\\\\n" -- lineFeed\n | "\\\\r" -- carriageReturn\n | "\\\\t" -- tab\n | "\\\\u" hexDigit hexDigit hexDigit hexDigit -- unicodeEscape\n | "\\\\x" hexDigit hexDigit -- hexEscape\n\n space\n += comment\n\n comment\n = "//" (~"\\n" any)* "\\n" -- singleLine\n | "/*" (~"*/" any)* "*/" -- multiLine\n\n tokens = token*\n\n token = caseName | comment | ident | operator | punctuation | terminal | any\n\n operator = "<:" | "=" | ":=" | "+=" | "*" | "+" | "?" | "~" | "&"\n\n punctuation = "<" | ">" | "," | "--"\n}'},"Ohm",null,"Grammars",{Grammars:["define",{sourceInterval:[9,32]},null,[],["star",{sourceInterval:[24,32]},["app",{sourceInterval:[24,31]},"Grammar",[]]]],Grammar:["define",{sourceInterval:[36,83]},null,[],["seq",{sourceInterval:[50,83]},["app",{sourceInterval:[50,55]},"ident",[]],["opt",{sourceInterval:[56,69]},["app",{sourceInterval:[56,68]},"SuperGrammar",[]]],["terminal",{sourceInterval:[70,73]},"{"],["star",{sourceInterval:[74,79]},["app",{sourceInterval:[74,78]},"Rule",[]]],["terminal",{sourceInterval:[80,83]},"}"]]],SuperGrammar:["define",{sourceInterval:[87,116]},null,[],["seq",{sourceInterval:[106,116]},["terminal",{sourceInterval:[106,110]},"<:"],["app",{sourceInterval:[111,116]},"ident",[]]]],Rule_define:["define",{sourceInterval:[131,181]},null,[],["seq",{sourceInterval:[131,170]},["app",{sourceInterval:[131,136]},"ident",[]],["opt",{sourceInterval:[137,145]},["app",{sourceInterval:[137,144]},"Formals",[]]],["opt",{sourceInterval:[146,156]},["app",{sourceInterval:[146,155]},"ruleDescr",[]]],["terminal",{sourceInterval:[157,160]},"="],["app",{sourceInterval:[162,170]},"RuleBody",[]]]],Rule_override:["define",{sourceInterval:[188,240]},null,[],["seq",{sourceInterval:[188,227]},["app",{sourceInterval:[188,193]},"ident",[]],["opt",{sourceInterval:[194,202]},["app",{sourceInterval:[194,201]},"Formals",[]]],["terminal",{sourceInterval:[214,218]},":="],["app",{sourceInterval:[219,227]},"RuleBody",[]]]],Rule_extend:["define",{sourceInterval:[247,297]},null,[],["seq",{sourceInterval:[247,286]},["app",{sourceInterval:[247,252]},"ident",[]],["opt",{sourceInterval:[253,261]},["app",{sourceInterval:[253,260]},"Formals",[]]],["terminal",{sourceInterval:[273,277]},"+="],["app",{sourceInterval:[278,286]},"RuleBody",[]]]],Rule:["define",{sourceInterval:[120,297]},null,[],["alt",{sourceInterval:[131,297]},["app",{sourceInterval:[131,170]},"Rule_define",[]],["app",{sourceInterval:[188,227]},"Rule_override",[]],["app",{sourceInterval:[247,286]},"Rule_extend",[]]]],RuleBody:["define",{sourceInterval:[301,354]},null,[],["seq",{sourceInterval:[316,354]},["opt",{sourceInterval:[316,320]},["terminal",{sourceInterval:[316,319]},"|"]],["app",{sourceInterval:[321,354]},"NonemptyListOf",[["app",{sourceInterval:[336,348]},"TopLevelTerm",[]],["terminal",{sourceInterval:[350,353]},"|"]]]]],TopLevelTerm_inline:["define",{sourceInterval:[377,400]},null,[],["seq",{sourceInterval:[377,389]},["app",{sourceInterval:[377,380]},"Seq",[]],["app",{sourceInterval:[381,389]},"caseName",[]]]],TopLevelTerm:["define",{sourceInterval:[358,410]},null,[],["alt",{sourceInterval:[377,410]},["app",{sourceInterval:[377,389]},"TopLevelTerm_inline",[]],["app",{sourceInterval:[407,410]},"Seq",[]]]],Formals:["define",{sourceInterval:[414,454]},null,[],["seq",{sourceInterval:[428,454]},["terminal",{sourceInterval:[428,431]},"<"],["app",{sourceInterval:[432,450]},"ListOf",[["app",{sourceInterval:[439,444]},"ident",[]],["terminal",{sourceInterval:[446,449]},","]]],["terminal",{sourceInterval:[451,454]},">"]]],Params:["define",{sourceInterval:[458,495]},null,[],["seq",{sourceInterval:[471,495]},["terminal",{sourceInterval:[471,474]},"<"],["app",{sourceInterval:[475,491]},"ListOf",[["app",{sourceInterval:[482,485]},"Seq",[]],["terminal",{sourceInterval:[487,490]},","]]],["terminal",{sourceInterval:[492,495]},">"]]],Alt:["define",{sourceInterval:[499,533]},null,[],["app",{sourceInterval:[509,533]},"NonemptyListOf",[["app",{sourceInterval:[524,527]},"Seq",[]],["terminal",{sourceInterval:[529,532]},"|"]]]],Seq:["define",{sourceInterval:[537,552]},null,[],["star",{sourceInterval:[547,552]},["app",{sourceInterval:[547,551]},"Iter",[]]]],Iter_star:["define",{sourceInterval:[567,584]},null,[],["seq",{sourceInterval:[567,575]},["app",{sourceInterval:[567,571]},"Pred",[]],["terminal",{sourceInterval:[572,575]},"*"]]],Iter_plus:["define",{sourceInterval:[591,608]},null,[],["seq",{sourceInterval:[591,599]},["app",{sourceInterval:[591,595]},"Pred",[]],["terminal",{sourceInterval:[596,599]},"+"]]],Iter_opt:["define",{sourceInterval:[615,631]},null,[],["seq",{sourceInterval:[615,623]},["app",{sourceInterval:[615,619]},"Pred",[]],["terminal",{sourceInterval:[620,623]},"?"]]],Iter:["define",{sourceInterval:[556,642]},null,[],["alt",{sourceInterval:[567,642]},["app",{sourceInterval:[567,575]},"Iter_star",[]],["app",{sourceInterval:[591,599]},"Iter_plus",[]],["app",{sourceInterval:[615,623]},"Iter_opt",[]],["app",{sourceInterval:[638,642]},"Pred",[]]]],Pred_not:["define",{sourceInterval:[657,672]},null,[],["seq",{sourceInterval:[657,664]},["terminal",{sourceInterval:[657,660]},"~"],["app",{sourceInterval:[661,664]},"Lex",[]]]],Pred_lookahead:["define",{sourceInterval:[679,700]},null,[],["seq",{sourceInterval:[679,686]},["terminal",{sourceInterval:[679,682]},"&"],["app",{sourceInterval:[683,686]},"Lex",[]]]],Pred:["define",{sourceInterval:[646,710]},null,[],["alt",{sourceInterval:[657,710]},["app",{sourceInterval:[657,664]},"Pred_not",[]],["app",{sourceInterval:[679,686]},"Pred_lookahead",[]],["app",{sourceInterval:[707,710]},"Lex",[]]]],Lex_lex:["define",{sourceInterval:[724,740]},null,[],["seq",{sourceInterval:[724,732]},["terminal",{sourceInterval:[724,727]},"#"],["app",{sourceInterval:[728,732]},"Base",[]]]],Lex:["define",{sourceInterval:[714,751]},null,[],["alt",{sourceInterval:[724,751]},["app",{sourceInterval:[724,732]},"Lex_lex",[]],["app",{sourceInterval:[747,751]},"Base",[]]]],Base_application:["define",{sourceInterval:[766,827]},null,[],["seq",{sourceInterval:[766,811]},["app",{sourceInterval:[766,771]},"ident",[]],["opt",{sourceInterval:[772,779]},["app",{sourceInterval:[772,778]},"Params",[]]],["not",{sourceInterval:[780,811]},["alt",{sourceInterval:[782,810]},["seq",{sourceInterval:[782,796]},["opt",{sourceInterval:[782,792]},["app",{sourceInterval:[782,791]},"ruleDescr",[]]],["terminal",{sourceInterval:[793,796]},"="]],["terminal",{sourceInterval:[799,803]},":="],["terminal",{sourceInterval:[806,810]},"+="]]]]],Base_range:["define",{sourceInterval:[834,889]},null,[],["seq",{sourceInterval:[834,856]},["app",{sourceInterval:[834,842]},"terminal",[]],["terminal",{sourceInterval:[843,847]},".."],["app",{sourceInterval:[848,856]},"terminal",[]]]],Base_terminal:["define",{sourceInterval:[896,954]},null,[],["app",{sourceInterval:[896,904]},"terminal",[]]],Base_paren:["define",{sourceInterval:[961,1016]},null,[],["seq",{sourceInterval:[961,972]},["terminal",{sourceInterval:[961,964]},"("],["app",{sourceInterval:[965,968]},"Alt",[]],["terminal",{sourceInterval:[969,972]},")"]]],Base:["define",{sourceInterval:[755,1016]},null,[],["alt",{sourceInterval:[766,1016]},["app",{sourceInterval:[766,811]},"Base_application",[]],["app",{sourceInterval:[834,856]},"Base_range",[]],["app",{sourceInterval:[896,904]},"Base_terminal",[]],["app",{sourceInterval:[961,972]},"Base_paren",[]]]],ruleDescr:["define",{sourceInterval:[1020,1079]},"a rule description",[],["seq",{sourceInterval:[1058,1079]},["terminal",{sourceInterval:[1058,1061]},"("],["app",{sourceInterval:[1062,1075]},"ruleDescrText",[]],["terminal",{sourceInterval:[1076,1079]},")"]]],ruleDescrText:["define",{sourceInterval:[1083,1114]},null,[],["star",{sourceInterval:[1103,1114]},["seq",{sourceInterval:[1104,1112]},["not",{sourceInterval:[1104,1108]},["terminal",{sourceInterval:[1105,1108]},")"]],["app",{sourceInterval:[1109,1112]},"any",[]]]]],caseName:["define",{sourceInterval:[1118,1186]},null,[],["seq",{sourceInterval:[1133,1186]},["terminal",{sourceInterval:[1133,1137]},"--"],["star",{sourceInterval:[1138,1152]},["seq",{sourceInterval:[1139,1150]},["not",{sourceInterval:[1139,1144]},["terminal",{sourceInterval:[1140,1144]},"\n"]],["app",{sourceInterval:[1145,1150]},"space",[]]]],["app",{sourceInterval:[1153,1157]},"name",[]],["star",{sourceInterval:[1158,1172]},["seq",{sourceInterval:[1159,1170]},["not",{sourceInterval:[1159,1164]},["terminal",{sourceInterval:[1160,1164]},"\n"]],["app",{sourceInterval:[1165,1170]},"space",[]]]],["alt",{sourceInterval:[1174,1185]},["terminal",{sourceInterval:[1174,1178]},"\n"],["lookahead",{sourceInterval:[1181,1185]},["terminal",{sourceInterval:[1182,1185]},"}"]]]]],name:["define",{sourceInterval:[1190,1230]},"a name",[],["seq",{sourceInterval:[1211,1230]},["app",{sourceInterval:[1211,1220]},"nameFirst",[]],["star",{sourceInterval:[1221,1230]},["app",{sourceInterval:[1221,1229]},"nameRest",[]]]]],nameFirst:["define",{sourceInterval:[1234,1266]},null,[],["alt",{sourceInterval:[1250,1266]},["terminal",{sourceInterval:[1250,1253]},"_"],["app",{sourceInterval:[1260,1266]},"letter",[]]]],nameRest:["define",{sourceInterval:[1270,1300]},null,[],["alt",{sourceInterval:[1285,1300]},["terminal",{sourceInterval:[1285,1288]},"_"],["app",{sourceInterval:[1295,1300]},"alnum",[]]]],ident:["define",{sourceInterval:[1304,1337]},"an identifier",[],["app",{sourceInterval:[1333,1337]},"name",[]]],terminal:["define",{sourceInterval:[1341,1379]},null,[],["seq",{sourceInterval:[1356,1379]},["terminal",{sourceInterval:[1356,1360]},'"'],["star",{sourceInterval:[1361,1374]},["app",{sourceInterval:[1361,1373]},"terminalChar",[]]],["terminal",{sourceInterval:[1375,1379]},'"']]],terminalChar:["define",{sourceInterval:[1383,1440]},null,[],["alt",{sourceInterval:[1402,1440]},["app",{sourceInterval:[1402,1412]},"escapeChar",[]],["seq",{sourceInterval:[1419,1440]},["not",{sourceInterval:[1419,1424]},["terminal",{sourceInterval:[1420,1424]},"\\"]],["not",{sourceInterval:[1425,1430]},["terminal",{sourceInterval:[1426,1430]},'"']],["not",{sourceInterval:[1431,1436]},["terminal",{sourceInterval:[1432,1436]},"\n"]],["app",{sourceInterval:[1437,1440]},"any",[]]]]],escapeChar_backslash:["define",{sourceInterval:[1483,1538]},null,[],["terminal",{sourceInterval:[1483,1489]},"\\\\"]],escapeChar_doubleQuote:["define",{sourceInterval:[1545,1602]},null,[],["terminal",{sourceInterval:[1545,1551]},'\\"']],escapeChar_singleQuote:["define",{sourceInterval:[1609,1666]},null,[],["terminal",{sourceInterval:[1609,1615]},"\\'"]],escapeChar_backspace:["define",{sourceInterval:[1673,1728]},null,[],["terminal",{sourceInterval:[1673,1678]},"\\b"]],escapeChar_lineFeed:["define",{sourceInterval:[1735,1789]},null,[],["terminal",{sourceInterval:[1735,1740]},"\\n"]],escapeChar_carriageReturn:["define",{sourceInterval:[1796,1856]},null,[],["terminal",{sourceInterval:[1796,1801]},"\\r"]],escapeChar_tab:["define",{sourceInterval:[1863,1912]},null,[],["terminal",{sourceInterval:[1863,1868]},"\\t"]],escapeChar_unicodeEscape:["define",{sourceInterval:[1919,1978]},null,[],["seq",{sourceInterval:[1919,1960]},["terminal",{sourceInterval:[1919,1924]},"\\u"],["app",{sourceInterval:[1925,1933]},"hexDigit",[]],["app",{sourceInterval:[1934,1942]},"hexDigit",[]],["app",{sourceInterval:[1943,1951]},"hexDigit",[]],["app",{sourceInterval:[1952,1960]},"hexDigit",[]]]],escapeChar_hexEscape:["define",{sourceInterval:[1985,2040]},null,[],["seq",{sourceInterval:[1985,2008]},["terminal",{sourceInterval:[1985,1990]},"\\x"],["app",{sourceInterval:[1991,1999]},"hexDigit",[]],["app",{sourceInterval:[2e3,2008]},"hexDigit",[]]]],escapeChar:["define",{sourceInterval:[1444,2040]},"an escape sequence",[],["alt",{sourceInterval:[1483,2040]},["app",{sourceInterval:[1483,1489]},"escapeChar_backslash",[]],["app",{sourceInterval:[1545,1551]},"escapeChar_doubleQuote",[]],["app",{sourceInterval:[1609,1615]},"escapeChar_singleQuote",[]],["app",{sourceInterval:[1673,1678]},"escapeChar_backspace",[]],["app",{sourceInterval:[1735,1740]},"escapeChar_lineFeed",[]],["app",{sourceInterval:[1796,1801]},"escapeChar_carriageReturn",[]],["app",{sourceInterval:[1863,1868]},"escapeChar_tab",[]],["app",{sourceInterval:[1919,1960]},"escapeChar_unicodeEscape",[]],["app",{sourceInterval:[1985,2008]},"escapeChar_hexEscape",[]]]],space:["extend",{sourceInterval:[2044,2063]},null,[],["app",{sourceInterval:[2056,2063]},"comment",[]]],comment_singleLine:["define",{sourceInterval:[2081,2118]},null,[],["seq",{sourceInterval:[2081,2103]},["terminal",{sourceInterval:[2081,2085]},"//"],["star",{sourceInterval:[2086,2098]},["seq",{sourceInterval:[2087,2096]},["not",{sourceInterval:[2087,2092]},["terminal",{sourceInterval:[2088,2092]},"\n"]],["app",{sourceInterval:[2093,2096]},"any",[]]]],["terminal",{sourceInterval:[2099,2103]},"\n"]]],comment_multiLine:["define",{sourceInterval:[2125,2161]},null,[],["seq",{sourceInterval:[2125,2147]},["terminal",{sourceInterval:[2125,2129]},"/*"],["star",{sourceInterval:[2130,2142]},["seq",{sourceInterval:[2131,2140]},["not",{sourceInterval:[2131,2136]},["terminal",{sourceInterval:[2132,2136]},"*/"]],["app",{sourceInterval:[2137,2140]},"any",[]]]],["terminal",{sourceInterval:[2143,2147]},"*/"]]],comment:["define",{sourceInterval:[2067,2161]},null,[],["alt",{sourceInterval:[2081,2161]},["app",{sourceInterval:[2081,2103]},"comment_singleLine",[]],["app",{sourceInterval:[2125,2147]},"comment_multiLine",[]]]],tokens:["define",{sourceInterval:[2165,2180]},null,[],["star",{sourceInterval:[2174,2180]},["app",{sourceInterval:[2174,2179]},"token",[]]]],token:["define",{sourceInterval:[2184,2260]},null,[],["alt",{sourceInterval:[2192,2260]},["app",{sourceInterval:[2192,2200]},"caseName",[]],["app",{sourceInterval:[2203,2210]},"comment",[]],["app",{sourceInterval:[2213,2218]},"ident",[]],["app",{sourceInterval:[2221,2229]},"operator",[]],["app",{sourceInterval:[2232,2243]},"punctuation",[]],["app",{sourceInterval:[2246,2254]},"terminal",[]],["app",{sourceInterval:[2257,2260]},"any",[]]]],operator:["define",{sourceInterval:[2264,2329]},null,[],["alt",{sourceInterval:[2275,2329]},["terminal",{sourceInterval:[2275,2279]},"<:"],["terminal",{sourceInterval:[2282,2285]},"="],["terminal",{sourceInterval:[2288,2292]},":="],["terminal",{sourceInterval:[2295,2299]},"+="],["terminal",{sourceInterval:[2302,2305]},"*"],["terminal",{sourceInterval:[2308,2311]},"+"],["terminal",{sourceInterval:[2314,2317]},"?"],["terminal",{sourceInterval:[2320,2323]},"~"],["terminal",{sourceInterval:[2326,2329]},"&"]]],punctuation:["define",{sourceInterval:[2333,2369]},null,[],["alt",{sourceInterval:[2347,2369]},["terminal",{sourceInterval:[2347,2350]},"<"],["terminal",{sourceInterval:[2353,2356]},">"],["terminal",{sourceInterval:[2359,2362]},","],["terminal",{sourceInterval:[2365,2369]},"--"]]]}])},{"..":50}],12:[function(require,module,exports){var ohm=require("..");module.exports=ohm.makeRecipe(["grammar",{source:'OperationsAndAttributes {\n\n AttributeSignature =\n name\n\n OperationSignature =\n name Formals?\n\n Formals\n = "(" ListOf ")"\n\n name (a name)\n = nameFirst nameRest*\n\n nameFirst\n = "_"\n | letter\n\n nameRest\n = "_"\n | alnum\n\n}'},"OperationsAndAttributes",null,"AttributeSignature",{AttributeSignature:["define",{sourceInterval:[29,58]},null,[],["app",{sourceInterval:[54,58]},"name",[]]],OperationSignature:["define",{sourceInterval:[62,100]},null,[],["seq",{sourceInterval:[87,100]},["app",{sourceInterval:[87,91]},"name",[]],["opt",{sourceInterval:[92,100]},["app",{sourceInterval:[92,99]},"Formals",[]]]]],Formals:["define",{sourceInterval:[104,143]},null,[],["seq",{sourceInterval:[118,143]},["terminal",{sourceInterval:[118,121]},"("],["app",{sourceInterval:[122,139]},"ListOf",[["app",{sourceInterval:[129,133]},"name",[]],["terminal",{sourceInterval:[135,138]},","]]],["terminal",{sourceInterval:[140,143]},")"]]],name:["define",{sourceInterval:[147,187]},"a name",[],["seq",{sourceInterval:[168,187]},["app",{sourceInterval:[168,177]},"nameFirst",[]],["star",{sourceInterval:[178,187]},["app",{sourceInterval:[178,186]},"nameRest",[]]]]],nameFirst:["define",{sourceInterval:[191,223]},null,[],["alt",{sourceInterval:[207,223]},["terminal",{sourceInterval:[207,210]},"_"],["app",{sourceInterval:[217,223]},"letter",[]]]],nameRest:["define",{sourceInterval:[227,257]},null,[],["alt",{sourceInterval:[242,257]},["terminal",{sourceInterval:[242,245]},"_"],["app",{sourceInterval:[252,257]},"alnum",[]]]]}])},{"..":50}],13:[function(require,module,exports){"use strict";module.exports={toAST:require("./semantics-toAST").helper,semanticsForToAST:require("./semantics-toAST").semantics}},{"./semantics-toAST":14}],14:[function(require,module,exports){"use strict";var pexprs=require("../src/pexprs");var MatchResult=require("../src/MatchResult");var Grammar=require("../src/Grammar");var extend=require("util-extend");var defaultOperation={_terminal:function(){return this.primitiveValue},_nonterminal:function(children){var ctorName=this._node.ctorName;var mapping=this.args.mapping;if(!mapping.hasOwnProperty(ctorName)){if(this._node instanceof pexprs.Alt||this._node instanceof pexprs.Apply){return children[0].toAST(mapping)}if(this.isLexical()){return this.interval.contents}var realChildren=children.filter(function(child){return!child.isTerminal()});if(realChildren.length===1){return realChildren[0].toAST(mapping)}}if(typeof mapping[ctorName]==="number"){return children[mapping[ctorName]].toAST(mapping)}var propMap=mapping[ctorName]||children;var node={type:ctorName};for(var prop in propMap){var mappedProp=mapping[ctorName]&&mapping[ctorName][prop];if(typeof mappedProp==="number"){node[prop]=children[mappedProp].toAST(mapping)}else if(typeof mappedProp==="string"||typeof mappedProp==="boolean"||mappedProp===null){node[prop]=mappedProp}else if(typeof mappedProp==="object"&&mappedProp instanceof Number){node[prop]=Number(mappedProp)}else if(typeof mappedProp==="function"){node[prop]=mappedProp.call(this,children)}else if(mappedProp===undefined){if(children[prop]&&!children[prop].isTerminal()){node[prop]=children[prop].toAST(mapping)}else{delete node[prop]}}}return node},_iter:function(children){if(this._node.isOptional()){if(this.numChildren===0){return null}else{return children[0].toAST(this.args.mapping)}}return children.map(function(child){return child.toAST(this.args.mapping)},this)},NonemptyListOf:function(first,sep,rest){return[first.toAST(this.args.mapping)].concat(rest.toAST(this.args.mapping))},EmptyListOf:function(){return[]}};function toAST(res,mapping){if(!(res instanceof MatchResult)||res.failed()){ +throw new Error("toAST() expects a succesfull MatchResult as first parameter")}mapping=extend({},mapping);var operation=extend({},defaultOperation);for(var termName in mapping){if(typeof mapping[termName]==="function"){operation[termName]=mapping[termName];delete mapping[termName]}}var g=res._cst.grammar;var s=g.semantics().addOperation("toAST(mapping)",operation);return s(res).toAST(mapping)}function semanticsForToAST(g){if(!(g instanceof Grammar)){throw new Error("semanticsToAST() expects a Grammar as parameter")}return g.semantics().addOperation("toAST(mapping)",defaultOperation)}module.exports={helper:toAST,semantics:semanticsForToAST}},{"../src/Grammar":38,"../src/MatchResult":42,"../src/pexprs":67,"util-extend":35}],15:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Symbol:require("./polyfill")},{"./is-implemented":16,"./polyfill":31}],16:[function(require,module,exports){"use strict";module.exports=function(){var symbol;if(typeof Symbol!=="function")return false;symbol=Symbol("test symbol");try{String(symbol)}catch(e){return false}if(typeof Symbol.iterator==="symbol")return true;if(typeof Symbol.isConcatSpreadable!=="object")return false;if(typeof Symbol.iterator!=="object")return false;if(typeof Symbol.toPrimitive!=="object")return false;if(typeof Symbol.toStringTag!=="object")return false;if(typeof Symbol.unscopables!=="object")return false;return true}},{}],17:[function(require,module,exports){"use strict";module.exports=function(x){return x&&(typeof x==="symbol"||x["@@toStringTag"]==="Symbol")||false}},{}],18:[function(require,module,exports){"use strict";var assign=require("es5-ext/object/assign"),normalizeOpts=require("es5-ext/object/normalize-options"),isCallable=require("es5-ext/object/is-callable"),contains=require("es5-ext/string/#/contains"),d;d=module.exports=function(dscr,value){var c,e,w,options,desc;if(arguments.length<2||typeof dscr!=="string"){options=value;value=dscr;dscr=null}else{options=arguments[2]}if(dscr==null){c=w=true;e=false}else{c=contains.call(dscr,"c");e=contains.call(dscr,"e");w=contains.call(dscr,"w")}desc={value:value,configurable:c,enumerable:e,writable:w};return!options?desc:assign(normalizeOpts(options),desc)};d.gs=function(dscr,get,set){var c,e,options,desc;if(typeof dscr!=="string"){options=set;set=get;get=dscr;dscr=null}else{options=arguments[3]}if(get==null){get=undefined}else if(!isCallable(get)){options=get;get=set=undefined}else if(set==null){set=undefined}else if(!isCallable(set)){options=set;set=undefined}if(dscr==null){c=true;e=false}else{c=contains.call(dscr,"c");e=contains.call(dscr,"e")}desc={get:get,set:set,configurable:c,enumerable:e};return!options?desc:assign(normalizeOpts(options),desc)}},{"es5-ext/object/assign":19,"es5-ext/object/is-callable":22,"es5-ext/object/normalize-options":26,"es5-ext/string/#/contains":28}],19:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Object.assign:require("./shim")},{"./is-implemented":20,"./shim":21}],20:[function(require,module,exports){"use strict";module.exports=function(){var assign=Object.assign,obj;if(typeof assign!=="function")return false;obj={foo:"raz"};assign(obj,{bar:"dwa"},{trzy:"trzy"});return obj.foo+obj.bar+obj.trzy==="razdwatrzy"}},{}],21:[function(require,module,exports){"use strict";var keys=require("../keys"),value=require("../valid-value"),max=Math.max;module.exports=function(dest,src){var error,i,l=max(arguments.length,2),assign;dest=Object(value(dest));assign=function(key){try{dest[key]=src[key]}catch(e){if(!error)error=e}};for(i=1;i-1}},{}],31:[function(require,module,exports){"use strict";var d=require("d"),validateSymbol=require("./validate-symbol"),create=Object.create,defineProperties=Object.defineProperties,defineProperty=Object.defineProperty,objPrototype=Object.prototype,Symbol,HiddenSymbol,globalSymbols=create(null);var generateName=function(){var created=create(null);return function(desc){var postfix=0,name;while(created[desc+(postfix||"")])++postfix;desc+=postfix||"";created[desc]=true;name="@@"+desc;defineProperty(objPrototype,name,d.gs(null,function(value){defineProperty(this,name,d(value))}));return name}}();HiddenSymbol=function Symbol(description){if(this instanceof HiddenSymbol)throw new TypeError("TypeError: Symbol is not a constructor");return Symbol(description)};module.exports=Symbol=function Symbol(description){var symbol;if(this instanceof Symbol)throw new TypeError("TypeError: Symbol is not a constructor");symbol=create(HiddenSymbol.prototype);description=description===undefined?"":String(description);return defineProperties(symbol,{__description__:d("",description),__name__:d("",generateName(description))})};defineProperties(Symbol,{"for":d(function(key){if(globalSymbols[key])return globalSymbols[key];return globalSymbols[key]=Symbol(String(key))}),keyFor:d(function(s){var key;validateSymbol(s);for(key in globalSymbols)if(globalSymbols[key]===s)return key}),hasInstance:d("",Symbol("hasInstance")),isConcatSpreadable:d("",Symbol("isConcatSpreadable")),iterator:d("",Symbol("iterator")),match:d("",Symbol("match")),replace:d("",Symbol("replace")),search:d("",Symbol("search")),species:d("",Symbol("species")),split:d("",Symbol("split")),toPrimitive:d("",Symbol("toPrimitive")),toStringTag:d("",Symbol("toStringTag")),unscopables:d("",Symbol("unscopables"))});defineProperties(HiddenSymbol.prototype,{constructor:d(Symbol),toString:d("",function(){return this.__name__})});defineProperties(Symbol.prototype,{toString:d(function(){return"Symbol ("+validateSymbol(this).__description__+")"}),valueOf:d(function(){return validateSymbol(this)})});defineProperty(Symbol.prototype,Symbol.toPrimitive,d("",function(){return validateSymbol(this)}));defineProperty(Symbol.prototype,Symbol.toStringTag,d("c","Symbol"));defineProperty(HiddenSymbol.prototype,Symbol.toPrimitive,d("c",Symbol.prototype[Symbol.toPrimitive]));defineProperty(HiddenSymbol.prototype,Symbol.toStringTag,d("c",Symbol.prototype[Symbol.toStringTag]))},{"./validate-symbol":32,d:18}],32:[function(require,module,exports){"use strict";var isSymbol=require("./is-symbol");module.exports=function(value){if(!isSymbol(value))throw new TypeError(value+" is not a symbol");return value}},{"./is-symbol":17}],33:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],34:[function(require,module,exports){module.exports=function(obj){return!!(obj!=null&&obj.constructor&&typeof obj.constructor.isBuffer==="function"&&obj.constructor.isBuffer(obj))}},{}],35:[function(require,module,exports){module.exports=extend;function extend(origin,add){if(!add||typeof add!=="object")return origin;var keys=Object.keys(add);var i=keys.length;while(i--){origin[keys[i]]=add[keys[i]]}return origin}},{}],36:[function(require,module,exports){"use strict";var GrammarDecl=require("./GrammarDecl");var Interval=require("./Interval");var pexprs=require("./pexprs");function Builder(){}Builder.prototype={currentDecl:null,newGrammar:function(name){return new GrammarDecl(name)},grammar:function(metaInfo,name,superGrammar,defaultStartRule,rules){var gDecl=new GrammarDecl(name);if(superGrammar){gDecl.withSuperGrammar(this.fromRecipe(superGrammar))}if(defaultStartRule){gDecl.withDefaultStartRule(defaultStartRule)}if(metaInfo&&metaInfo.source){gDecl.withSource(metaInfo.source)}var self=this;this.currentDecl=gDecl;Object.keys(rules).forEach(function(ruleName){var ruleRecipe=rules[ruleName];var action=ruleRecipe[0];var metaInfo=ruleRecipe[1];var optDescription=ruleRecipe[2];var formals=ruleRecipe[3];var body=self.fromRecipe(ruleRecipe[4]);if(gDecl.interval&&metaInfo&&metaInfo.sourceInterval){body.definitionInterval=new Interval(gDecl.interval.inputStream,metaInfo.sourceInterval[0],metaInfo.sourceInterval[1])}gDecl[action](ruleName,formals,body,optDescription)});this.currentDecl=null;return gDecl.build()},terminal:function(x){return new pexprs.Terminal(x)},range:function(from,to){return new pexprs.Range(from,to)},param:function(index){return new pexprs.Param(index)},alt:function(){var terms=[];for(var idx=0;idx0){optParams=optParams.map(function(param){return param instanceof pexprs.PExpr?param:this.fromRecipe(param)},this)}return new pexprs.Apply(ruleName,optParams)},fromRecipe:function(recipe){var result=this[recipe[0]].apply(this,recipe[0]==="grammar"?recipe.slice(1):recipe.slice(2));var metaInfo=recipe[1];if(metaInfo){if(metaInfo.sourceInterval&&this.currentDecl){result.withInterval(this.currentDecl.sourceInterval.apply(this.currentDecl,metaInfo.sourceInterval))}}return result}};module.exports=Builder},{"./GrammarDecl":39,"./Interval":41,"./pexprs":67}],37:[function(require,module,exports){"use strict";function isValidType(type){return type==="description"||type==="string"||type==="code"}function Failure(pexpr,text,type){if(!isValidType(type)){throw new Error("invalid Failure type: "+type)}this.pexpr=pexpr;this.text=text;this.type=type;this.fluffy=false}Failure.prototype.getPExpr=function(){return this.pexpr};Failure.prototype.getText=function(){return this.text};Failure.prototype.getType=function(){return this.type};Failure.prototype.isDescription=function(){return this.type==="description"};Failure.prototype.isStringTerminal=function(){return this.type==="string"};Failure.prototype.isCode=function(){return this.type==="code"};Failure.prototype.isFluffy=function(){return this.fluffy};Failure.prototype.makeFluffy=function(){this.fluffy=true};Failure.prototype.clearFluffy=function(){this.fluffy=false};Failure.prototype.subsumes=function(that){return this.getText()===that.getText()&&this.type===that.type&&(!this.isFluffy()||this.isFluffy()&&that.isFluffy())};Failure.prototype.toString=function(){return this.type==="string"?JSON.stringify(this.getText()):this.getText()};Failure.prototype.clone=function(){var failure=new Failure(this.pexpr,this.text,this.type);if(this.isFluffy()){failure.makeFluffy()}return failure};Failure.prototype.toKey=function(){return this.toString()+"#"+this.type};module.exports=Failure},{}],38:[function(require,module,exports){"use strict";var MatchResult=require("./MatchResult");var Semantics=require("./Semantics");var State=require("./State");var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");function Grammar(name,superGrammar,ruleBodies,ruleFormals,ruleDescriptions,optDefaultStartRule){this.name=name;this.superGrammar=superGrammar;this.ruleBodies=ruleBodies;this.ruleFormals=ruleFormals;this.ruleDescriptions=ruleDescriptions;if(optDefaultStartRule){if(!(optDefaultStartRule in ruleBodies)){throw new Error("Invalid start rule: '"+optDefaultStartRule+"' is not a rule in grammar '"+name+"'")}this.defaultStartRule=optDefaultStartRule}}var ohmGrammar;var buildGrammar;Grammar.initApplicationParser=function(grammar,builderFn){ohmGrammar=grammar;buildGrammar=builderFn};Grammar.prototype={isBuiltIn:function(){return this===Grammar.ProtoBuiltInRules||this===Grammar.BuiltInRules},_match:function(input,opts){var state=new State(this,input,opts);state.evalFromStart();return state},match:function(input,optStartApplication){var state=this._match(input,{startApplication:optStartApplication});return MatchResult.newFor(state)},trace:function(input,optStartApplication){var state=this._match(input,{startApplication:optStartApplication,trace:true});var rootTrace=state.trace[state.trace.length-1];rootTrace.state=state;rootTrace.result=MatchResult.newFor(state);return rootTrace},semantics:function(){return Semantics.createSemantics(this)},extendSemantics:function(superSemantics){return Semantics.createSemantics(this,superSemantics._getSemantics())},_checkTopDownActionDict:function(what,name,actionDict){function isSpecialAction(a){return a==="_iter"||a==="_terminal"||a==="_nonterminal"||a==="_default"}var problems=[];for(var k in actionDict){var v=actionDict[k];if(!isSpecialAction(k)&&!(k in this.ruleBodies)){problems.push("'"+k+"' is not a valid semantic action for '"+this.name+"'")}else if(typeof v!=="function"){problems.push("'"+k+"' must be a function in an action dictionary for '"+this.name+"'")}else{var actual=v.length;var expected=this._topDownActionArity(k);if(actual!==expected){problems.push("Semantic action '"+k+"' has the wrong arity: "+"expected "+expected+", got "+actual)}}}if(problems.length>0){var prettyProblems=problems.map(function(problem){return"- "+problem});var error=new Error("Found errors in the action dictionary of the '"+name+"' "+what+":\n"+prettyProblems.join("\n"));error.problems=problems;throw error}},_topDownActionArity:function(actionName){if(actionName==="_iter"||actionName==="_nonterminal"||actionName==="_default"){return 1}else if(actionName==="_terminal"){return 0}return this.ruleBodies[actionName].getArity()},_inheritsFrom:function(grammar){var g=this.superGrammar;while(g){if(g===grammar){return true}g=g.superGrammar}return false},toRecipe:function(optVarName){var metaInfo={};if(this.definitionInterval){metaInfo.source=this.definitionInterval.contents}var superGrammar=null;if(this.superGrammar&&!this.superGrammar.isBuiltIn()){superGrammar=JSON.parse(this.superGrammar.toRecipe())}var startRule=null;if(this.defaultStartRule){startRule=this.defaultStartRule}var rules={};var self=this;Object.keys(this.ruleBodies).forEach(function(ruleName){var body=self.ruleBodies[ruleName];var isDefinition=!self.superGrammar||!self.superGrammar.ruleBodies[ruleName];var operation;if(isDefinition){operation="define"}else{operation=body instanceof pexprs.Extend?"extend":"override"}var metaInfo={};if(body.definitionInterval&&self.definitionInterval){var adjusted=body.definitionInterval.relativeTo(self.definitionInterval);metaInfo.sourceInterval=[adjusted.startIdx,adjusted.endIdx]}var description=null;if(isDefinition&&self.ruleDescriptions[ruleName]){description=self.ruleDescriptions[ruleName]}var formals=self.ruleFormals[ruleName];var ruleBody=body.outputRecipe(formals,self.definitionInterval);rules[ruleName]=[operation,metaInfo,description,formals,ruleBody]});return JSON.stringify(["grammar",metaInfo,this.name,superGrammar,startRule,rules])},toOperationActionDictionaryTemplate:function(){return this._toOperationOrAttributeActionDictionaryTemplate()},toAttributeActionDictionaryTemplate:function(){return this._toOperationOrAttributeActionDictionaryTemplate()},_toOperationOrAttributeActionDictionaryTemplate:function(){var sb=new common.StringBuffer;sb.append("{");var first=true;for(var ruleName in this.ruleBodies){var body=this.ruleBodies[ruleName];if(first){first=false}else{sb.append(",")}sb.append("\n");sb.append(" ");this.addSemanticActionTemplate(ruleName,body,sb)}sb.append("\n}");return sb.contents()},addSemanticActionTemplate:function(ruleName,body,sb){sb.append(ruleName);sb.append(": function(");var arity=this._topDownActionArity(ruleName);sb.append(common.repeat("_",arity).join(", "));sb.append(") {\n");sb.append(" }")},parseApplication:function(str){var app;if(str.indexOf("<")===-1){app=new pexprs.Apply(str)}else{var cst=ohmGrammar.match(str,"Base_application");app=buildGrammar(cst,{})}if(!(app.ruleName in this.ruleBodies)){throw errors.undeclaredRule(app.ruleName,this.name)}else if(this.ruleFormals[app.ruleName].length!==app.args.length){throw errors.wrongNumberOfParameters(app.ruleName,this.ruleFormals[app.ruleName].length,app.args.length)}return app}};Grammar.ProtoBuiltInRules=new Grammar("ProtoBuiltInRules",undefined,{any:pexprs.any,end:pexprs.end,spaces:new pexprs.Star(new pexprs.Apply("space")),space:new pexprs.Range("\x00"," "),lower:new pexprs.UnicodeChar("Ll"),upper:new pexprs.UnicodeChar("Lu"),unicodeLtmo:new pexprs.UnicodeChar("Ltmo")},{any:[],end:[],spaces:[],space:[],lower:[],upper:[],unicodeLtmo:[]},{any:"any object",end:"end of input",space:"a space",lower:"a lowercase letter",upper:"an uppercase letter"});module.exports=Grammar},{"./MatchResult":42,"./Semantics":45,"./State":46,"./common":48,"./errors":49,"./pexprs":67}],39:[function(require,module,exports){"use strict";var Grammar=require("./Grammar");var InputStream=require("./InputStream");var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");function GrammarDecl(name){this.name=name}GrammarDecl.prototype.sourceInterval=function(startIdx,endIdx){var inputStream=this.interval.inputStream;return inputStream.interval(startIdx,endIdx)};GrammarDecl.prototype.ensureSuperGrammar=function(){if(!this.superGrammar){this.withSuperGrammar(this.name==="BuiltInRules"?Grammar.ProtoBuiltInRules:Grammar.BuiltInRules)}return this.superGrammar};GrammarDecl.prototype.installOverriddenOrExtendedRule=function(name,formals,body){var duplicateParameterNames=common.getDuplicates(formals);if(duplicateParameterNames.length>0){throw errors.duplicateParameterNames(name,duplicateParameterNames,body)}var expectedFormals=this.ensureSuperGrammar().ruleFormals[name];var expectedNumFormals=expectedFormals?expectedFormals.length:0;if(formals.length!==expectedNumFormals){throw errors.wrongNumberOfParameters(name,expectedNumFormals,formals.length,body)}return this.install(name,formals,body)};GrammarDecl.prototype.install=function(name,formals,body,optDescription){body=body.introduceParams(formals);this.ruleFormals[name]=formals;if(optDescription){this.ruleDescriptions[name]=optDescription}this.ruleBodies[name]=body;return this};GrammarDecl.prototype.withSuperGrammar=function(superGrammar){if(this.superGrammar){throw new Error("the super grammar of a GrammarDecl cannot be set more than once")}this.superGrammar=superGrammar;this.ruleBodies=Object.create(superGrammar.ruleBodies);this.ruleFormals=Object.create(superGrammar.ruleFormals);this.ruleDescriptions=Object.create(superGrammar.ruleDescriptions);if(!superGrammar.isBuiltIn()){this.defaultStartRule=superGrammar.defaultStartRule}return this};GrammarDecl.prototype.withDefaultStartRule=function(ruleName){this.defaultStartRule=ruleName;return this};GrammarDecl.prototype.withSource=function(source){this.interval=new InputStream(source).interval(0,source.length);return this};GrammarDecl.prototype.build=function(){var grammar=new Grammar(this.name,this.ensureSuperGrammar(),this.ruleBodies,this.ruleFormals,this.ruleDescriptions,this.defaultStartRule);var grammarErrors=[];var grammarHasInvalidApplications=false;Object.keys(grammar.ruleBodies).forEach(function(ruleName){var body=grammar.ruleBodies[ruleName];try{body.assertChoicesHaveUniformArity(ruleName)}catch(e){grammarErrors.push(e)}try{body.assertAllApplicationsAreValid(ruleName,grammar)}catch(e){grammarErrors.push(e);grammarHasInvalidApplications=true}});if(!grammarHasInvalidApplications){Object.keys(grammar.ruleBodies).forEach(function(ruleName){var body=grammar.ruleBodies[ruleName];try{body.assertIteratedExprsAreNotNullable(grammar,ruleName)}catch(e){grammarErrors.push(e)}})}if(grammarErrors.length>0){errors.throwErrors(grammarErrors)}if(this.interval){grammar.definitionInterval=this.interval}return grammar};GrammarDecl.prototype.define=function(name,formals,body,optDescr){this.ensureSuperGrammar();if(this.superGrammar.ruleBodies[name]){throw errors.duplicateRuleDeclaration(name,this.name,this.superGrammar.name,body)}else if(this.ruleBodies[name]){throw errors.duplicateRuleDeclaration(name,this.name,this.name,body)}var duplicateParameterNames=common.getDuplicates(formals);if(duplicateParameterNames.length>0){throw errors.duplicateParameterNames(name,duplicateParameterNames,body)}return this.install(name,formals,body,optDescr)};GrammarDecl.prototype.override=function(name,formals,body){var baseRule=this.ensureSuperGrammar().ruleBodies[name];if(!baseRule){throw errors.cannotOverrideUndeclaredRule(name,this.superGrammar.name,body)}this.installOverriddenOrExtendedRule(name,formals,body);return this};GrammarDecl.prototype.extend=function(name,formals,fragment){var baseRule=this.ensureSuperGrammar().ruleBodies[name];if(!baseRule){throw errors.cannotExtendUndeclaredRule(name,this.superGrammar.name,fragment)}var body=new pexprs.Extend(this.superGrammar,name,fragment);body.interval=fragment.interval;body.definitionInterval=fragment.definitionInterval;this.installOverriddenOrExtendedRule(name,formals,body);return this};module.exports=GrammarDecl},{"./Grammar":38,"./InputStream":40,"./common":48,"./errors":49,"./pexprs":67}],40:[function(require,module,exports){"use strict";var Interval=require("./Interval");function InputStream(source){this.source=source;this.pos=0;this.posInfos=[]}InputStream.prototype={atEnd:function(){return this.pos===this.source.length},next:function(){return this.source[this.pos++]},matchString:function(s){for(var idx=0;idx=that.startIdx&&this.endIdx<=that.endIdx,"other interval does not cover this one");return new Interval(newInputStream,this.startIdx-that.startIdx,this.endIdx-that.startIdx)},trimmed:function(){var contents=this.contents;var startIdx=this.startIdx+contents.match(/^\s*/)[0].length;var endIdx=this.endIdx-contents.match(/\s*$/)[0].length;return new Interval(this.inputStream,startIdx,endIdx)}};Object.defineProperties(Interval.prototype,{contents:{get:function(){if(this._contents===undefined){this._contents=this.inputStream.sourceSlice(this.startIdx,this.endIdx)}return this._contents},enumerable:true},length:{get:function(){return this.endIdx-this.startIdx},enumerable:true}});module.exports=Interval},{"./common":48,"./errors":49,"./util":68}],42:[function(require,module,exports){"use strict";var inherits=require("inherits");var common=require("./common");var nodes=require("./nodes");var util=require("./util");var Interval=require("./Interval");function getShortMatchErrorMessage(pos,source,detail){var errorInfo=util.getLineAndColumn(source,pos);return"Line "+errorInfo.lineNum+", col "+errorInfo.colNum+": "+detail}function MatchResult(state){this.state=state;this._cst=state.bindings[0]}MatchResult.newFor=function(state){var succeeded=state.bindings.length>0;return succeeded?new MatchResult(state):new MatchFailure(state)};MatchResult.prototype.failed=function(){return false};MatchResult.prototype.succeeded=function(){return!this.failed()};MatchResult.prototype.getDiscardedSpaces=function(){if(this.failed()){return[]}var state=this.state;var grammar=state.grammar;var inputStream=state.inputStream;var intervals=[new Interval(inputStream,0,inputStream.source.length)];var s=grammar.semantics().addOperation("subtractTerminals",{_nonterminal:function(children){children.forEach(function(child){child.subtractTerminals()})},_terminal:function(){var t=this;intervals=intervals.map(function(interval){return interval.minus(t.interval)}).reduce(function(xs,ys){return xs.concat(ys)},[])}});s(this).subtractTerminals();s.addOperation("fixIntervals(idxOffset)",{_default:function(children){var idxOffset=this.args.idxOffset;this.interval.inputStream=inputStream;this.interval.startIdx+=idxOffset;this.interval.endIdx+=idxOffset;if(!this.isTerminal()){children.forEach(function(child){child.fixIntervals(idxOffset)})}}});var discardedNodes=intervals.map(function(interval){var r=grammar.match(interval.contents,"spaces");s(r).fixIntervals(interval.startIdx);return r._cst});discardedNodes=new nodes.IterationNode(grammar,discardedNodes,discardedNodes.length===0?new Interval(inputStream,0,0):new Interval(inputStream,discardedNodes[0].interval.startIdx,discardedNodes[discardedNodes.length-1].interval.endIdx));var r=Object.create(this);r._cst=discardedNodes;r.getDiscardedSpaces=function(){return r};return r};function MatchFailure(state){this.state=state;common.defineLazyProperty(this,"_failures",function(){return this.state.getFailures()});common.defineLazyProperty(this,"message",function(){var source=this.state.inputStream.source;if(typeof source!=="string"){return"match failed at position "+this.getRightmostFailurePosition()}var detail="Expected "+this.getExpectedText();return util.getLineAndColumnMessage(source,this.getRightmostFailurePosition())+detail});common.defineLazyProperty(this,"shortMessage",function(){if(typeof this.state.inputStream.source!=="string"){return"match failed at position "+this.getRightmostFailurePosition()}var detail="expected "+this.getExpectedText();return getShortMatchErrorMessage(this.getRightmostFailurePosition(),this.state.inputStream.source,detail)})}inherits(MatchFailure,MatchResult);MatchFailure.prototype.toString=function(){return"[MatchFailure at position "+this.getRightmostFailurePosition()+"]"};MatchFailure.prototype.failed=function(){return true};MatchFailure.prototype.getRightmostFailurePosition=function(){return this.state.getRightmostFailurePosition()};MatchFailure.prototype.getRightmostFailures=function(){return this._failures};MatchFailure.prototype.getExpectedText=function(){var sb=new common.StringBuffer;var failures=this.getRightmostFailures();failures=failures.filter(function(failure){return!failure.isFluffy()});for(var idx=0;idx0){if(idx===failures.length-1){sb.append(failures.length>2?", or ":" or ")}else{sb.append(", ")}}sb.append(failures[idx].toString())}return sb.contents()};MatchFailure.prototype.getInterval=function(){var pos=this.state.getRightmostFailurePosition();return new Interval(this.state.inputStream,pos,pos)};module.exports=MatchResult},{"./Interval":41,"./common":48,"./nodes":51,"./util":68,inherits:33}],43:[function(require,module,exports){"use strict";var extend=require("util-extend");function Namespace(){}Namespace.prototype=Object.create(null);Namespace.asNamespace=function(objOrNamespace){if(objOrNamespace instanceof Namespace){return objOrNamespace}return Namespace.createNamespace(objOrNamespace)};Namespace.createNamespace=function(optProps){return Namespace.extend(Namespace.prototype,optProps)};Namespace.extend=function(namespace,optProps){if(namespace!==Namespace.prototype&&!(namespace instanceof Namespace)){throw new TypeError("not a Namespace object: "+namespace)}var ns=Object.create(namespace,{constructor:{value:Namespace,enumerable:false,writable:true,configurable:true}});return extend(ns,optProps)};Namespace.toString=function(ns){return Object.prototype.toString.call(ns)};module.exports=Namespace},{"util-extend":35}],44:[function(require,module,exports){"use strict";function PosInfo(state){ +this.state=state;this.applicationMemoKeyStack=[];this.memo={};this.currentLeftRecursion=undefined}PosInfo.prototype={isActive:function(application){return this.applicationMemoKeyStack.indexOf(application.toMemoKey())>=0},enter:function(application){this.state.enter(application);this.applicationMemoKeyStack.push(application.toMemoKey())},exit:function(){this.state.exit();this.applicationMemoKeyStack.pop()},startLeftRecursion:function(headApplication,memoRec){memoRec.isLeftRecursion=true;memoRec.headApplication=headApplication;memoRec.nextLeftRecursion=this.currentLeftRecursion;this.currentLeftRecursion=memoRec;var applicationMemoKeyStack=this.applicationMemoKeyStack;var indexOfFirstInvolvedRule=applicationMemoKeyStack.indexOf(headApplication.toMemoKey())+1;var involvedApplicationMemoKeys=applicationMemoKeyStack.slice(indexOfFirstInvolvedRule);memoRec.isInvolved=function(applicationMemoKey){return involvedApplicationMemoKeys.indexOf(applicationMemoKey)>=0};memoRec.updateInvolvedApplicationMemoKeys=function(){for(var idx=indexOfFirstInvolvedRule;idx0){signature+="("+semanticOperations[name].formals.join(", ")+")"}var method;if(hasSuperSemantics(this)&&this.super[type.toLowerCase()+"s"][name]){method="extend"+type}else{method="add"+type}str+="\n ."+method+"("+JSON.stringify(signature)+", {";var actions=semanticOperations[name].actionDict;var srcArray=[];Object.keys(actions).forEach(function(actionName){if(semanticOperations[name].builtInDefault!==actions[actionName]){srcArray.push("\n "+JSON.stringify(actionName)+": "+actions[actionName].toString())}});str+=srcArray.join(",");str+="\n })"},this)},this);str+=";\n })";if(!semanticsOnly){str="(function() {\n"+" var grammar = this.fromRecipe("+this.grammar.toRecipe()+");\n"+" var semantics = "+str+"(grammar);\n"+" return semantics;\n"+"});\n"}return str};var prototypeGrammar;var prototypeGrammarSemantics;Semantics.initPrototypeParser=function(grammar){prototypeGrammarSemantics=grammar.semantics().addOperation("parse",{AttributeSignature:function(name){return{name:name.parse(),formals:[]}},OperationSignature:function(name,optFormals){return{name:name.parse(),formals:optFormals.parse()[0]||[]}},Formals:function(oparen,fs,cparen){return fs.asIteration().parse()},name:function(first,rest){return this.interval.contents}});prototypeGrammar=grammar};function parseSignature(signature,type){if(!prototypeGrammar){common.assert(signature.indexOf("(")===-1);return{name:signature,formals:[]}}var r=prototypeGrammar.match(signature,type==="operation"?"OperationSignature":"AttributeSignature");if(r.failed()){throw new Error(r.message)}return prototypeGrammarSemantics(r).parse()}function newDefaultAction(type,name,doIt){return function(children){var self=this;var thisThing=this._semantics.operations[name]||this._semantics.attributes[name];var args=thisThing.formals.map(function(formal){return self.args[formal]});if(this.isIteration()){return children.map(function(child){return doIt.apply(child,args)})}if(children.length===1){return doIt.apply(children[0],args)}else{throw new Error("Missing semantic action for "+this.ctorName+" in "+name+" "+type)}}}Semantics.prototype.addOperationOrAttribute=function(type,signature,actionDict){var typePlural=type+"s";var parsedNameAndFormalArgs=parseSignature(signature,type);var name=parsedNameAndFormalArgs.name;var formals=parsedNameAndFormalArgs.formals;this.assertNewName(name,type);var builtInDefault=newDefaultAction(type,name,doIt);var realActionDict={_default:builtInDefault};Object.keys(actionDict).forEach(function(name){realActionDict[name]=actionDict[name]});var entry=type==="operation"?new Operation(name,formals,realActionDict,builtInDefault):new Attribute(name,realActionDict,builtInDefault);entry.checkActionDict(this.grammar);this[typePlural][name]=entry;function doIt(){var thisThing=this._semantics[typePlural][name];if(arguments.length!==thisThing.formals.length){throw new Error("Invalid number of arguments passed to "+name+" "+type+" (expected "+thisThing.formals.length+", got "+arguments.length+")")}var args=Object.create(null);for(var idx=0;idxnewLength){this.bindings.pop()}},getCurrentPosInfo:function(){return this.getPosInfo(this.inputStream.pos)},getPosInfo:function(pos){var posInfo=this.posInfos[pos];return posInfo||(this.posInfos[pos]=new PosInfo(this))},processFailure:function(pos,expr){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){if(pos>this.rightmostFailurePosition){this.rightmostFailurePosition=pos}}else if(pos===this.rightmostFailurePosition){this.addRightmostFailure(expr.toFailure(this.grammar),false)}},ensureRightmostFailures:function(){if(!this.rightmostFailures){this.rightmostFailures=Object.create(null)}},addRightmostFailure:function(failure,shouldCloneIfNew){this.ensureRightmostFailures();var key=failure.toKey();if(!this.rightmostFailures[key]){this.rightmostFailures[key]=shouldCloneIfNew?failure.clone():failure}else if(this.rightmostFailures[key].isFluffy()&&!failure.isFluffy()){this.rightmostFailures[key].clearFluffy()}},addRightmostFailures:function(failures,shouldCloneIfNew){var self=this;Object.keys(failures).forEach(function(key){self.addRightmostFailure(failures[key],shouldCloneIfNew)})},cloneRightmostFailures:function(){if(!this.rightmostFailures){return undefined}var ans=Object.create(null);var self=this;Object.keys(this.rightmostFailures).forEach(function(key){ans[key]=self.rightmostFailures[key].clone()});return ans},getRightmostFailurePosition:function(){return this.rightmostFailurePosition},getFailures:function(){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){this.init(RM_RIGHTMOST_FAILURES);this.evalFromStart()}this.ensureRightmostFailures();var self=this;return Object.keys(this.rightmostFailures).map(function(key){return self.rightmostFailures[key]})},getMemoizedTraceEntry:function(pos,expr){var posInfo=this.posInfos[pos];if(posInfo&&expr.ruleName){var memoRec=posInfo.memo[expr.toMemoKey()];if(memoRec&&memoRec.traceEntry){var entry=memoRec.traceEntry.cloneWithExpr(expr);entry.isMemoized=true;return entry}}return null},getTraceEntry:function(pos,expr,succeeded,bindings){return this.getMemoizedTraceEntry(pos,expr)||new Trace(this.inputStream,pos,expr,succeeded,bindings,this.trace)},isTracing:function(){return this.tracingEnabled},useMemoizedResult:function(memoRec){if(this.isTracing()){this.trace.push(memoRec.traceEntry)}if(this.recordingMode===RM_RIGHTMOST_FAILURES&&memoRec.failuresAtRightmostPosition){this.addRightmostFailures(memoRec.failuresAtRightmostPosition,true)}if(memoRec.value){this.inputStream.pos=memoRec.pos;this.bindings.push(memoRec.value);return true}return false},eval:function(expr){var inputStream=this.inputStream;var origNumBindings=this.bindings.length;if(this.recordingMode===RM_RIGHTMOST_FAILURES){var origFailures=this.rightmostFailures;this.rightmostFailures=undefined}var origPos=inputStream.pos;var memoPos=this.maybeSkipSpacesBefore(expr);if(this.isTracing()){var origTrace=this.trace;this.trace=[]}var ans=expr.eval(this);if(this.isTracing()){var bindings=this.bindings.slice(origNumBindings);var traceEntry=this.getTraceEntry(memoPos,expr,ans,bindings);traceEntry.isImplicitSpaces=expr===applySpaces;traceEntry.isRootNode=expr===this.startExpr;origTrace.push(traceEntry);this.trace=origTrace}if(ans){if(this.rightmostFailures&&(inputStream.pos===this.rightmostFailurePosition||this.skipSpacesIfInSyntacticContext()===this.rightmostFailurePosition)){var self=this;Object.keys(this.rightmostFailures).forEach(function(key){self.rightmostFailures[key].makeFluffy()})}}else{inputStream.pos=origPos;this.truncateBindings(origNumBindings)}if(this.recordingMode===RM_RIGHTMOST_FAILURES&&origFailures){this.addRightmostFailures(origFailures,false)}return ans},_getStartExpr:function(grammar,optStartApplication){var applicationStr=optStartApplication||grammar.defaultStartRule;if(!applicationStr){throw new Error("Missing start rule argument -- the grammar has no default start rule.")}var startApp=grammar.parseApplication(applicationStr);return new pexprs.Seq([startApp,pexprs.end])},evalFromStart:function(){this.eval(this.startExpr)},getFailuresInfo:function(){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){return this.rightmostFailurePosition}else{return this.rightmostFailures}},restoreFailuresInfo:function(failuresInfo){if(this.recordingMode===RM_RIGHTMOST_FAILURE_POSITION){this.rightmostFailurePosition=failuresInfo}else{this.rightmostFailures=failuresInfo}}};module.exports=State},{"./InputStream":40,"./PosInfo":44,"./Trace":47,"./pexprs":67}],47:[function(require,module,exports){"use strict";var Interval=require("./Interval");var common=require("./common");var BALLOT_X="✗";var CHECK_MARK="✓";var DOT_OPERATOR="⋅";var RIGHTWARDS_DOUBLE_ARROW="⇒";var SYMBOL_FOR_HORIZONTAL_TABULATION="␉";var SYMBOL_FOR_LINE_FEED="␊";var SYMBOL_FOR_CARRIAGE_RETURN="␍";function spaces(n){return common.repeat(" ",n).join("")}function getInputExcerpt(inputStream,pos,len){var excerpt=asEscapedString(inputStream.sourceSlice(pos,pos+len));if(excerpt.length0){arr.push(fn())}return arr};exports.repeatStr=function(str,n){return new Array(n+1).join(str)};exports.repeat=function(x,n){return exports.repeatFn(function(){return x},n)};exports.getDuplicates=function(array){var duplicates=[];for(var idx=0;idx1){throw multipleErrors(errors)}}}},{"./Namespace":43}],50:[function(require,module,exports){"use strict";var Builder=require("./Builder");var Grammar=require("./Grammar");var Namespace=require("./Namespace");var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");var util=require("./util");var isBuffer=require("is-buffer");var ohmGrammar;var documentInterface={querySelector:function(sel){return document.querySelector(sel)},querySelectorAll:function(sel){return document.querySelectorAll(sel)}};function isElement(obj){return!!(obj&&obj.nodeType===1)}function isUndefined(obj){return obj===void 0}var MAX_ARRAY_INDEX=Math.pow(2,53)-1;function isArrayLike(obj){if(obj==null){return false}var length=obj.length;return typeof length==="number"&&length>=0&&length<=MAX_ARRAY_INDEX}function load(url){var req=new XMLHttpRequest;req.open("GET",url,false);try{req.send();if(req.status===0||req.status===200){return req.responseText}}catch(e){}throw new Error("unable to load url "+url)}function buildGrammar(match,namespace,optOhmGrammarForTesting){var builder=new Builder;var decl;var currentRuleName;var currentRuleFormals;var overriding=false;var metaGrammar=optOhmGrammarForTesting||ohmGrammar;var helpers=metaGrammar.semantics().addOperation("visit",{Grammar:function(n,s,open,rs,close){var grammarName=n.visit();decl=builder.newGrammar(grammarName,namespace);s.visit();rs.visit();var g=decl.build();g.definitionInterval=this.interval.trimmed();if(grammarName in namespace){throw errors.duplicateGrammarDeclaration(g,namespace)}namespace[grammarName]=g;return g},SuperGrammar:function(_,n){var superGrammarName=n.visit();if(superGrammarName==="null"){decl.withSuperGrammar(null)}else{if(!namespace||!(superGrammarName in namespace)){throw errors.undeclaredGrammar(superGrammarName,namespace,n.interval)}decl.withSuperGrammar(namespace[superGrammarName])}},Rule_define:function(n,fs,d,_,b){currentRuleName=n.visit();currentRuleFormals=fs.visit()[0]||[];if(!decl.defaultStartRule&&decl.ensureSuperGrammar()!==Grammar.ProtoBuiltInRules){decl.withDefaultStartRule(currentRuleName)}var body=b.visit();body.definitionInterval=this.interval.trimmed();var description=d.visit()[0];return decl.define(currentRuleName,currentRuleFormals,body,description)},Rule_override:function(n,fs,_,b){currentRuleName=n.visit();currentRuleFormals=fs.visit()[0]||[];overriding=true;var body=b.visit();body.definitionInterval=this.interval.trimmed();var ans=decl.override(currentRuleName,currentRuleFormals,body);overriding=false;return ans},Rule_extend:function(n,fs,_,b){currentRuleName=n.visit();currentRuleFormals=fs.visit()[0]||[];var body=b.visit();var ans=decl.extend(currentRuleName,currentRuleFormals,body);decl.ruleBodies[currentRuleName].definitionInterval=this.interval.trimmed();return ans},RuleBody:function(_,terms){var args=terms.visit();return builder.alt.apply(builder,args).withInterval(this.interval)},Formals:function(opointy,fs,cpointy){return fs.visit()},Params:function(opointy,ps,cpointy){return ps.visit()},Alt:function(seqs){var args=seqs.visit();return builder.alt.apply(builder,args).withInterval(this.interval)},TopLevelTerm_inline:function(b,n){var inlineRuleName=currentRuleName+"_"+n.visit();var body=b.visit();body.definitionInterval=this.interval.trimmed();var isNewRuleDeclaration=!(decl.superGrammar&&decl.superGrammar.ruleBodies[inlineRuleName]);if(overriding&&!isNewRuleDeclaration){decl.override(inlineRuleName,currentRuleFormals,body)}else{decl.define(inlineRuleName,currentRuleFormals,body)}var params=currentRuleFormals.map(function(formal){return builder.app(formal)});return builder.app(inlineRuleName,params).withInterval(body.interval)},Seq:function(expr){return builder.seq.apply(builder,expr.visit()).withInterval(this.interval)},Iter_star:function(x,_){return builder.star(x.visit()).withInterval(this.interval)},Iter_plus:function(x,_){return builder.plus(x.visit()).withInterval(this.interval)},Iter_opt:function(x,_){return builder.opt(x.visit()).withInterval(this.interval)},Pred_not:function(_,x){return builder.not(x.visit()).withInterval(this.interval)},Pred_lookahead:function(_,x){return builder.lookahead(x.visit()).withInterval(this.interval)},Lex_lex:function(_,x){return builder.lex(x.visit()).withInterval(this.interval)},Base_application:function(rule,ps){return builder.app(rule.visit(),ps.visit()[0]||[]).withInterval(this.interval)},Base_range:function(from,_,to){return builder.range(from.visit(),to.visit()).withInterval(this.interval)},Base_terminal:function(expr){return builder.terminal(expr.visit()).withInterval(this.interval)},Base_paren:function(open,x,close){return x.visit()},ruleDescr:function(open,t,close){return t.visit()},ruleDescrText:function(_){return this.interval.contents.trim()},caseName:function(_,space1,n,space2,end){return n.visit()},name:function(first,rest){return this.interval.contents},nameFirst:function(expr){},nameRest:function(expr){},terminal:function(open,cs,close){return cs.visit().map(function(c){return common.unescapeChar(c)}).join("")},terminalChar:function(_){return this.interval.contents},escapeChar:function(_){return this.interval.contents},NonemptyListOf:function(x,_,xs){return[x.visit()].concat(xs.visit())},EmptyListOf:function(){return[]},_terminal:function(){return this.primitiveValue}});return helpers(match).visit()}function compileAndLoad(source,namespace){var m=ohmGrammar.match(source,"Grammars");if(m.failed()){throw errors.grammarSyntaxError(m)}return buildGrammar(m,namespace)}function getScriptElementContents(el){if(!isElement(el)){throw new TypeError("Expected a DOM Node, got "+common.unexpectedObjToString(el))}if(el.type!=="text/ohm-js"){throw new Error('Expected a script tag with type="text/ohm-js", got '+el)}return el.getAttribute("src")?load(el.getAttribute("src")):el.innerHTML}function grammar(source,optNamespace){var ns=grammars(source,optNamespace);var grammarNames=Object.keys(ns);if(grammarNames.length===0){throw new Error("Missing grammar definition")}else if(grammarNames.length>1){var secondGrammar=ns[grammarNames[1]];var interval=secondGrammar.definitionInterval;throw new Error(util.getLineAndColumnMessage(interval.inputStream.source,interval.startIdx)+"Found more than one grammar definition -- use ohm.grammars() instead.")}return ns[grammarNames[0]]}function grammars(source,optNamespace){var ns=Namespace.extend(Namespace.asNamespace(optNamespace));if(typeof source!=="string"){if(isBuffer(source)){source=source.toString()}else{throw new TypeError("Expected string as first argument, got "+common.unexpectedObjToString(source))}}compileAndLoad(source,ns);return ns}function grammarFromScriptElement(optNode){var node=optNode;if(isUndefined(node)){var nodeList=documentInterface.querySelectorAll('script[type="text/ohm-js"]');if(nodeList.length!==1){throw new Error('Expected exactly one script tag with type="text/ohm-js", found '+nodeList.length)}node=nodeList[0]}return grammar(getScriptElementContents(node))}function grammarsFromScriptElements(optNodeOrNodeList){if(isElement(optNodeOrNodeList)){return grammars(optNodeOrNodeList)}var nodeList=optNodeOrNodeList;if(isUndefined(nodeList)){nodeList=documentInterface.querySelectorAll('script[type="text/ohm-js"]')}else if(typeof nodeList==="string"||!isElement(nodeList)&&!isArrayLike(nodeList)){throw new TypeError("Expected a Node, NodeList, or Array, but got "+nodeList)}var ns=Namespace.createNamespace();for(var i=0;i0};Node.prototype.hasNoChildren=function(){return!this.hasChildren()};Node.prototype.onlyChild=function(){if(this.children.length!==1){throw new Error("cannot get only child of a node of type "+this.ctorName+" (it has "+this.numChildren()+" children)")}else{return this.firstChild()}};Node.prototype.firstChild=function(){if(this.hasNoChildren()){throw new Error("cannot get first child of a "+this.ctorName+" node, which has no children")}else{return this.childAt(0)}};Node.prototype.lastChild=function(){if(this.hasNoChildren()){throw new Error("cannot get last child of a "+this.ctorName+" node, which has no children")}else{return this.childAt(this.numChildren()-1)}};Node.prototype.childBefore=function(child){var childIdx=this.indexOfChild(child);if(childIdx<0){throw new Error("Node.childBefore() called w/ an argument that is not a child")}else if(childIdx===0){throw new Error("cannot get child before first child")}else{return this.childAt(childIdx-1)}};Node.prototype.childAfter=function(child){var childIdx=this.indexOfChild(child);if(childIdx<0){throw new Error("Node.childAfter() called w/ an argument that is not a child")}else if(childIdx===this.numChildren()-1){throw new Error("cannot get child after last child")}else{return this.childAt(childIdx+1)}};Node.prototype.isTerminal=function(){return false};Node.prototype.isNonterminal=function(){return false};Node.prototype.isIteration=function(){return false};Node.prototype.isOptional=function(){return false};Node.prototype.toJSON=function(){var r={};r[this.ctorName]=this.children;return r};function TerminalNode(grammar,value,interval){Node.call(this,grammar,"_terminal",[],interval);this.primitiveValue=value}inherits(TerminalNode,Node);TerminalNode.prototype.isTerminal=function(){return true};function NonterminalNode(grammar,ruleName,children,interval){Node.call(this,grammar,ruleName,children,interval)}inherits(NonterminalNode,Node);NonterminalNode.prototype.isNonterminal=function(){return true};NonterminalNode.prototype.isLexical=function(){return common.isLexical(this.ctorName)};NonterminalNode.prototype.isSyntactic=function(){return common.isSyntactic(this.ctorName)};function IterationNode(grammar,children,interval,optional){Node.call(this,grammar,"_iter",children,interval);this.optional=optional}inherits(IterationNode,Node);IterationNode.prototype.isIteration=function(){return true};IterationNode.prototype.isOptional=function(){return this.optional};module.exports={Node:Node,TerminalNode:TerminalNode,NonterminalNode:NonterminalNode,IterationNode:IterationNode}},{"./common":48,inherits:33}],52:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");pexprs.PExpr.prototype.allowsSkippingPrecedingSpace=common.abstract("allowsSkippingPrecedingSpace");pexprs.any.allowsSkippingPrecedingSpace=pexprs.end.allowsSkippingPrecedingSpace=pexprs.Apply.prototype.allowsSkippingPrecedingSpace=pexprs.Terminal.prototype.allowsSkippingPrecedingSpace=pexprs.Range.prototype.allowsSkippingPrecedingSpace=pexprs.UnicodeChar.prototype.allowsSkippingPrecedingSpace=function(){return true};pexprs.Alt.prototype.allowsSkippingPrecedingSpace=pexprs.Iter.prototype.allowsSkippingPrecedingSpace=pexprs.Lex.prototype.allowsSkippingPrecedingSpace=pexprs.Lookahead.prototype.allowsSkippingPrecedingSpace=pexprs.Not.prototype.allowsSkippingPrecedingSpace=pexprs.Param.prototype.allowsSkippingPrecedingSpace=pexprs.Seq.prototype.allowsSkippingPrecedingSpace=function(){return false}},{"./common":48,"./pexprs":67}],53:[function(require,module,exports){"use strict";var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");var lexifyCount;pexprs.PExpr.prototype.assertAllApplicationsAreValid=function(ruleName,grammar){lexifyCount=0;this._assertAllApplicationsAreValid(ruleName,grammar)};pexprs.PExpr.prototype._assertAllApplicationsAreValid=common.abstract("_assertAllApplicationsAreValid");pexprs.any._assertAllApplicationsAreValid=pexprs.end._assertAllApplicationsAreValid=pexprs.Terminal.prototype._assertAllApplicationsAreValid=pexprs.Range.prototype._assertAllApplicationsAreValid=pexprs.Param.prototype._assertAllApplicationsAreValid=pexprs.UnicodeChar.prototype._assertAllApplicationsAreValid=function(ruleName,grammar){};pexprs.Lex.prototype._assertAllApplicationsAreValid=function(ruleName,grammar){lexifyCount++;this.expr._assertAllApplicationsAreValid(ruleName,grammar);lexifyCount--};pexprs.Alt.prototype._assertAllApplicationsAreValid=function(ruleName,grammar){for(var idx=0;idx0)){throw errors.applicationOfSyntacticRuleFromLexicalContext(this.ruleName,this)}var actual=this.args.length;var expected=grammar.ruleFormals[this.ruleName].length;if(actual!==expected){throw errors.wrongNumberOfArguments(this.ruleName,expected,actual,this)}var self=this;this.args.forEach(function(arg){arg._assertAllApplicationsAreValid(ruleName,grammar);if(arg.getArity()!==1){throw errors.invalidParameter(self.ruleName,arg)}})}},{"./common":48,"./errors":49,"./pexprs":67}],54:[function(require,module,exports){"use strict";var common=require("./common");var errors=require("./errors");var pexprs=require("./pexprs");pexprs.PExpr.prototype.assertChoicesHaveUniformArity=common.abstract("assertChoicesHaveUniformArity");pexprs.any.assertChoicesHaveUniformArity=pexprs.end.assertChoicesHaveUniformArity=pexprs.Terminal.prototype.assertChoicesHaveUniformArity=pexprs.Range.prototype.assertChoicesHaveUniformArity=pexprs.Param.prototype.assertChoicesHaveUniformArity=pexprs.Lex.prototype.assertChoicesHaveUniformArity=pexprs.UnicodeChar.prototype.assertChoicesHaveUniformArity=function(ruleName){};pexprs.Alt.prototype.assertChoicesHaveUniformArity=function(ruleName){if(this.terms.length===0){return}var arity=this.terms[0].getArity();for(var idx=0;idx=1};pexprs.end.check=function(grammar,vals){return vals[0]instanceof nodes.Node&&vals[0].isTerminal()&&vals[0].primitiveValue===undefined};pexprs.Terminal.prototype.check=function(grammar,vals){return vals[0]instanceof nodes.Node&&vals[0].isTerminal()&&vals[0].primitiveValue===this.obj};pexprs.Range.prototype.check=function(grammar,vals){return vals[0]instanceof nodes.Node&&vals[0].isTerminal()&&typeof vals[0].primitiveValue===typeof this.from};pexprs.Param.prototype.check=function(grammar,vals){return vals.length>=1};pexprs.Alt.prototype.check=function(grammar,vals){for(var i=0;i=0){if(this.args.length>0){throw new Error("Parameterized rules cannot be passed as arguments to another rule.")}return new pexprs.Param(index)}else{this.args.forEach(function(arg,idx,args){args[idx]=arg.introduceParams(formals)});return this}}},{"./common":48,"./pexprs":67}],60:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs"); +pexprs.PExpr.prototype.isNullable=function(grammar){return this._isNullable(grammar,Object.create(null))};pexprs.PExpr.prototype._isNullable=common.abstract("_isNullable");pexprs.any._isNullable=pexprs.Range.prototype._isNullable=pexprs.Param.prototype._isNullable=pexprs.Plus.prototype._isNullable=pexprs.UnicodeChar.prototype._isNullable=function(grammar,memo){return false};pexprs.end._isNullable=function(grammar,memo){return true};pexprs.Terminal.prototype._isNullable=function(grammar,memo){if(typeof this.obj==="string"){return this.obj===""}else{return false}};pexprs.Alt.prototype._isNullable=function(grammar,memo){return this.terms.length===0||this.terms.some(function(term){return term._isNullable(grammar,memo)})};pexprs.Seq.prototype._isNullable=function(grammar,memo){return this.factors.every(function(factor){return factor._isNullable(grammar,memo)})};pexprs.Star.prototype._isNullable=pexprs.Opt.prototype._isNullable=pexprs.Not.prototype._isNullable=pexprs.Lookahead.prototype._isNullable=function(grammar,memo){return true};pexprs.Lex.prototype._isNullable=function(grammar,memo){return this.expr._isNullable(grammar,memo)};pexprs.Apply.prototype._isNullable=function(grammar,memo){var key=this.toMemoKey();if(!Object.prototype.hasOwnProperty.call(memo,key)){var body=grammar.ruleBodies[this.ruleName];var inlined=body.substituteParams(this.args);memo[key]=false;memo[key]=inlined._isNullable(grammar,memo)}return memo[key]}},{"./common":48,"./pexprs":67}],61:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");function getMetaInfo(expr,grammarInterval){var metaInfo={};if(expr.interval&&grammarInterval){var adjusted=expr.interval.relativeTo(grammarInterval);metaInfo.sourceInterval=[adjusted.startIdx,adjusted.endIdx]}return metaInfo}pexprs.PExpr.prototype.outputRecipe=common.abstract("outputRecipe");pexprs.any.outputRecipe=function(formals,grammarInterval){return["any",getMetaInfo(this,grammarInterval)]};pexprs.end.outputRecipe=function(formals,grammarInterval){return["end",getMetaInfo(this,grammarInterval)]};pexprs.Terminal.prototype.outputRecipe=function(formals,grammarInterval){return["terminal",getMetaInfo(this,grammarInterval),this.obj]};pexprs.Range.prototype.outputRecipe=function(formals,grammarInterval){return["range",getMetaInfo(this,grammarInterval),this.from,this.to]};pexprs.Param.prototype.outputRecipe=function(formals,grammarInterval){return["param",getMetaInfo(this,grammarInterval),this.index]};pexprs.Alt.prototype.outputRecipe=function(formals,grammarInterval){return["alt",getMetaInfo(this,grammarInterval)].concat(this.terms.map(function(term){return term.outputRecipe(formals,grammarInterval)}))};pexprs.Extend.prototype.outputRecipe=function(formals,grammarInterval){var extension=this.terms[0];return extension.outputRecipe(formals,grammarInterval)};pexprs.Seq.prototype.outputRecipe=function(formals,grammarInterval){return["seq",getMetaInfo(this,grammarInterval)].concat(this.factors.map(function(factor){return factor.outputRecipe(formals,grammarInterval)}))};pexprs.Star.prototype.outputRecipe=pexprs.Plus.prototype.outputRecipe=pexprs.Opt.prototype.outputRecipe=pexprs.Not.prototype.outputRecipe=pexprs.Lookahead.prototype.outputRecipe=pexprs.Lex.prototype.outputRecipe=function(formals,grammarInterval){return[this.constructor.name.toLowerCase(),getMetaInfo(this,grammarInterval),this.expr.outputRecipe(formals,grammarInterval)]};pexprs.Apply.prototype.outputRecipe=function(formals,grammarInterval){return["app",getMetaInfo(this,grammarInterval),this.ruleName,this.args.map(function(arg){return arg.outputRecipe(formals,grammarInterval)})]};pexprs.UnicodeChar.prototype.outputRecipe=function(formals,grammarInterval){return["unicodeChar",getMetaInfo(this,grammarInterval),this.category]}},{"./common":48,"./pexprs":67}],62:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");pexprs.PExpr.prototype.substituteParams=common.abstract("substituteParams");pexprs.any.substituteParams=pexprs.end.substituteParams=pexprs.Terminal.prototype.substituteParams=pexprs.Range.prototype.substituteParams=pexprs.Terminal.prototype.substituteParams=pexprs.UnicodeChar.prototype.substituteParams=function(actuals){return this};pexprs.Param.prototype.substituteParams=function(actuals){return actuals[this.index]};pexprs.Alt.prototype.substituteParams=function(actuals){return new pexprs.Alt(this.terms.map(function(term){return term.substituteParams(actuals)}))};pexprs.Seq.prototype.substituteParams=function(actuals){return new pexprs.Seq(this.factors.map(function(factor){return factor.substituteParams(actuals)}))};pexprs.Iter.prototype.substituteParams=pexprs.Not.prototype.substituteParams=pexprs.Lookahead.prototype.substituteParams=pexprs.Lex.prototype.substituteParams=function(actuals){return new this.constructor(this.expr.substituteParams(actuals))};pexprs.Apply.prototype.substituteParams=function(actuals){if(this.args.length===0){return this}else{var args=this.args.map(function(arg){return arg.substituteParams(actuals)});return new pexprs.Apply(this.ruleName,args)}}},{"./common":48,"./pexprs":67}],63:[function(require,module,exports){"use strict";var common=require("./common");var pexprs=require("./pexprs");var copyWithoutDuplicates=common.copyWithoutDuplicates;function isRestrictedJSIdentifier(str){return/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(str)}function resolveDuplicatedNames(argumentNameList){var count=Object.create(null);argumentNameList.forEach(function(argName){count[argName]=(count[argName]||0)+1});Object.keys(count).forEach(function(dupArgName){if(count[dupArgName]<=1){return}var subscript=1;argumentNameList.forEach(function(argName,idx){if(argName===dupArgName){argumentNameList[idx]=argName+"_"+subscript++}})})}pexprs.PExpr.prototype.toArgumentNameList=common.abstract("toArgumentNameList");pexprs.any.toArgumentNameList=function(firstArgIndex,noDupCheck){return["any"]};pexprs.end.toArgumentNameList=function(firstArgIndex,noDupCheck){return["end"]};pexprs.Terminal.prototype.toArgumentNameList=function(firstArgIndex,noDupCheck){if(typeof this.obj==="string"&&/^[_a-zA-Z0-9]+$/.test(this.obj)){return["_"+this.obj]}else{return["$"+firstArgIndex]}};pexprs.Range.prototype.toArgumentNameList=function(firstArgIndex,noDupCheck){var argName=this.from+"_to_"+this.to;if(!isRestrictedJSIdentifier(argName)){argName="_"+argName}if(!isRestrictedJSIdentifier(argName)){argName="$"+firstArgIndex}return[argName]};pexprs.Alt.prototype.toArgumentNameList=function(firstArgIndex,noDupCheck){var termArgNameLists=this.terms.map(function(term){return term.toArgumentNameList(firstArgIndex,true)});var argumentNameList=[];var numArgs=termArgNameLists[0].length;for(var colIdx=0;colIdx0){var ps=this.args.map(function(arg){return arg.toString()});return this.ruleName+"<"+ps.join(",")+">"}else{return this.ruleName}};pexprs.UnicodeChar.prototype.toString=function(){return"\\p{"+this.category+"}"}},{"./common":48,"./pexprs":67}],67:[function(require,module,exports){"use strict";var UnicodeCategories=require("../third_party/UnicodeCategories");var common=require("./common");var errors=require("./errors");var inherits=require("inherits");function PExpr(){throw new Error("PExpr cannot be instantiated -- it's abstract")}PExpr.prototype.withInterval=function(interval){if(interval){this.interval=interval.trimmed()}return this};var any=Object.create(PExpr.prototype);var end=Object.create(PExpr.prototype);function Terminal(obj){this.obj=obj}inherits(Terminal,PExpr);function Range(from,to){this.from=from;this.to=to}inherits(Range,PExpr);function Param(index){this.index=index}inherits(Param,PExpr);function Alt(terms){this.terms=terms}inherits(Alt,PExpr);function Extend(superGrammar,name,body){this.superGrammar=superGrammar;this.name=name;this.body=body;var origBody=superGrammar.ruleBodies[name];this.terms=[body,origBody]}inherits(Extend,Alt);function Seq(factors){this.factors=factors}inherits(Seq,PExpr);function Iter(expr){this.expr=expr}inherits(Iter,PExpr);function Star(expr){this.expr=expr}inherits(Star,Iter);function Plus(expr){this.expr=expr}inherits(Plus,Iter);function Opt(expr){this.expr=expr}inherits(Opt,Iter);Star.prototype.operator="*";Plus.prototype.operator="+";Opt.prototype.operator="?";Star.prototype.minNumMatches=0;Plus.prototype.minNumMatches=1;Opt.prototype.minNumMatches=0;Star.prototype.maxNumMatches=Number.POSITIVE_INFINITY;Plus.prototype.maxNumMatches=Number.POSITIVE_INFINITY;Opt.prototype.maxNumMatches=1;function Not(expr){this.expr=expr}inherits(Not,PExpr);function Lookahead(expr){this.expr=expr}inherits(Lookahead,PExpr);function Lex(expr){this.expr=expr}inherits(Lex,PExpr);function Arr(expr){this.expr=expr}inherits(Arr,PExpr);function Str(expr){this.expr=expr}inherits(Str,PExpr);function Obj(properties,isLenient){var names=properties.map(function(property){return property.name});var duplicates=common.getDuplicates(names);if(duplicates.length>0){throw errors.duplicatePropertyNames(duplicates)}else{this.properties=properties;this.isLenient=isLenient}}inherits(Obj,PExpr);function Apply(ruleName,optArgs){this.ruleName=ruleName;this.args=optArgs||[]}inherits(Apply,PExpr);Apply.prototype.isSyntactic=function(){return common.isSyntactic(this.ruleName)};Apply.prototype.toMemoKey=function(){if(!this._memoKey){Object.defineProperty(this,"_memoKey",{value:this.toString()})}return this._memoKey};function UnicodeChar(category){this.category=category;this.pattern=UnicodeCategories[category]}inherits(UnicodeChar,PExpr);exports.PExpr=PExpr;exports.any=any;exports.end=end;exports.Terminal=Terminal;exports.Range=Range;exports.Param=Param;exports.Alt=Alt;exports.Extend=Extend;exports.Seq=Seq;exports.Iter=Iter;exports.Star=Star;exports.Plus=Plus;exports.Opt=Opt;exports.Not=Not;exports.Lookahead=Lookahead;exports.Lex=Lex;exports.Arr=Arr;exports.Str=Str;exports.Obj=Obj;exports.Apply=Apply;exports.UnicodeChar=UnicodeChar;require("./pexprs-allowsSkippingPrecedingSpace");require("./pexprs-assertAllApplicationsAreValid");require("./pexprs-assertChoicesHaveUniformArity");require("./pexprs-assertIteratedExprsAreNotNullable");require("./pexprs-check");require("./pexprs-eval");require("./pexprs-getArity");require("./pexprs-outputRecipe");require("./pexprs-introduceParams");require("./pexprs-isNullable");require("./pexprs-substituteParams");require("./pexprs-toDisplayString");require("./pexprs-toArgumentNameList");require("./pexprs-toFailure");require("./pexprs-toString")},{"../third_party/UnicodeCategories":69,"./common":48,"./errors":49,"./pexprs-allowsSkippingPrecedingSpace":52,"./pexprs-assertAllApplicationsAreValid":53,"./pexprs-assertChoicesHaveUniformArity":54,"./pexprs-assertIteratedExprsAreNotNullable":55,"./pexprs-check":56,"./pexprs-eval":57,"./pexprs-getArity":58,"./pexprs-introduceParams":59,"./pexprs-isNullable":60,"./pexprs-outputRecipe":61,"./pexprs-substituteParams":62,"./pexprs-toArgumentNameList":63,"./pexprs-toDisplayString":64,"./pexprs-toFailure":65,"./pexprs-toString":66,inherits:33}],68:[function(require,module,exports){"use strict";var common=require("./common");function padNumbersToEqualLength(arr){var maxLen=0;var strings=arr.map(function(n){var str=n.toString();maxLen=Math.max(maxLen,str.length);return str});return strings.map(function(s){return common.padLeft(s,maxLen)})}function strcpy(dest,src,offset){var origDestLen=dest.length;var start=dest.slice(0,offset);var end=dest.slice(offset+src.length);return(start+src+end).substr(0,origDestLen)}exports.getLineAndColumn=function(str,offset){var lineNum=1;var colNum=1;var currOffset=0;var lineStartOffset=0;var nextLine=null;var prevLine=null;var prevLineStartOffset=-1;while(currOffset=0){prevLine=str.slice(prevLineStartOffset,lineStartOffset).replace(/\r?\n$/,"")}var line=str.slice(lineStartOffset,lineEndOffset).replace(/\r$/,"");return{lineNum:lineNum,colNum:colNum,line:line,prevLine:prevLine,nextLine:nextLine}};exports.getLineAndColumnMessage=function(str,offset){var repeatStr=common.repeatStr;var lineAndCol=exports.getLineAndColumn(str,offset);var sb=new common.StringBuffer;sb.append("Line "+lineAndCol.lineNum+", col "+lineAndCol.colNum+":\n");var lineNumbers=padNumbersToEqualLength([lineAndCol.prevLine==null?0:lineAndCol.lineNum-1,lineAndCol.lineNum,lineAndCol.nextLine==null?0:lineAndCol.lineNum+1]);function appendLine(num,content,prefix){sb.append(prefix+lineNumbers[num]+" | "+content+"\n")}if(lineAndCol.prevLine!=null){appendLine(0,lineAndCol.prevLine," ")}appendLine(1,lineAndCol.line,"> ");var lineLen=lineAndCol.line.length;var indicationLine=repeatStr(" ",lineLen+1);var ranges=Array.prototype.slice.call(arguments,2);for(var i=0;i=0&&startIdx<=endIdx,"range start must be >= 0 and <= end");var lineStartOffset=offset-lineAndCol.colNum+1;startIdx=Math.max(0,startIdx-lineStartOffset);endIdx=Math.min(endIdx-lineStartOffset,lineLen);indicationLine=strcpy(indicationLine,repeatStr("~",endIdx-startIdx),startIdx)}var gutterWidth=2+lineNumbers[1].length+3;sb.append(repeatStr(" ",gutterWidth));indicationLine=strcpy(indicationLine,"^",lineAndCol.colNum-1);sb.append(indicationLine.replace(/ +$/,"")+"\n");if(lineAndCol.nextLine!=null){appendLine(2,lineAndCol.nextLine," ")}return sb.contents()}},{"./common":48}],69:[function(require,module,exports){module.exports={Lu:/[\u0041-\u005A]|[\u00C0-\u00D6]|[\u00D8-\u00DE]|[\u0100-\u0100]|[\u0102-\u0102]|[\u0104-\u0104]|[\u0106-\u0106]|[\u0108-\u0108]|[\u010A-\u010A]|[\u010C-\u010C]|[\u010E-\u010E]|[\u0110-\u0110]|[\u0112-\u0112]|[\u0114-\u0114]|[\u0116-\u0116]|[\u0118-\u0118]|[\u011A-\u011A]|[\u011C-\u011C]|[\u011E-\u011E]|[\u0120-\u0120]|[\u0122-\u0122]|[\u0124-\u0124]|[\u0126-\u0126]|[\u0128-\u0128]|[\u012A-\u012A]|[\u012C-\u012C]|[\u012E-\u012E]|[\u0130-\u0130]|[\u0132-\u0132]|[\u0134-\u0134]|[\u0136-\u0136]|[\u0139-\u0139]|[\u013B-\u013B]|[\u013D-\u013D]|[\u013F-\u013F]|[\u0141-\u0141]|[\u0143-\u0143]|[\u0145-\u0145]|[\u0147-\u0147]|[\u014A-\u014A]|[\u014C-\u014C]|[\u014E-\u014E]|[\u0150-\u0150]|[\u0152-\u0152]|[\u0154-\u0154]|[\u0156-\u0156]|[\u0158-\u0158]|[\u015A-\u015A]|[\u015C-\u015C]|[\u015E-\u015E]|[\u0160-\u0160]|[\u0162-\u0162]|[\u0164-\u0164]|[\u0166-\u0166]|[\u0168-\u0168]|[\u016A-\u016A]|[\u016C-\u016C]|[\u016E-\u016E]|[\u0170-\u0170]|[\u0172-\u0172]|[\u0174-\u0174]|[\u0176-\u0176]|[\u0178-\u0179]|[\u017B-\u017B]|[\u017D-\u017D]|[\u0181-\u0182]|[\u0184-\u0184]|[\u0186-\u0187]|[\u0189-\u018B]|[\u018E-\u0191]|[\u0193-\u0194]|[\u0196-\u0198]|[\u019C-\u019D]|[\u019F-\u01A0]|[\u01A2-\u01A2]|[\u01A4-\u01A4]|[\u01A6-\u01A7]|[\u01A9-\u01A9]|[\u01AC-\u01AC]|[\u01AE-\u01AF]|[\u01B1-\u01B3]|[\u01B5-\u01B5]|[\u01B7-\u01B8]|[\u01BC-\u01BC]|[\u01C4-\u01C4]|[\u01C7-\u01C7]|[\u01CA-\u01CA]|[\u01CD-\u01CD]|[\u01CF-\u01CF]|[\u01D1-\u01D1]|[\u01D3-\u01D3]|[\u01D5-\u01D5]|[\u01D7-\u01D7]|[\u01D9-\u01D9]|[\u01DB-\u01DB]|[\u01DE-\u01DE]|[\u01E0-\u01E0]|[\u01E2-\u01E2]|[\u01E4-\u01E4]|[\u01E6-\u01E6]|[\u01E8-\u01E8]|[\u01EA-\u01EA]|[\u01EC-\u01EC]|[\u01EE-\u01EE]|[\u01F1-\u01F1]|[\u01F4-\u01F4]|[\u01FA-\u01FA]|[\u01FC-\u01FC]|[\u01FE-\u01FE]|[\u0200-\u0200]|[\u0202-\u0202]|[\u0204-\u0204]|[\u0206-\u0206]|[\u0208-\u0208]|[\u020A-\u020A]|[\u020C-\u020C]|[\u020E-\u020E]|[\u0210-\u0210]|[\u0212-\u0212]|[\u0214-\u0214]|[\u0216-\u0216]|[\u0386-\u0386]|[\u0388-\u038A]|[\u038C-\u038C]|[\u038E-\u038F]|[\u0391-\u03A1]|[\u03A3-\u03AB]|[\u03D2-\u03D4]|[\u03DA-\u03DA]|[\u03DC-\u03DC]|[\u03DE-\u03DE]|[\u03E0-\u03E0]|[\u03E2-\u03E2]|[\u03E4-\u03E4]|[\u03E6-\u03E6]|[\u03E8-\u03E8]|[\u03EA-\u03EA]|[\u03EC-\u03EC]|[\u03EE-\u03EE]|[\u0401-\u040C]|[\u040E-\u042F]|[\u0460-\u0460]|[\u0462-\u0462]|[\u0464-\u0464]|[\u0466-\u0466]|[\u0468-\u0468]|[\u046A-\u046A]|[\u046C-\u046C]|[\u046E-\u046E]|[\u0470-\u0470]|[\u0472-\u0472]|[\u0474-\u0474]|[\u0476-\u0476]|[\u0478-\u0478]|[\u047A-\u047A]|[\u047C-\u047C]|[\u047E-\u047E]|[\u0480-\u0480]|[\u0490-\u0490]|[\u0492-\u0492]|[\u0494-\u0494]|[\u0496-\u0496]|[\u0498-\u0498]|[\u049A-\u049A]|[\u049C-\u049C]|[\u049E-\u049E]|[\u04A0-\u04A0]|[\u04A2-\u04A2]|[\u04A4-\u04A4]|[\u04A6-\u04A6]|[\u04A8-\u04A8]|[\u04AA-\u04AA]|[\u04AC-\u04AC]|[\u04AE-\u04AE]|[\u04B0-\u04B0]|[\u04B2-\u04B2]|[\u04B4-\u04B4]|[\u04B6-\u04B6]|[\u04B8-\u04B8]|[\u04BA-\u04BA]|[\u04BC-\u04BC]|[\u04BE-\u04BE]|[\u04C1-\u04C1]|[\u04C3-\u04C3]|[\u04C7-\u04C7]|[\u04CB-\u04CB]|[\u04D0-\u04D0]|[\u04D2-\u04D2]|[\u04D4-\u04D4]|[\u04D6-\u04D6]|[\u04D8-\u04D8]|[\u04DA-\u04DA]|[\u04DC-\u04DC]|[\u04DE-\u04DE]|[\u04E0-\u04E0]|[\u04E2-\u04E2]|[\u04E4-\u04E4]|[\u04E6-\u04E6]|[\u04E8-\u04E8]|[\u04EA-\u04EA]|[\u04EE-\u04EE]|[\u04F0-\u04F0]|[\u04F2-\u04F2]|[\u04F4-\u04F4]|[\u04F8-\u04F8]|[\u0531-\u0556]|[\u10A0-\u10C5]|[\u1E00-\u1E00]|[\u1E02-\u1E02]|[\u1E04-\u1E04]|[\u1E06-\u1E06]|[\u1E08-\u1E08]|[\u1E0A-\u1E0A]|[\u1E0C-\u1E0C]|[\u1E0E-\u1E0E]|[\u1E10-\u1E10]|[\u1E12-\u1E12]|[\u1E14-\u1E14]|[\u1E16-\u1E16]|[\u1E18-\u1E18]|[\u1E1A-\u1E1A]|[\u1E1C-\u1E1C]|[\u1E1E-\u1E1E]|[\u1E20-\u1E20]|[\u1E22-\u1E22]|[\u1E24-\u1E24]|[\u1E26-\u1E26]|[\u1E28-\u1E28]|[\u1E2A-\u1E2A]|[\u1E2C-\u1E2C]|[\u1E2E-\u1E2E]|[\u1E30-\u1E30]|[\u1E32-\u1E32]|[\u1E34-\u1E34]|[\u1E36-\u1E36]|[\u1E38-\u1E38]|[\u1E3A-\u1E3A]|[\u1E3C-\u1E3C]|[\u1E3E-\u1E3E]|[\u1E40-\u1E40]|[\u1E42-\u1E42]|[\u1E44-\u1E44]|[\u1E46-\u1E46]|[\u1E48-\u1E48]|[\u1E4A-\u1E4A]|[\u1E4C-\u1E4C]|[\u1E4E-\u1E4E]|[\u1E50-\u1E50]|[\u1E52-\u1E52]|[\u1E54-\u1E54]|[\u1E56-\u1E56]|[\u1E58-\u1E58]|[\u1E5A-\u1E5A]|[\u1E5C-\u1E5C]|[\u1E5E-\u1E5E]|[\u1E60-\u1E60]|[\u1E62-\u1E62]|[\u1E64-\u1E64]|[\u1E66-\u1E66]|[\u1E68-\u1E68]|[\u1E6A-\u1E6A]|[\u1E6C-\u1E6C]|[\u1E6E-\u1E6E]|[\u1E70-\u1E70]|[\u1E72-\u1E72]|[\u1E74-\u1E74]|[\u1E76-\u1E76]|[\u1E78-\u1E78]|[\u1E7A-\u1E7A]|[\u1E7C-\u1E7C]|[\u1E7E-\u1E7E]|[\u1E80-\u1E80]|[\u1E82-\u1E82]|[\u1E84-\u1E84]|[\u1E86-\u1E86]|[\u1E88-\u1E88]|[\u1E8A-\u1E8A]|[\u1E8C-\u1E8C]|[\u1E8E-\u1E8E]|[\u1E90-\u1E90]|[\u1E92-\u1E92]|[\u1E94-\u1E94]|[\u1EA0-\u1EA0]|[\u1EA2-\u1EA2]|[\u1EA4-\u1EA4]|[\u1EA6-\u1EA6]|[\u1EA8-\u1EA8]|[\u1EAA-\u1EAA]|[\u1EAC-\u1EAC]|[\u1EAE-\u1EAE]|[\u1EB0-\u1EB0]|[\u1EB2-\u1EB2]|[\u1EB4-\u1EB4]|[\u1EB6-\u1EB6]|[\u1EB8-\u1EB8]|[\u1EBA-\u1EBA]|[\u1EBC-\u1EBC]|[\u1EBE-\u1EBE]|[\u1EC0-\u1EC0]|[\u1EC2-\u1EC2]|[\u1EC4-\u1EC4]|[\u1EC6-\u1EC6]|[\u1EC8-\u1EC8]|[\u1ECA-\u1ECA]|[\u1ECC-\u1ECC]|[\u1ECE-\u1ECE]|[\u1ED0-\u1ED0]|[\u1ED2-\u1ED2]|[\u1ED4-\u1ED4]|[\u1ED6-\u1ED6]|[\u1ED8-\u1ED8]|[\u1EDA-\u1EDA]|[\u1EDC-\u1EDC]|[\u1EDE-\u1EDE]|[\u1EE0-\u1EE0]|[\u1EE2-\u1EE2]|[\u1EE4-\u1EE4]|[\u1EE6-\u1EE6]|[\u1EE8-\u1EE8]|[\u1EEA-\u1EEA]|[\u1EEC-\u1EEC]|[\u1EEE-\u1EEE]|[\u1EF0-\u1EF0]|[\u1EF2-\u1EF2]|[\u1EF4-\u1EF4]|[\u1EF6-\u1EF6]|[\u1EF8-\u1EF8]|[\u1F08-\u1F0F]|[\u1F18-\u1F1D]|[\u1F28-\u1F2F]|[\u1F38-\u1F3F]|[\u1F48-\u1F4D]|[\u1F59-\u1F59]|[\u1F5B-\u1F5B]|[\u1F5D-\u1F5D]|[\u1F5F-\u1F5F]|[\u1F68-\u1F6F]|[\u1F88-\u1F8F]|[\u1F98-\u1F9F]|[\u1FA8-\u1FAF]|[\u1FB8-\u1FBC]|[\u1FC8-\u1FCC]|[\u1FD8-\u1FDB]|[\u1FE8-\u1FEC]|[\u1FF8-\u1FFC]|[\u2102-\u2102]|[\u2107-\u2107]|[\u210B-\u210D]|[\u2110-\u2112]|[\u2115-\u2115]|[\u2119-\u211D]|[\u2124-\u2124]|[\u2126-\u2126]|[\u2128-\u2128]|[\u212A-\u212D]|[\u2130-\u2131]|[\u2133-\u2133]|[\uFF21-\uFF3A]/,Ll:/[\u0061-\u007A]|[\u00AA-\u00AA]|[\u00B5-\u00B5]|[\u00BA-\u00BA]|[\u00DF-\u00F6]|[\u00F8-\u00FF]|[\u0101-\u0101]|[\u0103-\u0103]|[\u0105-\u0105]|[\u0107-\u0107]|[\u0109-\u0109]|[\u010B-\u010B]|[\u010D-\u010D]|[\u010F-\u010F]|[\u0111-\u0111]|[\u0113-\u0113]|[\u0115-\u0115]|[\u0117-\u0117]|[\u0119-\u0119]|[\u011B-\u011B]|[\u011D-\u011D]|[\u011F-\u011F]|[\u0121-\u0121]|[\u0123-\u0123]|[\u0125-\u0125]|[\u0127-\u0127]|[\u0129-\u0129]|[\u012B-\u012B]|[\u012D-\u012D]|[\u012F-\u012F]|[\u0131-\u0131]|[\u0133-\u0133]|[\u0135-\u0135]|[\u0137-\u0138]|[\u013A-\u013A]|[\u013C-\u013C]|[\u013E-\u013E]|[\u0140-\u0140]|[\u0142-\u0142]|[\u0144-\u0144]|[\u0146-\u0146]|[\u0148-\u0149]|[\u014B-\u014B]|[\u014D-\u014D]|[\u014F-\u014F]|[\u0151-\u0151]|[\u0153-\u0153]|[\u0155-\u0155]|[\u0157-\u0157]|[\u0159-\u0159]|[\u015B-\u015B]|[\u015D-\u015D]|[\u015F-\u015F]|[\u0161-\u0161]|[\u0163-\u0163]|[\u0165-\u0165]|[\u0167-\u0167]|[\u0169-\u0169]|[\u016B-\u016B]|[\u016D-\u016D]|[\u016F-\u016F]|[\u0171-\u0171]|[\u0173-\u0173]|[\u0175-\u0175]|[\u0177-\u0177]|[\u017A-\u017A]|[\u017C-\u017C]|[\u017E-\u0180]|[\u0183-\u0183]|[\u0185-\u0185]|[\u0188-\u0188]|[\u018C-\u018D]|[\u0192-\u0192]|[\u0195-\u0195]|[\u0199-\u019B]|[\u019E-\u019E]|[\u01A1-\u01A1]|[\u01A3-\u01A3]|[\u01A5-\u01A5]|[\u01A8-\u01A8]|[\u01AB-\u01AB]|[\u01AD-\u01AD]|[\u01B0-\u01B0]|[\u01B4-\u01B4]|[\u01B6-\u01B6]|[\u01B9-\u01BA]|[\u01BD-\u01BD]|[\u01C6-\u01C6]|[\u01C9-\u01C9]|[\u01CC-\u01CC]|[\u01CE-\u01CE]|[\u01D0-\u01D0]|[\u01D2-\u01D2]|[\u01D4-\u01D4]|[\u01D6-\u01D6]|[\u01D8-\u01D8]|[\u01DA-\u01DA]|[\u01DC-\u01DD]|[\u01DF-\u01DF]|[\u01E1-\u01E1]|[\u01E3-\u01E3]|[\u01E5-\u01E5]|[\u01E7-\u01E7]|[\u01E9-\u01E9]|[\u01EB-\u01EB]|[\u01ED-\u01ED]|[\u01EF-\u01F0]|[\u01F3-\u01F3]|[\u01F5-\u01F5]|[\u01FB-\u01FB]|[\u01FD-\u01FD]|[\u01FF-\u01FF]|[\u0201-\u0201]|[\u0203-\u0203]|[\u0205-\u0205]|[\u0207-\u0207]|[\u0209-\u0209]|[\u020B-\u020B]|[\u020D-\u020D]|[\u020F-\u020F]|[\u0211-\u0211]|[\u0213-\u0213]|[\u0215-\u0215]|[\u0217-\u0217]|[\u0250-\u02A8]|[\u0390-\u0390]|[\u03AC-\u03CE]|[\u03D0-\u03D1]|[\u03D5-\u03D6]|[\u03E3-\u03E3]|[\u03E5-\u03E5]|[\u03E7-\u03E7]|[\u03E9-\u03E9]|[\u03EB-\u03EB]|[\u03ED-\u03ED]|[\u03EF-\u03F2]|[\u0430-\u044F]|[\u0451-\u045C]|[\u045E-\u045F]|[\u0461-\u0461]|[\u0463-\u0463]|[\u0465-\u0465]|[\u0467-\u0467]|[\u0469-\u0469]|[\u046B-\u046B]|[\u046D-\u046D]|[\u046F-\u046F]|[\u0471-\u0471]|[\u0473-\u0473]|[\u0475-\u0475]|[\u0477-\u0477]|[\u0479-\u0479]|[\u047B-\u047B]|[\u047D-\u047D]|[\u047F-\u047F]|[\u0481-\u0481]|[\u0491-\u0491]|[\u0493-\u0493]|[\u0495-\u0495]|[\u0497-\u0497]|[\u0499-\u0499]|[\u049B-\u049B]|[\u049D-\u049D]|[\u049F-\u049F]|[\u04A1-\u04A1]|[\u04A3-\u04A3]|[\u04A5-\u04A5]|[\u04A7-\u04A7]|[\u04A9-\u04A9]|[\u04AB-\u04AB]|[\u04AD-\u04AD]|[\u04AF-\u04AF]|[\u04B1-\u04B1]|[\u04B3-\u04B3]|[\u04B5-\u04B5]|[\u04B7-\u04B7]|[\u04B9-\u04B9]|[\u04BB-\u04BB]|[\u04BD-\u04BD]|[\u04BF-\u04BF]|[\u04C2-\u04C2]|[\u04C4-\u04C4]|[\u04C8-\u04C8]|[\u04CC-\u04CC]|[\u04D1-\u04D1]|[\u04D3-\u04D3]|[\u04D5-\u04D5]|[\u04D7-\u04D7]|[\u04D9-\u04D9]|[\u04DB-\u04DB]|[\u04DD-\u04DD]|[\u04DF-\u04DF]|[\u04E1-\u04E1]|[\u04E3-\u04E3]|[\u04E5-\u04E5]|[\u04E7-\u04E7]|[\u04E9-\u04E9]|[\u04EB-\u04EB]|[\u04EF-\u04EF]|[\u04F1-\u04F1]|[\u04F3-\u04F3]|[\u04F5-\u04F5]|[\u04F9-\u04F9]|[\u0561-\u0587]|[\u10D0-\u10F6]|[\u1E01-\u1E01]|[\u1E03-\u1E03]|[\u1E05-\u1E05]|[\u1E07-\u1E07]|[\u1E09-\u1E09]|[\u1E0B-\u1E0B]|[\u1E0D-\u1E0D]|[\u1E0F-\u1E0F]|[\u1E11-\u1E11]|[\u1E13-\u1E13]|[\u1E15-\u1E15]|[\u1E17-\u1E17]|[\u1E19-\u1E19]|[\u1E1B-\u1E1B]|[\u1E1D-\u1E1D]|[\u1E1F-\u1E1F]|[\u1E21-\u1E21]|[\u1E23-\u1E23]|[\u1E25-\u1E25]|[\u1E27-\u1E27]|[\u1E29-\u1E29]|[\u1E2B-\u1E2B]|[\u1E2D-\u1E2D]|[\u1E2F-\u1E2F]|[\u1E31-\u1E31]|[\u1E33-\u1E33]|[\u1E35-\u1E35]|[\u1E37-\u1E37]|[\u1E39-\u1E39]|[\u1E3B-\u1E3B]|[\u1E3D-\u1E3D]|[\u1E3F-\u1E3F]|[\u1E41-\u1E41]|[\u1E43-\u1E43]|[\u1E45-\u1E45]|[\u1E47-\u1E47]|[\u1E49-\u1E49]|[\u1E4B-\u1E4B]|[\u1E4D-\u1E4D]|[\u1E4F-\u1E4F]|[\u1E51-\u1E51]|[\u1E53-\u1E53]|[\u1E55-\u1E55]|[\u1E57-\u1E57]|[\u1E59-\u1E59]|[\u1E5B-\u1E5B]|[\u1E5D-\u1E5D]|[\u1E5F-\u1E5F]|[\u1E61-\u1E61]|[\u1E63-\u1E63]|[\u1E65-\u1E65]|[\u1E67-\u1E67]|[\u1E69-\u1E69]|[\u1E6B-\u1E6B]|[\u1E6D-\u1E6D]|[\u1E6F-\u1E6F]|[\u1E71-\u1E71]|[\u1E73-\u1E73]|[\u1E75-\u1E75]|[\u1E77-\u1E77]|[\u1E79-\u1E79]|[\u1E7B-\u1E7B]|[\u1E7D-\u1E7D]|[\u1E7F-\u1E7F]|[\u1E81-\u1E81]|[\u1E83-\u1E83]|[\u1E85-\u1E85]|[\u1E87-\u1E87]|[\u1E89-\u1E89]|[\u1E8B-\u1E8B]|[\u1E8D-\u1E8D]|[\u1E8F-\u1E8F]|[\u1E91-\u1E91]|[\u1E93-\u1E93]|[\u1E95-\u1E9B]|[\u1EA1-\u1EA1]|[\u1EA3-\u1EA3]|[\u1EA5-\u1EA5]|[\u1EA7-\u1EA7]|[\u1EA9-\u1EA9]|[\u1EAB-\u1EAB]|[\u1EAD-\u1EAD]|[\u1EAF-\u1EAF]|[\u1EB1-\u1EB1]|[\u1EB3-\u1EB3]|[\u1EB5-\u1EB5]|[\u1EB7-\u1EB7]|[\u1EB9-\u1EB9]|[\u1EBB-\u1EBB]|[\u1EBD-\u1EBD]|[\u1EBF-\u1EBF]|[\u1EC1-\u1EC1]|[\u1EC3-\u1EC3]|[\u1EC5-\u1EC5]|[\u1EC7-\u1EC7]|[\u1EC9-\u1EC9]|[\u1ECB-\u1ECB]|[\u1ECD-\u1ECD]|[\u1ECF-\u1ECF]|[\u1ED1-\u1ED1]|[\u1ED3-\u1ED3]|[\u1ED5-\u1ED5]|[\u1ED7-\u1ED7]|[\u1ED9-\u1ED9]|[\u1EDB-\u1EDB]|[\u1EDD-\u1EDD]|[\u1EDF-\u1EDF]|[\u1EE1-\u1EE1]|[\u1EE3-\u1EE3]|[\u1EE5-\u1EE5]|[\u1EE7-\u1EE7]|[\u1EE9-\u1EE9]|[\u1EEB-\u1EEB]|[\u1EED-\u1EED]|[\u1EEF-\u1EEF]|[\u1EF1-\u1EF1]|[\u1EF3-\u1EF3]|[\u1EF5-\u1EF5]|[\u1EF7-\u1EF7]|[\u1EF9-\u1EF9]|[\u1F00-\u1F07]|[\u1F10-\u1F15]|[\u1F20-\u1F27]|[\u1F30-\u1F37]|[\u1F40-\u1F45]|[\u1F50-\u1F57]|[\u1F60-\u1F67]|[\u1F70-\u1F7D]|[\u1F80-\u1F87]|[\u1F90-\u1F97]|[\u1FA0-\u1FA7]|[\u1FB0-\u1FB4]|[\u1FB6-\u1FB7]|[\u1FBE-\u1FBE]|[\u1FC2-\u1FC4]|[\u1FC6-\u1FC7]|[\u1FD0-\u1FD3]|[\u1FD6-\u1FD7]|[\u1FE0-\u1FE7]|[\u1FF2-\u1FF4]|[\u1FF6-\u1FF7]|[\u207F-\u207F]|[\u210A-\u210A]|[\u210E-\u210F]|[\u2113-\u2113]|[\u2118-\u2118]|[\u212E-\u212F]|[\u2134-\u2134]|[\uFB00-\uFB06]|[\uFB13-\uFB17]|[\uFF41-\uFF5A]/,Lt:/[\u01C5-\u01C5]|[\u01C8-\u01C8]|[\u01CB-\u01CB]|[\u01F2-\u01F2]/,Lm:/[\u02B0-\u02B8]|[\u02BB-\u02C1]|[\u02D0-\u02D1]|[\u02E0-\u02E4]|[\u037A-\u037A]|[\u0559-\u0559]|[\u0640-\u0640]|[\u06E5-\u06E6]|[\u0E46-\u0E46]|[\u0EC6-\u0EC6]|[\u3005-\u3005]|[\u3031-\u3035]|[\u309D-\u309E]|[\u30FC-\u30FE]|[\uFF70-\uFF70]|[\uFF9E-\uFF9F]/,Lo:/[\u01AA-\u01AA]|[\u01BB-\u01BB]|[\u01BE-\u01C3]|[\u03F3-\u03F3]|[\u04C0-\u04C0]|[\u05D0-\u05EA]|[\u05F0-\u05F2]|[\u0621-\u063A]|[\u0641-\u064A]|[\u0671-\u06B7]|[\u06BA-\u06BE]|[\u06C0-\u06CE]|[\u06D0-\u06D3]|[\u06D5-\u06D5]|[\u0905-\u0939]|[\u093D-\u093D]|[\u0950-\u0950]|[\u0958-\u0961]|[\u0985-\u098C]|[\u098F-\u0990]|[\u0993-\u09A8]|[\u09AA-\u09B0]|[\u09B2-\u09B2]|[\u09B6-\u09B9]|[\u09DC-\u09DD]|[\u09DF-\u09E1]|[\u09F0-\u09F1]|[\u0A05-\u0A0A]|[\u0A0F-\u0A10]|[\u0A13-\u0A28]|[\u0A2A-\u0A30]|[\u0A32-\u0A33]|[\u0A35-\u0A36]|[\u0A38-\u0A39]|[\u0A59-\u0A5C]|[\u0A5E-\u0A5E]|[\u0A72-\u0A74]|[\u0A85-\u0A8B]|[\u0A8D-\u0A8D]|[\u0A8F-\u0A91]|[\u0A93-\u0AA8]|[\u0AAA-\u0AB0]|[\u0AB2-\u0AB3]|[\u0AB5-\u0AB9]|[\u0ABD-\u0ABD]|[\u0AD0-\u0AD0]|[\u0AE0-\u0AE0]|[\u0B05-\u0B0C]|[\u0B0F-\u0B10]|[\u0B13-\u0B28]|[\u0B2A-\u0B30]|[\u0B32-\u0B33]|[\u0B36-\u0B39]|[\u0B3D-\u0B3D]|[\u0B5C-\u0B5D]|[\u0B5F-\u0B61]|[\u0B85-\u0B8A]|[\u0B8E-\u0B90]|[\u0B92-\u0B95]|[\u0B99-\u0B9A]|[\u0B9C-\u0B9C]|[\u0B9E-\u0B9F]|[\u0BA3-\u0BA4]|[\u0BA8-\u0BAA]|[\u0BAE-\u0BB5]|[\u0BB7-\u0BB9]|[\u0C05-\u0C0C]|[\u0C0E-\u0C10]|[\u0C12-\u0C28]|[\u0C2A-\u0C33]|[\u0C35-\u0C39]|[\u0C60-\u0C61]|[\u0C85-\u0C8C]|[\u0C8E-\u0C90]|[\u0C92-\u0CA8]|[\u0CAA-\u0CB3]|[\u0CB5-\u0CB9]|[\u0CDE-\u0CDE]|[\u0CE0-\u0CE1]|[\u0D05-\u0D0C]|[\u0D0E-\u0D10]|[\u0D12-\u0D28]|[\u0D2A-\u0D39]|[\u0D60-\u0D61]|[\u0E01-\u0E30]|[\u0E32-\u0E33]|[\u0E40-\u0E45]|[\u0E81-\u0E82]|[\u0E84-\u0E84]|[\u0E87-\u0E88]|[\u0E8A-\u0E8A]|[\u0E8D-\u0E8D]|[\u0E94-\u0E97]|[\u0E99-\u0E9F]|[\u0EA1-\u0EA3]|[\u0EA5-\u0EA5]|[\u0EA7-\u0EA7]|[\u0EAA-\u0EAB]|[\u0EAD-\u0EB0]|[\u0EB2-\u0EB3]|[\u0EBD-\u0EBD]|[\u0EC0-\u0EC4]|[\u0EDC-\u0EDD]|[\u0F00-\u0F00]|[\u0F40-\u0F47]|[\u0F49-\u0F69]|[\u0F88-\u0F8B]|[\u1100-\u1159]|[\u115F-\u11A2]|[\u11A8-\u11F9]|[\u2135-\u2138]|[\u3006-\u3006]|[\u3041-\u3094]|[\u30A1-\u30FA]|[\u3105-\u312C]|[\u3131-\u318E]|[\u4E00-\u9FA5]|[\uAC00-\uD7A3]|[\uF900-\uFA2D]|[\uFB1F-\uFB28]|[\uFB2A-\uFB36]|[\uFB38-\uFB3C]|[\uFB3E-\uFB3E]|[\uFB40-\uFB41]|[\uFB43-\uFB44]|[\uFB46-\uFBB1]|[\uFBD3-\uFD3D]|[\uFD50-\uFD8F]|[\uFD92-\uFDC7]|[\uFDF0-\uFDFB]|[\uFE70-\uFE72]|[\uFE74-\uFE74]|[\uFE76-\uFEFC]|[\uFF66-\uFF6F]|[\uFF71-\uFF9D]|[\uFFA0-\uFFBE]|[\uFFC2-\uFFC7]|[\uFFCA-\uFFCF]|[\uFFD2-\uFFD7]|[\uFFDA-\uFFDC]/, Nl:/[\u2160-\u2182]|[\u3007-\u3007]|[\u3021-\u3029]/,Nd:/[\u0030-\u0039]|[\u0660-\u0669]|[\u06F0-\u06F9]|[\u0966-\u096F]|[\u09E6-\u09EF]|[\u0A66-\u0A6F]|[\u0AE6-\u0AEF]|[\u0B66-\u0B6F]|[\u0BE7-\u0BEF]|[\u0C66-\u0C6F]|[\u0CE6-\u0CEF]|[\u0D66-\u0D6F]|[\u0E50-\u0E59]|[\u0ED0-\u0ED9]|[\u0F20-\u0F29]|[\uFF10-\uFF19]/,Mn:/[\u0300-\u0345]|[\u0360-\u0361]|[\u0483-\u0486]|[\u0591-\u05A1]|[\u05A3-\u05B9]|[\u05BB-\u05BD]|[\u05BF-\u05BF]|[\u05C1-\u05C2]|[\u05C4-\u05C4]|[\u064B-\u0652]|[\u0670-\u0670]|[\u06D6-\u06DC]|[\u06DF-\u06E4]|[\u06E7-\u06E8]|[\u06EA-\u06ED]|[\u0901-\u0902]|[\u093C-\u093C]|[\u0941-\u0948]|[\u094D-\u094D]|[\u0951-\u0954]|[\u0962-\u0963]|[\u0981-\u0981]|[\u09BC-\u09BC]|[\u09C1-\u09C4]|[\u09CD-\u09CD]|[\u09E2-\u09E3]|[\u0A02-\u0A02]|[\u0A3C-\u0A3C]|[\u0A41-\u0A42]|[\u0A47-\u0A48]|[\u0A4B-\u0A4D]|[\u0A70-\u0A71]|[\u0A81-\u0A82]|[\u0ABC-\u0ABC]|[\u0AC1-\u0AC5]|[\u0AC7-\u0AC8]|[\u0ACD-\u0ACD]|[\u0B01-\u0B01]|[\u0B3C-\u0B3C]|[\u0B3F-\u0B3F]|[\u0B41-\u0B43]|[\u0B4D-\u0B4D]|[\u0B56-\u0B56]|[\u0B82-\u0B82]|[\u0BC0-\u0BC0]|[\u0BCD-\u0BCD]|[\u0C3E-\u0C40]|[\u0C46-\u0C48]|[\u0C4A-\u0C4D]|[\u0C55-\u0C56]|[\u0CBF-\u0CBF]|[\u0CC6-\u0CC6]|[\u0CCC-\u0CCD]|[\u0D41-\u0D43]|[\u0D4D-\u0D4D]|[\u0E31-\u0E31]|[\u0E34-\u0E3A]|[\u0E47-\u0E4E]|[\u0EB1-\u0EB1]|[\u0EB4-\u0EB9]|[\u0EBB-\u0EBC]|[\u0EC8-\u0ECD]|[\u0F18-\u0F19]|[\u0F35-\u0F35]|[\u0F37-\u0F37]|[\u0F39-\u0F39]|[\u0F71-\u0F7E]|[\u0F80-\u0F84]|[\u0F86-\u0F87]|[\u0F90-\u0F95]|[\u0F97-\u0F97]|[\u0F99-\u0FAD]|[\u0FB1-\u0FB7]|[\u0FB9-\u0FB9]|[\u20D0-\u20DC]|[\u20E1-\u20E1]|[\u302A-\u302F]|[\u3099-\u309A]|[\uFB1E-\uFB1E]|[\uFE20-\uFE23]/,Mc:/[\u0903-\u0903]|[\u093E-\u0940]|[\u0949-\u094C]|[\u0982-\u0983]|[\u09BE-\u09C0]|[\u09C7-\u09C8]|[\u09CB-\u09CC]|[\u09D7-\u09D7]|[\u0A3E-\u0A40]|[\u0A83-\u0A83]|[\u0ABE-\u0AC0]|[\u0AC9-\u0AC9]|[\u0ACB-\u0ACC]|[\u0B02-\u0B03]|[\u0B3E-\u0B3E]|[\u0B40-\u0B40]|[\u0B47-\u0B48]|[\u0B4B-\u0B4C]|[\u0B57-\u0B57]|[\u0B83-\u0B83]|[\u0BBE-\u0BBF]|[\u0BC1-\u0BC2]|[\u0BC6-\u0BC8]|[\u0BCA-\u0BCC]|[\u0BD7-\u0BD7]|[\u0C01-\u0C03]|[\u0C41-\u0C44]|[\u0C82-\u0C83]|[\u0CBE-\u0CBE]|[\u0CC0-\u0CC4]|[\u0CC7-\u0CC8]|[\u0CCA-\u0CCB]|[\u0CD5-\u0CD6]|[\u0D02-\u0D03]|[\u0D3E-\u0D40]|[\u0D46-\u0D48]|[\u0D4A-\u0D4C]|[\u0D57-\u0D57]|[\u0F3E-\u0F3F]|[\u0F7F-\u0F7F]/,Pc:/[\u005F-\u005F]|[\u203F-\u2040]|[\u30FB-\u30FB]|[\uFE33-\uFE34]|[\uFE4D-\uFE4F]|[\uFF3F-\uFF3F]|[\uFF65-\uFF65]/,Zs:/[\u2000-\u200B]|[\u3000-\u3000]/,L:/[\u0041-\u005A]|[\u00C0-\u00D6]|[\u00D8-\u00DE]|[\u0100-\u0100]|[\u0102-\u0102]|[\u0104-\u0104]|[\u0106-\u0106]|[\u0108-\u0108]|[\u010A-\u010A]|[\u010C-\u010C]|[\u010E-\u010E]|[\u0110-\u0110]|[\u0112-\u0112]|[\u0114-\u0114]|[\u0116-\u0116]|[\u0118-\u0118]|[\u011A-\u011A]|[\u011C-\u011C]|[\u011E-\u011E]|[\u0120-\u0120]|[\u0122-\u0122]|[\u0124-\u0124]|[\u0126-\u0126]|[\u0128-\u0128]|[\u012A-\u012A]|[\u012C-\u012C]|[\u012E-\u012E]|[\u0130-\u0130]|[\u0132-\u0132]|[\u0134-\u0134]|[\u0136-\u0136]|[\u0139-\u0139]|[\u013B-\u013B]|[\u013D-\u013D]|[\u013F-\u013F]|[\u0141-\u0141]|[\u0143-\u0143]|[\u0145-\u0145]|[\u0147-\u0147]|[\u014A-\u014A]|[\u014C-\u014C]|[\u014E-\u014E]|[\u0150-\u0150]|[\u0152-\u0152]|[\u0154-\u0154]|[\u0156-\u0156]|[\u0158-\u0158]|[\u015A-\u015A]|[\u015C-\u015C]|[\u015E-\u015E]|[\u0160-\u0160]|[\u0162-\u0162]|[\u0164-\u0164]|[\u0166-\u0166]|[\u0168-\u0168]|[\u016A-\u016A]|[\u016C-\u016C]|[\u016E-\u016E]|[\u0170-\u0170]|[\u0172-\u0172]|[\u0174-\u0174]|[\u0176-\u0176]|[\u0178-\u0179]|[\u017B-\u017B]|[\u017D-\u017D]|[\u0181-\u0182]|[\u0184-\u0184]|[\u0186-\u0187]|[\u0189-\u018B]|[\u018E-\u0191]|[\u0193-\u0194]|[\u0196-\u0198]|[\u019C-\u019D]|[\u019F-\u01A0]|[\u01A2-\u01A2]|[\u01A4-\u01A4]|[\u01A6-\u01A7]|[\u01A9-\u01A9]|[\u01AC-\u01AC]|[\u01AE-\u01AF]|[\u01B1-\u01B3]|[\u01B5-\u01B5]|[\u01B7-\u01B8]|[\u01BC-\u01BC]|[\u01C4-\u01C4]|[\u01C7-\u01C7]|[\u01CA-\u01CA]|[\u01CD-\u01CD]|[\u01CF-\u01CF]|[\u01D1-\u01D1]|[\u01D3-\u01D3]|[\u01D5-\u01D5]|[\u01D7-\u01D7]|[\u01D9-\u01D9]|[\u01DB-\u01DB]|[\u01DE-\u01DE]|[\u01E0-\u01E0]|[\u01E2-\u01E2]|[\u01E4-\u01E4]|[\u01E6-\u01E6]|[\u01E8-\u01E8]|[\u01EA-\u01EA]|[\u01EC-\u01EC]|[\u01EE-\u01EE]|[\u01F1-\u01F1]|[\u01F4-\u01F4]|[\u01FA-\u01FA]|[\u01FC-\u01FC]|[\u01FE-\u01FE]|[\u0200-\u0200]|[\u0202-\u0202]|[\u0204-\u0204]|[\u0206-\u0206]|[\u0208-\u0208]|[\u020A-\u020A]|[\u020C-\u020C]|[\u020E-\u020E]|[\u0210-\u0210]|[\u0212-\u0212]|[\u0214-\u0214]|[\u0216-\u0216]|[\u0386-\u0386]|[\u0388-\u038A]|[\u038C-\u038C]|[\u038E-\u038F]|[\u0391-\u03A1]|[\u03A3-\u03AB]|[\u03D2-\u03D4]|[\u03DA-\u03DA]|[\u03DC-\u03DC]|[\u03DE-\u03DE]|[\u03E0-\u03E0]|[\u03E2-\u03E2]|[\u03E4-\u03E4]|[\u03E6-\u03E6]|[\u03E8-\u03E8]|[\u03EA-\u03EA]|[\u03EC-\u03EC]|[\u03EE-\u03EE]|[\u0401-\u040C]|[\u040E-\u042F]|[\u0460-\u0460]|[\u0462-\u0462]|[\u0464-\u0464]|[\u0466-\u0466]|[\u0468-\u0468]|[\u046A-\u046A]|[\u046C-\u046C]|[\u046E-\u046E]|[\u0470-\u0470]|[\u0472-\u0472]|[\u0474-\u0474]|[\u0476-\u0476]|[\u0478-\u0478]|[\u047A-\u047A]|[\u047C-\u047C]|[\u047E-\u047E]|[\u0480-\u0480]|[\u0490-\u0490]|[\u0492-\u0492]|[\u0494-\u0494]|[\u0496-\u0496]|[\u0498-\u0498]|[\u049A-\u049A]|[\u049C-\u049C]|[\u049E-\u049E]|[\u04A0-\u04A0]|[\u04A2-\u04A2]|[\u04A4-\u04A4]|[\u04A6-\u04A6]|[\u04A8-\u04A8]|[\u04AA-\u04AA]|[\u04AC-\u04AC]|[\u04AE-\u04AE]|[\u04B0-\u04B0]|[\u04B2-\u04B2]|[\u04B4-\u04B4]|[\u04B6-\u04B6]|[\u04B8-\u04B8]|[\u04BA-\u04BA]|[\u04BC-\u04BC]|[\u04BE-\u04BE]|[\u04C1-\u04C1]|[\u04C3-\u04C3]|[\u04C7-\u04C7]|[\u04CB-\u04CB]|[\u04D0-\u04D0]|[\u04D2-\u04D2]|[\u04D4-\u04D4]|[\u04D6-\u04D6]|[\u04D8-\u04D8]|[\u04DA-\u04DA]|[\u04DC-\u04DC]|[\u04DE-\u04DE]|[\u04E0-\u04E0]|[\u04E2-\u04E2]|[\u04E4-\u04E4]|[\u04E6-\u04E6]|[\u04E8-\u04E8]|[\u04EA-\u04EA]|[\u04EE-\u04EE]|[\u04F0-\u04F0]|[\u04F2-\u04F2]|[\u04F4-\u04F4]|[\u04F8-\u04F8]|[\u0531-\u0556]|[\u10A0-\u10C5]|[\u1E00-\u1E00]|[\u1E02-\u1E02]|[\u1E04-\u1E04]|[\u1E06-\u1E06]|[\u1E08-\u1E08]|[\u1E0A-\u1E0A]|[\u1E0C-\u1E0C]|[\u1E0E-\u1E0E]|[\u1E10-\u1E10]|[\u1E12-\u1E12]|[\u1E14-\u1E14]|[\u1E16-\u1E16]|[\u1E18-\u1E18]|[\u1E1A-\u1E1A]|[\u1E1C-\u1E1C]|[\u1E1E-\u1E1E]|[\u1E20-\u1E20]|[\u1E22-\u1E22]|[\u1E24-\u1E24]|[\u1E26-\u1E26]|[\u1E28-\u1E28]|[\u1E2A-\u1E2A]|[\u1E2C-\u1E2C]|[\u1E2E-\u1E2E]|[\u1E30-\u1E30]|[\u1E32-\u1E32]|[\u1E34-\u1E34]|[\u1E36-\u1E36]|[\u1E38-\u1E38]|[\u1E3A-\u1E3A]|[\u1E3C-\u1E3C]|[\u1E3E-\u1E3E]|[\u1E40-\u1E40]|[\u1E42-\u1E42]|[\u1E44-\u1E44]|[\u1E46-\u1E46]|[\u1E48-\u1E48]|[\u1E4A-\u1E4A]|[\u1E4C-\u1E4C]|[\u1E4E-\u1E4E]|[\u1E50-\u1E50]|[\u1E52-\u1E52]|[\u1E54-\u1E54]|[\u1E56-\u1E56]|[\u1E58-\u1E58]|[\u1E5A-\u1E5A]|[\u1E5C-\u1E5C]|[\u1E5E-\u1E5E]|[\u1E60-\u1E60]|[\u1E62-\u1E62]|[\u1E64-\u1E64]|[\u1E66-\u1E66]|[\u1E68-\u1E68]|[\u1E6A-\u1E6A]|[\u1E6C-\u1E6C]|[\u1E6E-\u1E6E]|[\u1E70-\u1E70]|[\u1E72-\u1E72]|[\u1E74-\u1E74]|[\u1E76-\u1E76]|[\u1E78-\u1E78]|[\u1E7A-\u1E7A]|[\u1E7C-\u1E7C]|[\u1E7E-\u1E7E]|[\u1E80-\u1E80]|[\u1E82-\u1E82]|[\u1E84-\u1E84]|[\u1E86-\u1E86]|[\u1E88-\u1E88]|[\u1E8A-\u1E8A]|[\u1E8C-\u1E8C]|[\u1E8E-\u1E8E]|[\u1E90-\u1E90]|[\u1E92-\u1E92]|[\u1E94-\u1E94]|[\u1EA0-\u1EA0]|[\u1EA2-\u1EA2]|[\u1EA4-\u1EA4]|[\u1EA6-\u1EA6]|[\u1EA8-\u1EA8]|[\u1EAA-\u1EAA]|[\u1EAC-\u1EAC]|[\u1EAE-\u1EAE]|[\u1EB0-\u1EB0]|[\u1EB2-\u1EB2]|[\u1EB4-\u1EB4]|[\u1EB6-\u1EB6]|[\u1EB8-\u1EB8]|[\u1EBA-\u1EBA]|[\u1EBC-\u1EBC]|[\u1EBE-\u1EBE]|[\u1EC0-\u1EC0]|[\u1EC2-\u1EC2]|[\u1EC4-\u1EC4]|[\u1EC6-\u1EC6]|[\u1EC8-\u1EC8]|[\u1ECA-\u1ECA]|[\u1ECC-\u1ECC]|[\u1ECE-\u1ECE]|[\u1ED0-\u1ED0]|[\u1ED2-\u1ED2]|[\u1ED4-\u1ED4]|[\u1ED6-\u1ED6]|[\u1ED8-\u1ED8]|[\u1EDA-\u1EDA]|[\u1EDC-\u1EDC]|[\u1EDE-\u1EDE]|[\u1EE0-\u1EE0]|[\u1EE2-\u1EE2]|[\u1EE4-\u1EE4]|[\u1EE6-\u1EE6]|[\u1EE8-\u1EE8]|[\u1EEA-\u1EEA]|[\u1EEC-\u1EEC]|[\u1EEE-\u1EEE]|[\u1EF0-\u1EF0]|[\u1EF2-\u1EF2]|[\u1EF4-\u1EF4]|[\u1EF6-\u1EF6]|[\u1EF8-\u1EF8]|[\u1F08-\u1F0F]|[\u1F18-\u1F1D]|[\u1F28-\u1F2F]|[\u1F38-\u1F3F]|[\u1F48-\u1F4D]|[\u1F59-\u1F59]|[\u1F5B-\u1F5B]|[\u1F5D-\u1F5D]|[\u1F5F-\u1F5F]|[\u1F68-\u1F6F]|[\u1F88-\u1F8F]|[\u1F98-\u1F9F]|[\u1FA8-\u1FAF]|[\u1FB8-\u1FBC]|[\u1FC8-\u1FCC]|[\u1FD8-\u1FDB]|[\u1FE8-\u1FEC]|[\u1FF8-\u1FFC]|[\u2102-\u2102]|[\u2107-\u2107]|[\u210B-\u210D]|[\u2110-\u2112]|[\u2115-\u2115]|[\u2119-\u211D]|[\u2124-\u2124]|[\u2126-\u2126]|[\u2128-\u2128]|[\u212A-\u212D]|[\u2130-\u2131]|[\u2133-\u2133]|[\uFF21-\uFF3A]|[\u0061-\u007A]|[\u00AA-\u00AA]|[\u00B5-\u00B5]|[\u00BA-\u00BA]|[\u00DF-\u00F6]|[\u00F8-\u00FF]|[\u0101-\u0101]|[\u0103-\u0103]|[\u0105-\u0105]|[\u0107-\u0107]|[\u0109-\u0109]|[\u010B-\u010B]|[\u010D-\u010D]|[\u010F-\u010F]|[\u0111-\u0111]|[\u0113-\u0113]|[\u0115-\u0115]|[\u0117-\u0117]|[\u0119-\u0119]|[\u011B-\u011B]|[\u011D-\u011D]|[\u011F-\u011F]|[\u0121-\u0121]|[\u0123-\u0123]|[\u0125-\u0125]|[\u0127-\u0127]|[\u0129-\u0129]|[\u012B-\u012B]|[\u012D-\u012D]|[\u012F-\u012F]|[\u0131-\u0131]|[\u0133-\u0133]|[\u0135-\u0135]|[\u0137-\u0138]|[\u013A-\u013A]|[\u013C-\u013C]|[\u013E-\u013E]|[\u0140-\u0140]|[\u0142-\u0142]|[\u0144-\u0144]|[\u0146-\u0146]|[\u0148-\u0149]|[\u014B-\u014B]|[\u014D-\u014D]|[\u014F-\u014F]|[\u0151-\u0151]|[\u0153-\u0153]|[\u0155-\u0155]|[\u0157-\u0157]|[\u0159-\u0159]|[\u015B-\u015B]|[\u015D-\u015D]|[\u015F-\u015F]|[\u0161-\u0161]|[\u0163-\u0163]|[\u0165-\u0165]|[\u0167-\u0167]|[\u0169-\u0169]|[\u016B-\u016B]|[\u016D-\u016D]|[\u016F-\u016F]|[\u0171-\u0171]|[\u0173-\u0173]|[\u0175-\u0175]|[\u0177-\u0177]|[\u017A-\u017A]|[\u017C-\u017C]|[\u017E-\u0180]|[\u0183-\u0183]|[\u0185-\u0185]|[\u0188-\u0188]|[\u018C-\u018D]|[\u0192-\u0192]|[\u0195-\u0195]|[\u0199-\u019B]|[\u019E-\u019E]|[\u01A1-\u01A1]|[\u01A3-\u01A3]|[\u01A5-\u01A5]|[\u01A8-\u01A8]|[\u01AB-\u01AB]|[\u01AD-\u01AD]|[\u01B0-\u01B0]|[\u01B4-\u01B4]|[\u01B6-\u01B6]|[\u01B9-\u01BA]|[\u01BD-\u01BD]|[\u01C6-\u01C6]|[\u01C9-\u01C9]|[\u01CC-\u01CC]|[\u01CE-\u01CE]|[\u01D0-\u01D0]|[\u01D2-\u01D2]|[\u01D4-\u01D4]|[\u01D6-\u01D6]|[\u01D8-\u01D8]|[\u01DA-\u01DA]|[\u01DC-\u01DD]|[\u01DF-\u01DF]|[\u01E1-\u01E1]|[\u01E3-\u01E3]|[\u01E5-\u01E5]|[\u01E7-\u01E7]|[\u01E9-\u01E9]|[\u01EB-\u01EB]|[\u01ED-\u01ED]|[\u01EF-\u01F0]|[\u01F3-\u01F3]|[\u01F5-\u01F5]|[\u01FB-\u01FB]|[\u01FD-\u01FD]|[\u01FF-\u01FF]|[\u0201-\u0201]|[\u0203-\u0203]|[\u0205-\u0205]|[\u0207-\u0207]|[\u0209-\u0209]|[\u020B-\u020B]|[\u020D-\u020D]|[\u020F-\u020F]|[\u0211-\u0211]|[\u0213-\u0213]|[\u0215-\u0215]|[\u0217-\u0217]|[\u0250-\u02A8]|[\u0390-\u0390]|[\u03AC-\u03CE]|[\u03D0-\u03D1]|[\u03D5-\u03D6]|[\u03E3-\u03E3]|[\u03E5-\u03E5]|[\u03E7-\u03E7]|[\u03E9-\u03E9]|[\u03EB-\u03EB]|[\u03ED-\u03ED]|[\u03EF-\u03F2]|[\u0430-\u044F]|[\u0451-\u045C]|[\u045E-\u045F]|[\u0461-\u0461]|[\u0463-\u0463]|[\u0465-\u0465]|[\u0467-\u0467]|[\u0469-\u0469]|[\u046B-\u046B]|[\u046D-\u046D]|[\u046F-\u046F]|[\u0471-\u0471]|[\u0473-\u0473]|[\u0475-\u0475]|[\u0477-\u0477]|[\u0479-\u0479]|[\u047B-\u047B]|[\u047D-\u047D]|[\u047F-\u047F]|[\u0481-\u0481]|[\u0491-\u0491]|[\u0493-\u0493]|[\u0495-\u0495]|[\u0497-\u0497]|[\u0499-\u0499]|[\u049B-\u049B]|[\u049D-\u049D]|[\u049F-\u049F]|[\u04A1-\u04A1]|[\u04A3-\u04A3]|[\u04A5-\u04A5]|[\u04A7-\u04A7]|[\u04A9-\u04A9]|[\u04AB-\u04AB]|[\u04AD-\u04AD]|[\u04AF-\u04AF]|[\u04B1-\u04B1]|[\u04B3-\u04B3]|[\u04B5-\u04B5]|[\u04B7-\u04B7]|[\u04B9-\u04B9]|[\u04BB-\u04BB]|[\u04BD-\u04BD]|[\u04BF-\u04BF]|[\u04C2-\u04C2]|[\u04C4-\u04C4]|[\u04C8-\u04C8]|[\u04CC-\u04CC]|[\u04D1-\u04D1]|[\u04D3-\u04D3]|[\u04D5-\u04D5]|[\u04D7-\u04D7]|[\u04D9-\u04D9]|[\u04DB-\u04DB]|[\u04DD-\u04DD]|[\u04DF-\u04DF]|[\u04E1-\u04E1]|[\u04E3-\u04E3]|[\u04E5-\u04E5]|[\u04E7-\u04E7]|[\u04E9-\u04E9]|[\u04EB-\u04EB]|[\u04EF-\u04EF]|[\u04F1-\u04F1]|[\u04F3-\u04F3]|[\u04F5-\u04F5]|[\u04F9-\u04F9]|[\u0561-\u0587]|[\u10D0-\u10F6]|[\u1E01-\u1E01]|[\u1E03-\u1E03]|[\u1E05-\u1E05]|[\u1E07-\u1E07]|[\u1E09-\u1E09]|[\u1E0B-\u1E0B]|[\u1E0D-\u1E0D]|[\u1E0F-\u1E0F]|[\u1E11-\u1E11]|[\u1E13-\u1E13]|[\u1E15-\u1E15]|[\u1E17-\u1E17]|[\u1E19-\u1E19]|[\u1E1B-\u1E1B]|[\u1E1D-\u1E1D]|[\u1E1F-\u1E1F]|[\u1E21-\u1E21]|[\u1E23-\u1E23]|[\u1E25-\u1E25]|[\u1E27-\u1E27]|[\u1E29-\u1E29]|[\u1E2B-\u1E2B]|[\u1E2D-\u1E2D]|[\u1E2F-\u1E2F]|[\u1E31-\u1E31]|[\u1E33-\u1E33]|[\u1E35-\u1E35]|[\u1E37-\u1E37]|[\u1E39-\u1E39]|[\u1E3B-\u1E3B]|[\u1E3D-\u1E3D]|[\u1E3F-\u1E3F]|[\u1E41-\u1E41]|[\u1E43-\u1E43]|[\u1E45-\u1E45]|[\u1E47-\u1E47]|[\u1E49-\u1E49]|[\u1E4B-\u1E4B]|[\u1E4D-\u1E4D]|[\u1E4F-\u1E4F]|[\u1E51-\u1E51]|[\u1E53-\u1E53]|[\u1E55-\u1E55]|[\u1E57-\u1E57]|[\u1E59-\u1E59]|[\u1E5B-\u1E5B]|[\u1E5D-\u1E5D]|[\u1E5F-\u1E5F]|[\u1E61-\u1E61]|[\u1E63-\u1E63]|[\u1E65-\u1E65]|[\u1E67-\u1E67]|[\u1E69-\u1E69]|[\u1E6B-\u1E6B]|[\u1E6D-\u1E6D]|[\u1E6F-\u1E6F]|[\u1E71-\u1E71]|[\u1E73-\u1E73]|[\u1E75-\u1E75]|[\u1E77-\u1E77]|[\u1E79-\u1E79]|[\u1E7B-\u1E7B]|[\u1E7D-\u1E7D]|[\u1E7F-\u1E7F]|[\u1E81-\u1E81]|[\u1E83-\u1E83]|[\u1E85-\u1E85]|[\u1E87-\u1E87]|[\u1E89-\u1E89]|[\u1E8B-\u1E8B]|[\u1E8D-\u1E8D]|[\u1E8F-\u1E8F]|[\u1E91-\u1E91]|[\u1E93-\u1E93]|[\u1E95-\u1E9B]|[\u1EA1-\u1EA1]|[\u1EA3-\u1EA3]|[\u1EA5-\u1EA5]|[\u1EA7-\u1EA7]|[\u1EA9-\u1EA9]|[\u1EAB-\u1EAB]|[\u1EAD-\u1EAD]|[\u1EAF-\u1EAF]|[\u1EB1-\u1EB1]|[\u1EB3-\u1EB3]|[\u1EB5-\u1EB5]|[\u1EB7-\u1EB7]|[\u1EB9-\u1EB9]|[\u1EBB-\u1EBB]|[\u1EBD-\u1EBD]|[\u1EBF-\u1EBF]|[\u1EC1-\u1EC1]|[\u1EC3-\u1EC3]|[\u1EC5-\u1EC5]|[\u1EC7-\u1EC7]|[\u1EC9-\u1EC9]|[\u1ECB-\u1ECB]|[\u1ECD-\u1ECD]|[\u1ECF-\u1ECF]|[\u1ED1-\u1ED1]|[\u1ED3-\u1ED3]|[\u1ED5-\u1ED5]|[\u1ED7-\u1ED7]|[\u1ED9-\u1ED9]|[\u1EDB-\u1EDB]|[\u1EDD-\u1EDD]|[\u1EDF-\u1EDF]|[\u1EE1-\u1EE1]|[\u1EE3-\u1EE3]|[\u1EE5-\u1EE5]|[\u1EE7-\u1EE7]|[\u1EE9-\u1EE9]|[\u1EEB-\u1EEB]|[\u1EED-\u1EED]|[\u1EEF-\u1EEF]|[\u1EF1-\u1EF1]|[\u1EF3-\u1EF3]|[\u1EF5-\u1EF5]|[\u1EF7-\u1EF7]|[\u1EF9-\u1EF9]|[\u1F00-\u1F07]|[\u1F10-\u1F15]|[\u1F20-\u1F27]|[\u1F30-\u1F37]|[\u1F40-\u1F45]|[\u1F50-\u1F57]|[\u1F60-\u1F67]|[\u1F70-\u1F7D]|[\u1F80-\u1F87]|[\u1F90-\u1F97]|[\u1FA0-\u1FA7]|[\u1FB0-\u1FB4]|[\u1FB6-\u1FB7]|[\u1FBE-\u1FBE]|[\u1FC2-\u1FC4]|[\u1FC6-\u1FC7]|[\u1FD0-\u1FD3]|[\u1FD6-\u1FD7]|[\u1FE0-\u1FE7]|[\u1FF2-\u1FF4]|[\u1FF6-\u1FF7]|[\u207F-\u207F]|[\u210A-\u210A]|[\u210E-\u210F]|[\u2113-\u2113]|[\u2118-\u2118]|[\u212E-\u212F]|[\u2134-\u2134]|[\uFB00-\uFB06]|[\uFB13-\uFB17]|[\uFF41-\uFF5A]|[\u01C5-\u01C5]|[\u01C8-\u01C8]|[\u01CB-\u01CB]|[\u01F2-\u01F2]|[\u02B0-\u02B8]|[\u02BB-\u02C1]|[\u02D0-\u02D1]|[\u02E0-\u02E4]|[\u037A-\u037A]|[\u0559-\u0559]|[\u0640-\u0640]|[\u06E5-\u06E6]|[\u0E46-\u0E46]|[\u0EC6-\u0EC6]|[\u3005-\u3005]|[\u3031-\u3035]|[\u309D-\u309E]|[\u30FC-\u30FE]|[\uFF70-\uFF70]|[\uFF9E-\uFF9F]|[\u01AA-\u01AA]|[\u01BB-\u01BB]|[\u01BE-\u01C3]|[\u03F3-\u03F3]|[\u04C0-\u04C0]|[\u05D0-\u05EA]|[\u05F0-\u05F2]|[\u0621-\u063A]|[\u0641-\u064A]|[\u0671-\u06B7]|[\u06BA-\u06BE]|[\u06C0-\u06CE]|[\u06D0-\u06D3]|[\u06D5-\u06D5]|[\u0905-\u0939]|[\u093D-\u093D]|[\u0950-\u0950]|[\u0958-\u0961]|[\u0985-\u098C]|[\u098F-\u0990]|[\u0993-\u09A8]|[\u09AA-\u09B0]|[\u09B2-\u09B2]|[\u09B6-\u09B9]|[\u09DC-\u09DD]|[\u09DF-\u09E1]|[\u09F0-\u09F1]|[\u0A05-\u0A0A]|[\u0A0F-\u0A10]|[\u0A13-\u0A28]|[\u0A2A-\u0A30]|[\u0A32-\u0A33]|[\u0A35-\u0A36]|[\u0A38-\u0A39]|[\u0A59-\u0A5C]|[\u0A5E-\u0A5E]|[\u0A72-\u0A74]|[\u0A85-\u0A8B]|[\u0A8D-\u0A8D]|[\u0A8F-\u0A91]|[\u0A93-\u0AA8]|[\u0AAA-\u0AB0]|[\u0AB2-\u0AB3]|[\u0AB5-\u0AB9]|[\u0ABD-\u0ABD]|[\u0AD0-\u0AD0]|[\u0AE0-\u0AE0]|[\u0B05-\u0B0C]|[\u0B0F-\u0B10]|[\u0B13-\u0B28]|[\u0B2A-\u0B30]|[\u0B32-\u0B33]|[\u0B36-\u0B39]|[\u0B3D-\u0B3D]|[\u0B5C-\u0B5D]|[\u0B5F-\u0B61]|[\u0B85-\u0B8A]|[\u0B8E-\u0B90]|[\u0B92-\u0B95]|[\u0B99-\u0B9A]|[\u0B9C-\u0B9C]|[\u0B9E-\u0B9F]|[\u0BA3-\u0BA4]|[\u0BA8-\u0BAA]|[\u0BAE-\u0BB5]|[\u0BB7-\u0BB9]|[\u0C05-\u0C0C]|[\u0C0E-\u0C10]|[\u0C12-\u0C28]|[\u0C2A-\u0C33]|[\u0C35-\u0C39]|[\u0C60-\u0C61]|[\u0C85-\u0C8C]|[\u0C8E-\u0C90]|[\u0C92-\u0CA8]|[\u0CAA-\u0CB3]|[\u0CB5-\u0CB9]|[\u0CDE-\u0CDE]|[\u0CE0-\u0CE1]|[\u0D05-\u0D0C]|[\u0D0E-\u0D10]|[\u0D12-\u0D28]|[\u0D2A-\u0D39]|[\u0D60-\u0D61]|[\u0E01-\u0E30]|[\u0E32-\u0E33]|[\u0E40-\u0E45]|[\u0E81-\u0E82]|[\u0E84-\u0E84]|[\u0E87-\u0E88]|[\u0E8A-\u0E8A]|[\u0E8D-\u0E8D]|[\u0E94-\u0E97]|[\u0E99-\u0E9F]|[\u0EA1-\u0EA3]|[\u0EA5-\u0EA5]|[\u0EA7-\u0EA7]|[\u0EAA-\u0EAB]|[\u0EAD-\u0EB0]|[\u0EB2-\u0EB3]|[\u0EBD-\u0EBD]|[\u0EC0-\u0EC4]|[\u0EDC-\u0EDD]|[\u0F00-\u0F00]|[\u0F40-\u0F47]|[\u0F49-\u0F69]|[\u0F88-\u0F8B]|[\u1100-\u1159]|[\u115F-\u11A2]|[\u11A8-\u11F9]|[\u2135-\u2138]|[\u3006-\u3006]|[\u3041-\u3094]|[\u30A1-\u30FA]|[\u3105-\u312C]|[\u3131-\u318E]|[\u4E00-\u9FA5]|[\uAC00-\uD7A3]|[\uF900-\uFA2D]|[\uFB1F-\uFB28]|[\uFB2A-\uFB36]|[\uFB38-\uFB3C]|[\uFB3E-\uFB3E]|[\uFB40-\uFB41]|[\uFB43-\uFB44]|[\uFB46-\uFBB1]|[\uFBD3-\uFD3D]|[\uFD50-\uFD8F]|[\uFD92-\uFDC7]|[\uFDF0-\uFDFB]|[\uFE70-\uFE72]|[\uFE74-\uFE74]|[\uFE76-\uFEFC]|[\uFF66-\uFF6F]|[\uFF71-\uFF9D]|[\uFFA0-\uFFBE]|[\uFFC2-\uFFC7]|[\uFFCA-\uFFCF]|[\uFFD2-\uFFD7]|[\uFFDA-\uFFDC]/,Ltmo:/[\u01C5-\u01C5]|[\u01C8-\u01C8]|[\u01CB-\u01CB]|[\u01F2-\u01F2][\u02B0-\u02B8]|[\u02BB-\u02C1]|[\u02D0-\u02D1]|[\u02E0-\u02E4]|[\u037A-\u037A]|[\u0559-\u0559]|[\u0640-\u0640]|[\u06E5-\u06E6]|[\u0E46-\u0E46]|[\u0EC6-\u0EC6]|[\u3005-\u3005]|[\u3031-\u3035]|[\u309D-\u309E]|[\u30FC-\u30FE]|[\uFF70-\uFF70]|[\uFF9E-\uFF9F][\u01AA-\u01AA]|[\u01BB-\u01BB]|[\u01BE-\u01C3]|[\u03F3-\u03F3]|[\u04C0-\u04C0]|[\u05D0-\u05EA]|[\u05F0-\u05F2]|[\u0621-\u063A]|[\u0641-\u064A]|[\u0671-\u06B7]|[\u06BA-\u06BE]|[\u06C0-\u06CE]|[\u06D0-\u06D3]|[\u06D5-\u06D5]|[\u0905-\u0939]|[\u093D-\u093D]|[\u0950-\u0950]|[\u0958-\u0961]|[\u0985-\u098C]|[\u098F-\u0990]|[\u0993-\u09A8]|[\u09AA-\u09B0]|[\u09B2-\u09B2]|[\u09B6-\u09B9]|[\u09DC-\u09DD]|[\u09DF-\u09E1]|[\u09F0-\u09F1]|[\u0A05-\u0A0A]|[\u0A0F-\u0A10]|[\u0A13-\u0A28]|[\u0A2A-\u0A30]|[\u0A32-\u0A33]|[\u0A35-\u0A36]|[\u0A38-\u0A39]|[\u0A59-\u0A5C]|[\u0A5E-\u0A5E]|[\u0A72-\u0A74]|[\u0A85-\u0A8B]|[\u0A8D-\u0A8D]|[\u0A8F-\u0A91]|[\u0A93-\u0AA8]|[\u0AAA-\u0AB0]|[\u0AB2-\u0AB3]|[\u0AB5-\u0AB9]|[\u0ABD-\u0ABD]|[\u0AD0-\u0AD0]|[\u0AE0-\u0AE0]|[\u0B05-\u0B0C]|[\u0B0F-\u0B10]|[\u0B13-\u0B28]|[\u0B2A-\u0B30]|[\u0B32-\u0B33]|[\u0B36-\u0B39]|[\u0B3D-\u0B3D]|[\u0B5C-\u0B5D]|[\u0B5F-\u0B61]|[\u0B85-\u0B8A]|[\u0B8E-\u0B90]|[\u0B92-\u0B95]|[\u0B99-\u0B9A]|[\u0B9C-\u0B9C]|[\u0B9E-\u0B9F]|[\u0BA3-\u0BA4]|[\u0BA8-\u0BAA]|[\u0BAE-\u0BB5]|[\u0BB7-\u0BB9]|[\u0C05-\u0C0C]|[\u0C0E-\u0C10]|[\u0C12-\u0C28]|[\u0C2A-\u0C33]|[\u0C35-\u0C39]|[\u0C60-\u0C61]|[\u0C85-\u0C8C]|[\u0C8E-\u0C90]|[\u0C92-\u0CA8]|[\u0CAA-\u0CB3]|[\u0CB5-\u0CB9]|[\u0CDE-\u0CDE]|[\u0CE0-\u0CE1]|[\u0D05-\u0D0C]|[\u0D0E-\u0D10]|[\u0D12-\u0D28]|[\u0D2A-\u0D39]|[\u0D60-\u0D61]|[\u0E01-\u0E30]|[\u0E32-\u0E33]|[\u0E40-\u0E45]|[\u0E81-\u0E82]|[\u0E84-\u0E84]|[\u0E87-\u0E88]|[\u0E8A-\u0E8A]|[\u0E8D-\u0E8D]|[\u0E94-\u0E97]|[\u0E99-\u0E9F]|[\u0EA1-\u0EA3]|[\u0EA5-\u0EA5]|[\u0EA7-\u0EA7]|[\u0EAA-\u0EAB]|[\u0EAD-\u0EB0]|[\u0EB2-\u0EB3]|[\u0EBD-\u0EBD]|[\u0EC0-\u0EC4]|[\u0EDC-\u0EDD]|[\u0F00-\u0F00]|[\u0F40-\u0F47]|[\u0F49-\u0F69]|[\u0F88-\u0F8B]|[\u1100-\u1159]|[\u115F-\u11A2]|[\u11A8-\u11F9]|[\u2135-\u2138]|[\u3006-\u3006]|[\u3041-\u3094]|[\u30A1-\u30FA]|[\u3105-\u312C]|[\u3131-\u318E]|[\u4E00-\u9FA5]|[\uAC00-\uD7A3]|[\uF900-\uFA2D]|[\uFB1F-\uFB28]|[\uFB2A-\uFB36]|[\uFB38-\uFB3C]|[\uFB3E-\uFB3E]|[\uFB40-\uFB41]|[\uFB43-\uFB44]|[\uFB46-\uFBB1]|[\uFBD3-\uFD3D]|[\uFD50-\uFD8F]|[\uFD92-\uFDC7]|[\uFDF0-\uFDFB]|[\uFE70-\uFE72]|[\uFE74-\uFE74]|[\uFE76-\uFEFC]|[\uFF66-\uFF6F]|[\uFF71-\uFF9D]|[\uFFA0-\uFFBE]|[\uFFC2-\uFFC7]|[\uFFCA-\uFFCF]|[\uFFD2-\uFFD7]|[\uFFDA-\uFFDC]/}},{}]},{},[3])(3)}); \ No newline at end of file diff --git a/examples/location/index.expanded.js b/examples/location/index.expanded.js index 844cde4..c7ab8db 100644 --- a/examples/location/index.expanded.js +++ b/examples/location/index.expanded.js @@ -65,26 +65,26 @@ var G = new Syndicate.Ground(function () { (function () { var currentLocation = null; var selectedMarker = null; Syndicate.Actor.createFacet() .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(brokerConnection(wsurl), 0); })) -.addAssertion((function() { var _ = Syndicate.__; return (currentLocation) ? Syndicate.Patch.assert(toBroker(wsurl,currentLocation), 0) : Syndicate.Patch.emptyPatch; })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#my_email','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#my_email','change',_), metalevel: 0 }; }), (function() { +.addAssertion((function() { var _ = Syndicate.__; return (currentLocation) ? Syndicate.Patch.assert(toBroker(wsurl, currentLocation), 0) : Syndicate.Patch.emptyPatch; })) +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#my_email', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#my_email', 'change', _), metalevel: 0 }; }), (function() { var v = email_element.value.trim(); if (currentLocation) currentLocation[1] = v; localStorage.my_email = v; })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#group','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#group','change',_), metalevel: 0 }; }), (function() { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#group', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#group', 'change', _), metalevel: 0 }; }), (function() { localStorage.group = group_element.value.trim(); wsurl = wsurl_base + group_element.value.trim(); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#findMarker','click',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#findMarker','click',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#findMarker', 'click', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#findMarker', 'click', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { Syndicate.Dataspace.send(findMarker(document.getElementById('markerList').value)); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#markerList','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#markerList','change',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('#markerList', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('#markerList', 'change', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { Syndicate.Dataspace.send(findMarker(document.getElementById('markerList').value)); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub((locationRecord(_,_,_,_,_)), 0); }), (function() { var _ = Syndicate.__; return { assertion: ((Syndicate._$("loc",locationRecord(_,_,_,_,_)))), metalevel: 0 }; }), (function(loc) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub((locationRecord(_, _, _, _, _)), 0); }), (function() { var _ = Syndicate.__; return { assertion: ((Syndicate._$("loc",locationRecord(_, _, _, _, _)))), metalevel: 0 }; }), (function(loc) { currentLocation = loc; })) -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(fromBroker(wsurl,locationRecord(_,_,_,_,_)), 0); }), (function() { var _ = Syndicate.__; return { assertion: fromBroker(wsurl,locationRecord((Syndicate._$("id")),(Syndicate._$("email")),_,_,_)), metalevel: 0 }; }), (function(id, email) { var ui = new Syndicate.UI.Anchor(); var marker = new google.maps.Marker({ +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(fromBroker(wsurl, locationRecord(_, _, _, _, _)), 0); }), (function() { var _ = Syndicate.__; return { assertion: fromBroker(wsurl, locationRecord((Syndicate._$("id")), (Syndicate._$("email")), _, _, _)), metalevel: 0 }; }), (function(id, email) { var ui = new Syndicate.UI.Anchor(); var marker = new google.maps.Marker({ map: map, clickable: true, icon: 'https://www.gravatar.com/avatar/' + md5(email.trim().toLowerCase()) + '?s=32&d=retro' @@ -105,19 +105,23 @@ Syndicate.Actor.createFacet() }); } } -var _cachedAssertion1467054033339_0 = (function() { var _ = Syndicate.__; return fromBroker(wsurl,locationRecord(id,email,_,_,_)); })(); +var _cachedAssertion1468253137502_0 = (function() { var _ = Syndicate.__; return fromBroker(wsurl, locationRecord(id, email, _, _, _)); })(); Syndicate.Actor.createFacet() .addInitBlock((function() { marker.addListener('click', Syndicate.Dataspace.wrap(function () { selectMarker(); })); })) -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(ui.html('#markerList',Mustache.render(document.getElementById('markerList-option').innerHTML,{id:id,email:email})), 0); })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(ui.html('#markerList', + Mustache.render(document.getElementById('markerList-option').innerHTML, { + id: id, + email: email + })), 0); })) .onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(findMarker(id), 0); }), (function() { var _ = Syndicate.__; return { assertion: findMarker(id), metalevel: 0 }; }), (function() { selectMarker(); if (latestPosition) map.panTo(latestPosition); })) -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(fromBroker(wsurl,locationRecord(id,email,_,_,_)), 0); }), (function() { var _ = Syndicate.__; return { assertion: fromBroker(wsurl,locationRecord(id,email,(Syndicate._$("timestamp")),(Syndicate._$("lat")),(Syndicate._$("lng")))), metalevel: 0 }; }), (function(timestamp, lat, lng) { +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(fromBroker(wsurl, locationRecord(id, email, _, _, _)), 0); }), (function() { var _ = Syndicate.__; return { assertion: fromBroker(wsurl, locationRecord(id, email, (Syndicate._$("timestamp")), (Syndicate._$("lat")), (Syndicate._$("lng")))), metalevel: 0 }; }), (function(timestamp, lat, lng) { latestTimestamp = new Date(timestamp); latestPosition = {lat: lat, lng: lng}; marker.setPosition(latestPosition); @@ -128,6 +132,6 @@ Syndicate.Actor.createFacet() marker.setMap(null); if (selectedMarker === marker) selectedMarker = null; })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054033339_0, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054033339_0, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253137502_0, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253137502_0, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); }); }).startStepping(); diff --git a/examples/todo/index.expanded.js b/examples/todo/index.expanded.js index 40f6101..f6d5244 100644 --- a/examples/todo/index.expanded.js +++ b/examples/todo/index.expanded.js @@ -27,10 +27,10 @@ function todoListItemModel(initialId, initialTitle, initialCompleted) { (function () { Syndicate.Actor.createFacet() -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(todo(this.id,this.title,this.completed), 0); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(setCompleted(this.id,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: setCompleted(this.id,(Syndicate._$("v"))), metalevel: 0 }; }), (function(v) { this.completed = v; })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(todo(this.id, this.title, this.completed), 0); })) +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(setCompleted(this.id, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: setCompleted(this.id, (Syndicate._$("v"))), metalevel: 0 }; }), (function(v) { this.completed = v; })) .onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(setAllCompleted(_), 0); }), (function() { var _ = Syndicate.__; return { assertion: setAllCompleted((Syndicate._$("v"))), metalevel: 0 }; }), (function(v) { this.completed = v; })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(setTitle(this.id,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: setTitle(this.id,(Syndicate._$("v"))), metalevel: 0 }; }), (function(v) { this.title = v; })) +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(setTitle(this.id, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: setTitle(this.id, (Syndicate._$("v"))), metalevel: 0 }; }), (function(v) { this.title = v; })) .onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(clearCompletedTodos(), 0); }), (function() { var _ = Syndicate.__; return { assertion: clearCompletedTodos(), metalevel: 0 }; }), (function() { if (this.completed) Syndicate.Dataspace.send(deleteTodo(this.id)); })) @@ -53,38 +53,48 @@ function todoListItemView(id) { this.editing = false; (function () { Syndicate.Actor.createFacet() -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(id,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo(id,(Syndicate._$("title")),(Syndicate._$("completed"))), metalevel: 0 }; }), (function(title, completed) { -var _cachedAssertion1467054034537_0 = (function() { var _ = Syndicate.__; return todo(id,title,completed); })(); +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(id, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo(id, (Syndicate._$("title")), (Syndicate._$("completed"))), metalevel: 0 }; }), (function(title, completed) { +var _cachedAssertion1468253138670_0 = (function() { var _ = Syndicate.__; return todo(id, title, completed); })(); Syndicate.Actor.createFacet() .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(show(completed), 0); }), (function() { var _ = Syndicate.__; return { assertion: show(completed), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_1 = (function() { var _ = Syndicate.__; return show(completed); })(); +var _cachedAssertion1468253138670_1 = (function() { var _ = Syndicate.__; return show(completed); })(); Syndicate.Actor.createFacet() -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(this.ui.html('.todo-list',Mustache.render(getTemplate(this.editing?'todo-list-item-edit-template':'todo-list-item-view-template'),{id:id,title:title,completed_class:completed?"completed":"",checked:completed?"checked":"",}),id), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_1, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_1, metalevel: 0 }; }), (function() {})).completeBuild(); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_0, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_0, metalevel: 0 }; }), (function() {})).completeBuild(); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('.toggle','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('.toggle','change',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(this.ui.html('.todo-list', + Mustache.render(getTemplate(this.editing + ? 'todo-list-item-edit-template' + : 'todo-list-item-view-template'), + { + id: id, + title: title, + completed_class: completed ? "completed" : "", + checked: completed ? "checked" : "", + }), + id), 0); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_1, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_1, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_0, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_0, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('.toggle', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('.toggle', 'change', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { Syndicate.Dataspace.send(setCompleted(id, e.target.checked)); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('.destroy','click',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('.destroy','click',_), metalevel: 0 }; }), (function() { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('.destroy', 'click', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('.destroy', 'click', _), metalevel: 0 }; }), (function() { Syndicate.Dataspace.send(deleteTodo(id)); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('label','dblclick',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('label','dblclick',_), metalevel: 0 }; }), (function() { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('label', 'dblclick', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('label', 'dblclick', _), metalevel: 0 }; }), (function() { this.editing = true; })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('input.edit','keyup',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('input.edit','keyup',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('input.edit', 'keyup', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('input.edit', 'keyup', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { if (e.keyCode === ESCAPE_KEY_CODE || e.keyCode === ENTER_KEY_CODE) { this.editing = false; } })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('input.edit','blur',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('input.edit','blur',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('input.edit', 'blur', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('input.edit', 'blur', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { this.editing = false; })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('input.edit','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('input.edit','change',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(this.ui.event('input.edit', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: this.ui.event('input.edit', 'change', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { var newTitle = e.target.value.trim(); Syndicate.Dataspace.send((newTitle ? setTitle(id, newTitle) : deleteTodo(id))); this.editing = false; })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(id,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo(id,_,_), metalevel: 0 }; }), (function() {})).completeBuild(); })(); +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(id, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo(id, _, _), metalevel: 0 }; }), (function() {})).completeBuild(); })(); }); } @@ -96,7 +106,7 @@ var G = new Syndicate.Ground(function () { Syndicate.Actor.spawnActor(new Object(), function() { (function () { Syndicate.Actor.createFacet() -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('.new-todo','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('.new-todo','change',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('.new-todo', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('.new-todo', 'change', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { var newTitle = e.target.value.trim(); if (newTitle) Syndicate.Dataspace.send(createTodo(newTitle)); e.target.value = ""; @@ -109,35 +119,35 @@ Syndicate.Actor.createFacet() (function () { Syndicate.Actor.createFacet() .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(activeTodoCount(_), 0); }), (function() { var _ = Syndicate.__; return { assertion: activeTodoCount((Syndicate._$("count"))), metalevel: 0 }; }), (function(count) { -var _cachedAssertion1467054034537_2 = (function() { var _ = Syndicate.__; return activeTodoCount(count); })(); +var _cachedAssertion1468253138670_2 = (function() { var _ = Syndicate.__; return activeTodoCount(count); })(); Syndicate.Actor.createFacet() -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(this.ui.context('count').html('.todo-count strong',''+count), 0); })) -.addAssertion((function() { var _ = Syndicate.__; return (count !== 1) ? Syndicate.Patch.assert(this.ui.context('plural').html('.todo-count span.s','s'), 0) : Syndicate.Patch.emptyPatch; })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_2, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_2, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(this.ui.context('count').html('.todo-count strong', '' + count), 0); })) +.addAssertion((function() { var _ = Syndicate.__; return (count !== 1) ? Syndicate.Patch.assert(, 0) : Syndicate.Patch.emptyPatch; })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_2, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_2, metalevel: 0 }; }), (function() {})).completeBuild(); })) .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(totalTodoCount(0), 0); }), (function() { var _ = Syndicate.__; return { assertion: totalTodoCount(0), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_3 = (function() { var _ = Syndicate.__; return totalTodoCount(0); })(); +var _cachedAssertion1468253138670_3 = (function() { var _ = Syndicate.__; return totalTodoCount(0); })(); Syndicate.Actor.createFacet() -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('section.main','class','hidden'), 0); })) -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('footer.footer','class','hidden'), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_3, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_3, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('section.main', 'class', 'hidden'), 0); })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('footer.footer', 'class', 'hidden'), 0); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_3, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_3, metalevel: 0 }; }), (function() {})).completeBuild(); })) .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(completedTodoCount(0), 0); }), (function() { var _ = Syndicate.__; return { assertion: completedTodoCount(0), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_4 = (function() { var _ = Syndicate.__; return completedTodoCount(0); })(); +var _cachedAssertion1468253138670_4 = (function() { var _ = Syndicate.__; return completedTodoCount(0); })(); Syndicate.Actor.createFacet() -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('button.clear-completed','class','hidden'), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_4, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_4, metalevel: 0 }; }), (function() {})).completeBuild(); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('button.clear-completed','click',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('button.clear-completed','click',_), metalevel: 0 }; }), (function() { +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('button.clear-completed', 'class', 'hidden'), 0); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_4, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_4, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('button.clear-completed', 'click', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('button.clear-completed', 'click', _), metalevel: 0 }; }), (function() { Syndicate.Dataspace.send(clearCompletedTodos()); })) .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(allCompleted(), 0); }), (function() { var _ = Syndicate.__; return { assertion: allCompleted(), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_5 = (function() { var _ = Syndicate.__; return allCompleted(); })(); +var _cachedAssertion1468253138670_5 = (function() { var _ = Syndicate.__; return allCompleted(); })(); Syndicate.Actor.createFacet() .addInitBlock((function() { Syndicate.Dataspace.send(Syndicate.UI.setProperty('.toggle-all', 'checked', true)); })) .addDoneBlock((function() { Syndicate.Dataspace.send(Syndicate.UI.setProperty('.toggle-all', 'checked', false)); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_5, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_5, metalevel: 0 }; }), (function() {})).completeBuild(); })) -.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('.toggle-all','change',_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('.toggle-all','change',(Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_5, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_5, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.globalEvent('.toggle-all', 'change', _), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.globalEvent('.toggle-all', 'change', (Syndicate._$("e"))), metalevel: 0 }; }), (function(e) { Syndicate.Dataspace.send(setAllCompleted(e.target.checked)); })) -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")),_,_), metalevel: 0 }; }), (function(id) { +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")), _, _), metalevel: 0 }; }), (function(id) { todoListItemView(id); })).completeBuild(); })(); }); @@ -147,11 +157,11 @@ Syndicate.Actor.createFacet() var activeCount = 0; (function () { Syndicate.Actor.createFacet() -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")),_,(Syndicate._$("completed"))), metalevel: 0 }; }), (function(id, completed) { if (completed) completedCount++; else activeCount++; })) -.onEvent(false, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")),_,(Syndicate._$("completed"))), metalevel: 0 }; }), (function(id, completed) { if (completed) completedCount--; else activeCount--; })) +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")), _, (Syndicate._$("completed"))), metalevel: 0 }; }), (function(id, completed) { if (completed) completedCount++; else activeCount++; })) +.onEvent(false, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")), _, (Syndicate._$("completed"))), metalevel: 0 }; }), (function(id, completed) { if (completed) completedCount--; else activeCount--; })) .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(activeTodoCount(activeCount), 0); })) .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(completedTodoCount(completedCount), 0); })) -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(totalTodoCount(activeCount+completedCount), 0); })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(totalTodoCount(activeCount + completedCount), 0); })) .addAssertion((function() { var _ = Syndicate.__; return (completedCount > 0 && activeCount === 0) ? Syndicate.Patch.assert(allCompleted(), 0) : Syndicate.Patch.emptyPatch; })).completeBuild(); })(); }); @@ -159,26 +169,27 @@ Syndicate.Actor.createFacet() (function () { Syndicate.Actor.createFacet() .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.locationHash(_), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.locationHash((Syndicate._$("hash"))), metalevel: 0 }; }), (function(hash) { -var _cachedAssertion1467054034537_6 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash(hash); })(); +var _cachedAssertion1468253138670_6 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash(hash); })(); Syndicate.Actor.createFacet() -.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('ul.filters > li > a[href="#'+hash+'"]','class','selected'), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_6, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_6, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(Syndicate.UI.uiAttribute('ul.filters > li > a[href="#'+hash+'"]', + 'class', 'selected'), 0); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_6, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_6, metalevel: 0 }; }), (function() {})).completeBuild(); })) .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.locationHash('/'), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.locationHash('/'), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_7 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash('/'); })(); +var _cachedAssertion1468253138670_7 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash('/'); })(); Syndicate.Actor.createFacet() .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(show(true), 0); })) .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(show(false), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_7, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_7, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_7, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_7, metalevel: 0 }; }), (function() {})).completeBuild(); })) .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.locationHash('/active'), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.locationHash('/active'), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_8 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash('/active'); })(); +var _cachedAssertion1468253138670_8 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash('/active'); })(); Syndicate.Actor.createFacet() .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(show(false), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_8, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_8, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_8, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_8, metalevel: 0 }; }), (function() {})).completeBuild(); })) .onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.UI.locationHash('/completed'), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.UI.locationHash('/completed'), metalevel: 0 }; }), (function() { -var _cachedAssertion1467054034537_9 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash('/completed'); })(); +var _cachedAssertion1468253138670_9 = (function() { var _ = Syndicate.__; return Syndicate.UI.locationHash('/completed'); })(); Syndicate.Actor.createFacet() .addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(show(true), 0); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_9, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_9, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_9, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_9, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); }); Syndicate.Actor.spawnActor(new Object(), function() { @@ -206,21 +217,21 @@ Syndicate.Actor.createFacet() .onEvent(false, "message", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(createTodo(_), 0); }), (function() { var _ = Syndicate.__; return { assertion: createTodo((Syndicate._$("title"))), metalevel: 0 }; }), (function(title) { todoListItemModel(db.nextId++, title, false); })) -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")),_,_), metalevel: 0 }; }), (function(id) { -var _cachedAssertion1467054034537_10 = (function() { var _ = Syndicate.__; return todo(id,_,_); })(); +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(_, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo((Syndicate._$("id")), _, _), metalevel: 0 }; }), (function(id) { +var _cachedAssertion1468253138670_10 = (function() { var _ = Syndicate.__; return todo(id, _, _); })(); Syndicate.Actor.createFacet() -.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(id,_,_), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo(id,(Syndicate._$("title")),(Syndicate._$("completed"))), metalevel: 0 }; }), (function(title, completed) { -var _cachedAssertion1467054034537_11 = (function() { var _ = Syndicate.__; return todo(id,title,completed); })(); +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(todo(id, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: todo(id, (Syndicate._$("title")), (Syndicate._$("completed"))), metalevel: 0 }; }), (function(title, completed) { +var _cachedAssertion1468253138670_11 = (function() { var _ = Syndicate.__; return todo(id, title, completed); })(); Syndicate.Actor.createFacet() .addInitBlock((function() { db.todos[id] = {id: id, title: title, completed: completed}; localStorage['todos-syndicate'] = JSON.stringify(db); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_11, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_11, metalevel: 0 }; }), (function() {})).completeBuild(); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_11, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_11, metalevel: 0 }; }), (function() {})).completeBuild(); })) .addDoneBlock((function() { delete db.todos[id]; localStorage['todos-syndicate'] = JSON.stringify(db); })) -.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1467054034537_10, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1467054034537_10, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253138670_10, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253138670_10, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); }); }).startStepping(); diff --git a/examples/two-buyer-protocol/.gitignore b/examples/two-buyer-protocol/.gitignore new file mode 100644 index 0000000..937fe5e --- /dev/null +++ b/examples/two-buyer-protocol/.gitignore @@ -0,0 +1,2 @@ +index.expanded.js +index.md diff --git a/examples/two-buyer-protocol/Makefile b/examples/two-buyer-protocol/Makefile new file mode 100644 index 0000000..1f41ea4 --- /dev/null +++ b/examples/two-buyer-protocol/Makefile @@ -0,0 +1,12 @@ +TARGETS=index.expanded.js index.md + +all: $(TARGETS) + +%.expanded.js: %.js + ../../bin/syndicatec $< > $@ || (rm -f $@; false) + +%.md: %.js + sed -E -e 's:^: :g' -e 's:^ /// ?::g' -e 's:^ $$::g' < $< > $@ + +clean: + rm -f $(TARGETS) diff --git a/examples/two-buyer-protocol/index.expanded.js b/examples/two-buyer-protocol/index.expanded.js new file mode 100644 index 0000000..cb16841 --- /dev/null +++ b/examples/two-buyer-protocol/index.expanded.js @@ -0,0 +1,306 @@ +"use strict"; +var Syndicate = require('../../src/main.js'); +/// --> + +/// This is an extended two-buyer book-purchase protocol, based +/// loosely on an example given in: +/// +/// > K. Honda, N. Yoshida, and M. Carbone, “Multiparty asynchronous +/// > session types,” POPL 2008. + +/// # The Scenario +/// +/// A book-seller responds to requests for book prices when asked. A +/// pair of prospective buyers run through a shopping list. For each +/// book, the first buyer offers to split the cost of the book with +/// the second. If the second has enough money left, it accepts; +/// otherwise, it rejects the offer, and the first buyer tries a +/// different split. If the second buyer agrees to a split, it then +/// negotiates the purchase of the book with the book-seller. + +/// # The Protocol + +/// ## Role: SELLER +/// +/// - when interest in `bookQuote($title, _)` appears, +/// asserts `bookQuote(title, Maybe Float)`, `false` meaning not available, +/// and otherwise an asking-price. +/// - when interest in `order($title, $offer-price, _, _)` appears, +/// asserts `order(title, offer-price, false, false)` for "no sale", otherwise +/// `order(title, offer-price, PositiveInteger, String)`, an accepted sale. + +/// ## Role: BUYER +/// +/// - observes `bookQuote(title, $price)` to learn prices. +/// - observes `order(title, offer-price, $id, $delivery-date)` to make orders. + +/// ## Role: SPLIT-PROPOSER +/// +/// - observes `splitProposal(title, asking-price, contribution, $accepted)` +/// to make a split-proposal and learn whether it was accepted or not. + +/// ## Role: SPLIT-DISPOSER +/// +/// - when interest in `splitProposal($title, $asking-price, $contribution, _)` +/// appears, asserts `splitProposal(title, askingPrice, contribution, true)` +/// to indicate they are willing to go through with the deal, in which case +/// they then perform the role of BUYER for title/asking-price, or asserts +/// `splitProposal(title, asking-price, contribution, false)` to indicate they +/// are unwilling to go through with the deal. + +/// # A Sample Run +/// +/// Run the program with `../../bin/syndicatec index.js | node` from a +/// checkout of the Syndicate repository. +/// +/// A learns that the price of Catch 22 is 2.22 +/// A makes an offer to split the price of Catch 22 contributing 1.11 +/// B is being asked to contribute 1.11 toward Catch 22 at price 2.22 +/// B accepts the offer, leaving them with 3.8899999999999997 remaining funds +/// A learns that the split-proposal for Catch 22 was accepted +/// A learns that Encyclopaedia Brittannica is out-of-stock. +/// The order for Catch 22 has id 10001483, and will be delivered on March 9th +/// A learns that the price of Candide is 34.95 +/// A makes an offer to split the price of Candide contributing 17.475 +/// B is being asked to contribute 17.475 toward Candide at price 34.95 +/// B hasn't enough funds (3.8899999999999997 remaining) +/// A learns that the split-proposal for Candide was rejected +/// A makes an offer to split the price of Candide contributing 26.212500000000002 +/// B is being asked to contribute 8.7375 toward Candide at price 34.95 +/// B hasn't enough funds (3.8899999999999997 remaining) +/// A learns that the split-proposal for Candide was rejected +/// A makes an offer to split the price of Candide contributing 30.581250000000004 +/// B is being asked to contribute 4.368749999999999 toward Candide at price 34.95 +/// B hasn't enough funds (3.8899999999999997 remaining) +/// A learns that the split-proposal for Candide was rejected +/// A makes an offer to split the price of Candide contributing 32.765625 +/// B is being asked to contribute 2.184375000000003 toward Candide at price 34.95 +/// B accepts the offer, leaving them with 1.7056249999999968 remaining funds +/// A learns that the split-proposal for Candide was accepted +/// A learns that the price of The Wind in the Willows is 3.95 +/// A makes an offer to split the price of The Wind in the Willows contributing 1.975 +/// The order for Candide has id 10001484, and will be delivered on March 9th +/// B is being asked to contribute 1.975 toward The Wind in the Willows at price 3.95 +/// B hasn't enough funds (1.7056249999999968 remaining) +/// A learns that the split-proposal for The Wind in the Willows was rejected +/// A makes an offer to split the price of The Wind in the Willows contributing 2.9625000000000004 +/// B is being asked to contribute 0.9874999999999998 toward The Wind in the Willows at price 3.95 +/// B accepts the offer, leaving them with 0.718124999999997 remaining funds +/// A learns that the split-proposal for The Wind in the Willows was accepted +/// A has bought everything they wanted! +/// The order for The Wind in the Willows has id 10001485, and will be delivered on March 9th + +/// # The Code + +/// ## Type Declarations + +/// First, we declare *assertion types* for our protocol. + +var bookQuote = Syndicate.Struct.makeConstructor("bookQuote", ["title","price"]); +var order = Syndicate.Struct.makeConstructor("order", ["title","price","id","deliveryDate"]); + +var splitProposal = Syndicate.Struct.makeConstructor("splitProposal", ["title","price","contribution","accepted"]); + +/// ## Utilities + +/// This routine is under consideration for possible addition to the +/// core library. +/// +function whileRelevantAssert(P) { + (function () { +Syndicate.Actor.createFacet() +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(P, 0); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.observe(P), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.observe(P), metalevel: 0 }; }), (function() {})).completeBuild(); })(); +} + +/// ## Implementation: SELLER + +function seller() { + Syndicate.Actor.spawnActor(new Object(), function() { + +/// We give our actor two state variables: a dictionary recording our +/// inventory of books (mapping title to price), and a counter +/// tracking the next order ID to be allocated. + + this.books = { + "The Wind in the Willows": 3.95, + "Catch 22": 2.22, + "Candide": 34.95 + }; + this.nextOrderId = 10001483; + +/// The seller responds to interest in bookQuotes by asserting a +/// responsive record, if one exists. + + (function () { +Syndicate.Actor.createFacet() +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.observe(bookQuote(_, _)), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.observe(bookQuote((Syndicate._$("title")), _)), metalevel: 0 }; }), (function(title) { +var _cachedAssertion1468253139911_0 = (function() { var _ = Syndicate.__; return Syndicate.observe(bookQuote(title, _)); })(); +Syndicate.Actor.createFacet() +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(bookQuote(title, title in this.books ? this.books[title] : false), 0); })) +.onEvent(true, "retracted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(_cachedAssertion1468253139911_0, 0); }), (function() { var _ = Syndicate.__; return { assertion: _cachedAssertion1468253139911_0, metalevel: 0 }; }), (function() {})).completeBuild(); })).completeBuild(); })(); + +/// It also responds to order requests. + + (function () { +Syndicate.Actor.createFacet() +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.observe(order(_, _, _, _)), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.observe(order((Syndicate._$("title")), (Syndicate._$("offerPrice")), _, _)), metalevel: 0 }; }), (function(title, offerPrice) { + +/// We cannot sell a book we do not have, and we will not sell for +/// less than our asking price. + + var askingPrice = title in this.books ? this.books[title] : false; + if ((askingPrice === false) || (offerPrice < askingPrice)) { + whileRelevantAssert(order(title, offerPrice, false, false)); + } else { + +/// But if we can sell it, we do so by allocating an order ID and +/// replying to the orderer. + + var orderId = this.nextOrderId++; + delete this.books[title]; + + Syndicate.Actor.spawnActor(new Object(), function() { + whileRelevantAssert(order(title, offerPrice, orderId, "March 9th")); + }); + } + })).completeBuild(); })(); + }); +} + +/// ## Implementation: SPLIT-PROPOSER and book-quote-requestor + +function buyerA() { + Syndicate.Actor.spawnActor(new Object(), function() { + var self = this; + +/// Our actor remembers which books remain on its shopping list, and +/// tries to buy them one at a time, sharing costs with `buyerB`. + + self.titles = ["Catch 22", + "Encyclopaedia Brittannica", + "Candide", + "The Wind in the Willows"]; + +/// JavaScript's callback-oriented blocking means that we express our +/// loop in almost a tail-recursive style, using helper functions +/// `buyBooks` and `trySplit`. + + buyBooks(); + + function buyBooks() { + if (self.titles.length === 0) { + console.log("A has bought everything they wanted!"); + return; + } + + var title = self.titles.shift(); + +/// First, retrieve a quote for the title, and analyze the result. + + (function () { +Syndicate.Actor.createFacet() +.onEvent(true, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(bookQuote(title, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: bookQuote(title, (Syndicate._$("price"))), metalevel: 0 }; }), (function(price) { + if (price === false) { + console.log("A learns that "+title+" is out-of-stock."); + buyBooks(); + } else { + console.log("A learns that the price of "+title+" is "+price); + +/// Next, repeatedly make split offers to a SPLIT-DISPOSER until +/// either one is accepted, or the contribution from the +/// SPLIT-DISPOSER becomes pointlessly small. We start the process by +/// offering to split the price of the book evenly. + + trySplit(title, price, price / 2); + } + })).completeBuild(); })(); + } + + function trySplit(title, price, contribution) { + console.log("A makes an offer to split the price of "+title+ + " contributing "+contribution); + +/// If we are about to offer to split the price, but the other buyer +/// would contribute less than 10c, then it's not worth bothering; we +/// may as well buy it ourselves. Another version of the program could +/// perform the BUYER role here. + + if (contribution > (price - 0.10)) { + console.log("A gives up on "+title+"."); + buyBooks(); + } else { + +/// Make our proposal, and wait for a response. + + (function () { +Syndicate.Actor.createFacet() +.onEvent(true, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(splitProposal(title, price, contribution, true), 0); }), (function() { var _ = Syndicate.__; return { assertion: splitProposal(title, price, contribution, true), metalevel: 0 }; }), (function() { + console.log("A learns that the split-proposal for "+title+" was accepted"); + buyBooks(); + })) +.onEvent(true, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(splitProposal(title, price, contribution, false), 0); }), (function() { var _ = Syndicate.__; return { assertion: splitProposal(title, price, contribution, false), metalevel: 0 }; }), (function() { + console.log("A learns that the split-proposal for "+title+" was rejected"); + trySplit(title, price, contribution + ((price - contribution) / 2)); + })).completeBuild(); })(); + } + } + }); +} + +/// ## Implementation: SPLIT-DISPOSER and BUYER + +function buyerB() { + Syndicate.Actor.spawnActor(new Object(), function() { + +/// This actor maintains a record of the amount of money it has left +/// to spend. + + this.funds = 5.00; + +/// It spends its time waiting for a SPLIT-PROPOSER to offer a +/// `splitProposal`. + + (function () { +Syndicate.Actor.createFacet() +.onEvent(false, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(Syndicate.observe(splitProposal(_, _, _, _)), 0); }), (function() { var _ = Syndicate.__; return { assertion: Syndicate.observe(splitProposal((Syndicate._$("title")), (Syndicate._$("price")), (Syndicate._$("theirContribution")), _)), metalevel: 0 }; }), (function(title, price, theirContribution) { + var myContribution = price - theirContribution; + console.log("B is being asked to contribute "+myContribution+" toward "+title+ + " at price "+price); + +/// We may not be able to afford contributing this much. + + if (myContribution > this.funds) { + console.log("B hasn't enough funds ("+this.funds+" remaining)"); + whileRelevantAssert(splitProposal(title, price, theirContribution, false)); + } else { + +/// But if we *can* afford it, update our remaining funds and spawn a +/// small actor to handle the actual purchase now that we have agreed +/// on a split. + + var remainingFunds = this.funds - myContribution; + console.log("B accepts the offer, leaving them with "+remainingFunds+" remaining funds"); + this.funds = remainingFunds; + + Syndicate.Actor.spawnActor(new Object(), function() { + (function () { +Syndicate.Actor.createFacet() +.addAssertion((function() { var _ = Syndicate.__; return Syndicate.Patch.assert(splitProposal(title, price, theirContribution, true), 0); })) +.onEvent(true, "asserted", (function() { var _ = Syndicate.__; return Syndicate.Patch.sub(order(title, price, _, _), 0); }), (function() { var _ = Syndicate.__; return { assertion: order(title, price, (Syndicate._$("id")), (Syndicate._$("date"))), metalevel: 0 }; }), (function(id, date) { + console.log("The order for "+title+" has id "+id+ + ", and will be delivered on "+date); + })).completeBuild(); })(); + }); + } + })).completeBuild(); })(); + }); +} + +/// ## Starting Configuration + +new Syndicate.Ground(function () { + seller(); + buyerA(); + buyerB(); +}).startStepping(); diff --git a/examples/two-buyer-protocol/index.js b/examples/two-buyer-protocol/index.js new file mode 100644 index 0000000..4987146 --- /dev/null +++ b/examples/two-buyer-protocol/index.js @@ -0,0 +1,318 @@ +/// --- +/// title: Two-Party Buyer Protocol +/// --- + +/// + +/// This is an extended two-buyer book-purchase protocol, based +/// loosely on an example given in: +/// +/// > K. Honda, N. Yoshida, and M. Carbone, “Multiparty asynchronous +/// > session types,” POPL 2008. + +/// # The Scenario +/// +/// A book-seller responds to requests for book prices when asked. A +/// pair of prospective buyers run through a shopping list. For each +/// book, the first buyer offers to split the cost of the book with +/// the second. If the second has enough money left, it accepts; +/// otherwise, it rejects the offer, and the first buyer tries a +/// different split. If the second buyer agrees to a split, it then +/// negotiates the purchase of the book with the book-seller. + +/// # The Protocol + +/// ## Role: SELLER +/// +/// - when interest in `bookQuote($title, _)` appears, +/// asserts `bookQuote(title, Maybe Float)`, `false` meaning not available, +/// and otherwise an asking-price. +/// - when interest in `order($title, $offer-price, _, _)` appears, +/// asserts `order(title, offer-price, false, false)` for "no sale", otherwise +/// `order(title, offer-price, PositiveInteger, String)`, an accepted sale. + +/// ## Role: BUYER +/// +/// - observes `bookQuote(title, $price)` to learn prices. +/// - observes `order(title, offer-price, $id, $delivery-date)` to make orders. + +/// ## Role: SPLIT-PROPOSER +/// +/// - observes `splitProposal(title, asking-price, contribution, $accepted)` +/// to make a split-proposal and learn whether it was accepted or not. + +/// ## Role: SPLIT-DISPOSER +/// +/// - when interest in `splitProposal($title, $asking-price, $contribution, _)` +/// appears, asserts `splitProposal(title, askingPrice, contribution, true)` +/// to indicate they are willing to go through with the deal, in which case +/// they then perform the role of BUYER for title/asking-price, or asserts +/// `splitProposal(title, asking-price, contribution, false)` to indicate they +/// are unwilling to go through with the deal. + +/// # A Sample Run +/// +/// Run the program with `../../bin/syndicatec index.js | node` from a +/// checkout of the Syndicate repository. +/// +/// A learns that the price of Catch 22 is 2.22 +/// A makes an offer to split the price of Catch 22 contributing 1.11 +/// B is being asked to contribute 1.11 toward Catch 22 at price 2.22 +/// B accepts the offer, leaving them with 3.8899999999999997 remaining funds +/// A learns that the split-proposal for Catch 22 was accepted +/// A learns that Encyclopaedia Brittannica is out-of-stock. +/// The order for Catch 22 has id 10001483, and will be delivered on March 9th +/// A learns that the price of Candide is 34.95 +/// A makes an offer to split the price of Candide contributing 17.475 +/// B is being asked to contribute 17.475 toward Candide at price 34.95 +/// B hasn't enough funds (3.8899999999999997 remaining) +/// A learns that the split-proposal for Candide was rejected +/// A makes an offer to split the price of Candide contributing 26.212500000000002 +/// B is being asked to contribute 8.7375 toward Candide at price 34.95 +/// B hasn't enough funds (3.8899999999999997 remaining) +/// A learns that the split-proposal for Candide was rejected +/// A makes an offer to split the price of Candide contributing 30.581250000000004 +/// B is being asked to contribute 4.368749999999999 toward Candide at price 34.95 +/// B hasn't enough funds (3.8899999999999997 remaining) +/// A learns that the split-proposal for Candide was rejected +/// A makes an offer to split the price of Candide contributing 32.765625 +/// B is being asked to contribute 2.184375000000003 toward Candide at price 34.95 +/// B accepts the offer, leaving them with 1.7056249999999968 remaining funds +/// A learns that the split-proposal for Candide was accepted +/// A learns that the price of The Wind in the Willows is 3.95 +/// A makes an offer to split the price of The Wind in the Willows contributing 1.975 +/// The order for Candide has id 10001484, and will be delivered on March 9th +/// B is being asked to contribute 1.975 toward The Wind in the Willows at price 3.95 +/// B hasn't enough funds (1.7056249999999968 remaining) +/// A learns that the split-proposal for The Wind in the Willows was rejected +/// A makes an offer to split the price of The Wind in the Willows contributing 2.9625000000000004 +/// B is being asked to contribute 0.9874999999999998 toward The Wind in the Willows at price 3.95 +/// B accepts the offer, leaving them with 0.718124999999997 remaining funds +/// A learns that the split-proposal for The Wind in the Willows was accepted +/// A has bought everything they wanted! +/// The order for The Wind in the Willows has id 10001485, and will be delivered on March 9th + +/// # The Code + +/// ## Type Declarations + +/// First, we declare *assertion types* for our protocol. + +assertion type bookQuote(title, price); +assertion type order(title, price, id, deliveryDate); + +assertion type splitProposal(title, price, contribution, accepted); + +/// ## Utilities + +/// This routine is under consideration for possible addition to the +/// core library. +/// +function whileRelevantAssert(P) { + react { + assert P; + } until { + case retracted Syndicate.observe(P); + } +} + +/// ## Implementation: SELLER + +function seller() { + actor { + +/// We give our actor two state variables: a dictionary recording our +/// inventory of books (mapping title to price), and a counter +/// tracking the next order ID to be allocated. + + this.books = { + "The Wind in the Willows": 3.95, + "Catch 22": 2.22, + "Candide": 34.95 + }; + this.nextOrderId = 10001483; + +/// The seller responds to interest in bookQuotes by asserting a +/// responsive record, if one exists. + + react { + during Syndicate.observe(bookQuote($title, _)) { + assert bookQuote(title, title in this.books ? this.books[title] : false); + } + } + +/// It also responds to order requests. + + react { + on asserted Syndicate.observe(order($title, $offerPrice, _, _)) { + +/// We cannot sell a book we do not have, and we will not sell for +/// less than our asking price. + + var askingPrice = title in this.books ? this.books[title] : false; + if ((askingPrice === false) || (offerPrice < askingPrice)) { + whileRelevantAssert(order(title, offerPrice, false, false)); + } else { + +/// But if we can sell it, we do so by allocating an order ID and +/// replying to the orderer. + + var orderId = this.nextOrderId++; + delete this.books[title]; + + actor { + whileRelevantAssert(order(title, offerPrice, orderId, "March 9th")); + } + } + } + } + } +} + +/// ## Implementation: SPLIT-PROPOSER and book-quote-requestor + +function buyerA() { + actor { + var self = this; + +/// Our actor remembers which books remain on its shopping list, and +/// tries to buy them one at a time, sharing costs with `buyerB`. + + self.titles = ["Catch 22", + "Encyclopaedia Brittannica", + "Candide", + "The Wind in the Willows"]; + +/// JavaScript's callback-oriented blocking means that we express our +/// loop in almost a tail-recursive style, using helper functions +/// `buyBooks` and `trySplit`. + + buyBooks(); + + function buyBooks() { + if (self.titles.length === 0) { + console.log("A has bought everything they wanted!"); + return; + } + + var title = self.titles.shift(); + +/// First, retrieve a quote for the title, and analyze the result. + + react until { + case asserted bookQuote(title, $price) { + if (price === false) { + console.log("A learns that "+title+" is out-of-stock."); + buyBooks(); + } else { + console.log("A learns that the price of "+title+" is "+price); + +/// Next, repeatedly make split offers to a SPLIT-DISPOSER until +/// either one is accepted, or the contribution from the +/// SPLIT-DISPOSER becomes pointlessly small. We start the process by +/// offering to split the price of the book evenly. + + trySplit(title, price, price / 2); + } + } + } + } + + function trySplit(title, price, contribution) { + console.log("A makes an offer to split the price of "+title+ + " contributing "+contribution); + +/// If we are about to offer to split the price, but the other buyer +/// would contribute less than 10c, then it's not worth bothering; we +/// may as well buy it ourselves. Another version of the program could +/// perform the BUYER role here. + + if (contribution > (price - 0.10)) { + console.log("A gives up on "+title+"."); + buyBooks(); + } else { + +/// Make our proposal, and wait for a response. + + react until { + case asserted splitProposal(title, price, contribution, true) { + console.log("A learns that the split-proposal for "+title+" was accepted"); + buyBooks(); + } + + case asserted splitProposal(title, price, contribution, false) { + console.log("A learns that the split-proposal for "+title+" was rejected"); + trySplit(title, price, contribution + ((price - contribution) / 2)); + } + } + } + } + } +} + +/// ## Implementation: SPLIT-DISPOSER and BUYER + +function buyerB() { + actor { + +/// This actor maintains a record of the amount of money it has left +/// to spend. + + this.funds = 5.00; + +/// It spends its time waiting for a SPLIT-PROPOSER to offer a +/// `splitProposal`. + + react { + on asserted Syndicate.observe(splitProposal($title, $price, $theirContribution, _)) { + var myContribution = price - theirContribution; + console.log("B is being asked to contribute "+myContribution+" toward "+title+ + " at price "+price); + +/// We may not be able to afford contributing this much. + + if (myContribution > this.funds) { + console.log("B hasn't enough funds ("+this.funds+" remaining)"); + whileRelevantAssert(splitProposal(title, price, theirContribution, false)); + } else { + +/// But if we *can* afford it, update our remaining funds and spawn a +/// small actor to handle the actual purchase now that we have agreed +/// on a split. + + var remainingFunds = this.funds - myContribution; + console.log("B accepts the offer, leaving them with "+remainingFunds+" remaining funds"); + this.funds = remainingFunds; + + actor { + react { + +/// While waiting for order confirmation, take the opportunity to +/// signal to our SPLIT-PROPOSER that we accepted their proposal. + + assert splitProposal(title, price, theirContribution, true); + +/// When order confirmation arrives, this purchase is completed. + + } until { + case asserted order(title, price, $id, $date) { + console.log("The order for "+title+" has id "+id+ + ", and will be delivered on "+date); + } + } + } + } + } + } + } +} + +/// ## Starting Configuration + +ground dataspace { + seller(); + buyerA(); + buyerB(); +} diff --git a/examples/two-buyer-protocol/index.md b/examples/two-buyer-protocol/index.md new file mode 100644 index 0000000..d1f2225 --- /dev/null +++ b/examples/two-buyer-protocol/index.md @@ -0,0 +1,318 @@ +--- +title: Two-Party Buyer Protocol +--- + + + +This is an extended two-buyer book-purchase protocol, based +loosely on an example given in: + +> K. Honda, N. Yoshida, and M. Carbone, “Multiparty asynchronous +> session types,” POPL 2008. + +# The Scenario + +A book-seller responds to requests for book prices when asked. A +pair of prospective buyers run through a shopping list. For each +book, the first buyer offers to split the cost of the book with +the second. If the second has enough money left, it accepts; +otherwise, it rejects the offer, and the first buyer tries a +different split. If the second buyer agrees to a split, it then +negotiates the purchase of the book with the book-seller. + +# The Protocol + +## Role: SELLER + + - when interest in `bookQuote($title, _)` appears, + asserts `bookQuote(title, Maybe Float)`, `false` meaning not available, + and otherwise an asking-price. + - when interest in `order($title, $offer-price, _, _)` appears, + asserts `order(title, offer-price, false, false)` for "no sale", otherwise + `order(title, offer-price, PositiveInteger, String)`, an accepted sale. + +## Role: BUYER + + - observes `bookQuote(title, $price)` to learn prices. + - observes `order(title, offer-price, $id, $delivery-date)` to make orders. + +## Role: SPLIT-PROPOSER + + - observes `splitProposal(title, asking-price, contribution, $accepted)` + to make a split-proposal and learn whether it was accepted or not. + +## Role: SPLIT-DISPOSER + + - when interest in `splitProposal($title, $asking-price, $contribution, _)` + appears, asserts `splitProposal(title, askingPrice, contribution, true)` + to indicate they are willing to go through with the deal, in which case + they then perform the role of BUYER for title/asking-price, or asserts + `splitProposal(title, asking-price, contribution, false)` to indicate they + are unwilling to go through with the deal. + +# A Sample Run + +Run the program with `../../bin/syndicatec index.js | node` from a +checkout of the Syndicate repository. + + A learns that the price of Catch 22 is 2.22 + A makes an offer to split the price of Catch 22 contributing 1.11 + B is being asked to contribute 1.11 toward Catch 22 at price 2.22 + B accepts the offer, leaving them with 3.8899999999999997 remaining funds + A learns that the split-proposal for Catch 22 was accepted + A learns that Encyclopaedia Brittannica is out-of-stock. + The order for Catch 22 has id 10001483, and will be delivered on March 9th + A learns that the price of Candide is 34.95 + A makes an offer to split the price of Candide contributing 17.475 + B is being asked to contribute 17.475 toward Candide at price 34.95 + B hasn't enough funds (3.8899999999999997 remaining) + A learns that the split-proposal for Candide was rejected + A makes an offer to split the price of Candide contributing 26.212500000000002 + B is being asked to contribute 8.7375 toward Candide at price 34.95 + B hasn't enough funds (3.8899999999999997 remaining) + A learns that the split-proposal for Candide was rejected + A makes an offer to split the price of Candide contributing 30.581250000000004 + B is being asked to contribute 4.368749999999999 toward Candide at price 34.95 + B hasn't enough funds (3.8899999999999997 remaining) + A learns that the split-proposal for Candide was rejected + A makes an offer to split the price of Candide contributing 32.765625 + B is being asked to contribute 2.184375000000003 toward Candide at price 34.95 + B accepts the offer, leaving them with 1.7056249999999968 remaining funds + A learns that the split-proposal for Candide was accepted + A learns that the price of The Wind in the Willows is 3.95 + A makes an offer to split the price of The Wind in the Willows contributing 1.975 + The order for Candide has id 10001484, and will be delivered on March 9th + B is being asked to contribute 1.975 toward The Wind in the Willows at price 3.95 + B hasn't enough funds (1.7056249999999968 remaining) + A learns that the split-proposal for The Wind in the Willows was rejected + A makes an offer to split the price of The Wind in the Willows contributing 2.9625000000000004 + B is being asked to contribute 0.9874999999999998 toward The Wind in the Willows at price 3.95 + B accepts the offer, leaving them with 0.718124999999997 remaining funds + A learns that the split-proposal for The Wind in the Willows was accepted + A has bought everything they wanted! + The order for The Wind in the Willows has id 10001485, and will be delivered on March 9th + +# The Code + +## Type Declarations + +First, we declare *assertion types* for our protocol. + + assertion type bookQuote(title, price); + assertion type order(title, price, id, deliveryDate); + + assertion type splitProposal(title, price, contribution, accepted); + +## Utilities + +This routine is under consideration for possible addition to the +core library. + + function whileRelevantAssert(P) { + react { + assert P; + } until { + case retracted Syndicate.observe(P); + } + } + +## Implementation: SELLER + + function seller() { + actor { + +We give our actor two state variables: a dictionary recording our +inventory of books (mapping title to price), and a counter +tracking the next order ID to be allocated. + + this.books = { + "The Wind in the Willows": 3.95, + "Catch 22": 2.22, + "Candide": 34.95 + }; + this.nextOrderId = 10001483; + +The seller responds to interest in bookQuotes by asserting a +responsive record, if one exists. + + react { + during Syndicate.observe(bookQuote($title, _)) { + assert bookQuote(title, title in this.books ? this.books[title] : false); + } + } + +It also responds to order requests. + + react { + on asserted Syndicate.observe(order($title, $offerPrice, _, _)) { + +We cannot sell a book we do not have, and we will not sell for +less than our asking price. + + var askingPrice = title in this.books ? this.books[title] : false; + if ((askingPrice === false) || (offerPrice < askingPrice)) { + whileRelevantAssert(order(title, offerPrice, false, false)); + } else { + +But if we can sell it, we do so by allocating an order ID and +replying to the orderer. + + var orderId = this.nextOrderId++; + delete this.books[title]; + + actor { + whileRelevantAssert(order(title, offerPrice, orderId, "March 9th")); + } + } + } + } + } + } + +## Implementation: SPLIT-PROPOSER and book-quote-requestor + + function buyerA() { + actor { + var self = this; + +Our actor remembers which books remain on its shopping list, and +tries to buy them one at a time, sharing costs with `buyerB`. + + self.titles = ["Catch 22", + "Encyclopaedia Brittannica", + "Candide", + "The Wind in the Willows"]; + +JavaScript's callback-oriented blocking means that we express our +loop in almost a tail-recursive style, using helper functions +`buyBooks` and `trySplit`. + + buyBooks(); + + function buyBooks() { + if (self.titles.length === 0) { + console.log("A has bought everything they wanted!"); + return; + } + + var title = self.titles.shift(); + +First, retrieve a quote for the title, and analyze the result. + + react until { + case asserted bookQuote(title, $price) { + if (price === false) { + console.log("A learns that "+title+" is out-of-stock."); + buyBooks(); + } else { + console.log("A learns that the price of "+title+" is "+price); + +Next, repeatedly make split offers to a SPLIT-DISPOSER until +either one is accepted, or the contribution from the +SPLIT-DISPOSER becomes pointlessly small. We start the process by +offering to split the price of the book evenly. + + trySplit(title, price, price / 2); + } + } + } + } + + function trySplit(title, price, contribution) { + console.log("A makes an offer to split the price of "+title+ + " contributing "+contribution); + +If we are about to offer to split the price, but the other buyer +would contribute less than 10c, then it's not worth bothering; we +may as well buy it ourselves. Another version of the program could +perform the BUYER role here. + + if (contribution > (price - 0.10)) { + console.log("A gives up on "+title+"."); + buyBooks(); + } else { + +Make our proposal, and wait for a response. + + react until { + case asserted splitProposal(title, price, contribution, true) { + console.log("A learns that the split-proposal for "+title+" was accepted"); + buyBooks(); + } + + case asserted splitProposal(title, price, contribution, false) { + console.log("A learns that the split-proposal for "+title+" was rejected"); + trySplit(title, price, contribution + ((price - contribution) / 2)); + } + } + } + } + } + } + +## Implementation: SPLIT-DISPOSER and BUYER + + function buyerB() { + actor { + +This actor maintains a record of the amount of money it has left +to spend. + + this.funds = 5.00; + +It spends its time waiting for a SPLIT-PROPOSER to offer a +`splitProposal`. + + react { + on asserted Syndicate.observe(splitProposal($title, $price, $theirContribution, _)) { + var myContribution = price - theirContribution; + console.log("B is being asked to contribute "+myContribution+" toward "+title+ + " at price "+price); + +We may not be able to afford contributing this much. + + if (myContribution > this.funds) { + console.log("B hasn't enough funds ("+this.funds+" remaining)"); + whileRelevantAssert(splitProposal(title, price, theirContribution, false)); + } else { + +But if we *can* afford it, update our remaining funds and spawn a +small actor to handle the actual purchase now that we have agreed +on a split. + + var remainingFunds = this.funds - myContribution; + console.log("B accepts the offer, leaving them with "+remainingFunds+" remaining funds"); + this.funds = remainingFunds; + + actor { + react { + +While waiting for order confirmation, take the opportunity to +signal to our SPLIT-PROPOSER that we accepted their proposal. + + assert splitProposal(title, price, theirContribution, true); + +When order confirmation arrives, this purchase is completed. + + } until { + case asserted order(title, price, $id, $date) { + console.log("The order for "+title+" has id "+id+ + ", and will be delivered on "+date); + } + } + } + } + } + } + } + } + +## Starting Configuration + + ground dataspace { + seller(); + buyerA(); + buyerB(); + }