From 66de889f4b715553ebe06cb841577fbe8b79495a Mon Sep 17 00:00:00 2001 From: David Majda Date: Tue, 8 Jun 2010 09:15:09 +0200 Subject: [PATCH] Implement initializers --- lib/compiler.js | 43 +- lib/metagrammar.js | 2437 +++++++++++++++++++------------------- lib/metagrammar.pegjs | 20 +- test/compiler-test.js | 12 + test/metagrammar-test.js | 46 +- 5 files changed, 1341 insertions(+), 1217 deletions(-) diff --git a/lib/compiler.js b/lib/compiler.js index ec248e5..58abb5d 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -285,7 +285,7 @@ PEG.Compiler = { rule_ref: function(node) { - if (typeof(ast[node.name]) === "undefined") { + if (typeof(ast.rules[node.name]) === "undefined") { throw new PEG.GrammarError( "Referenced rule \"" + node.name + "\" does not exist." ); @@ -299,14 +299,14 @@ PEG.Compiler = { function check(node) { checkFunctions[node.type](node); } - for (var rule in ast) { - check(ast[rule]); + for (var rule in ast.rules) { + check(ast.rules[rule]); } }, /* Checks that the start rule is defined. */ function(ast, startRule) { - if (typeof(ast[startRule]) === "undefined") { + if (typeof(ast.rules[startRule]) === "undefined") { throw new PEG.GrammarError( "Missing \"" + startRule + "\" rule." ); @@ -356,7 +356,7 @@ PEG.Compiler = { "Left recursion detected for rule \"" + node.name + "\"." ); } - check(ast[node.name], appliedRules); + check(ast.rules[node.name], appliedRules); }, literal: nop, @@ -368,8 +368,8 @@ PEG.Compiler = { checkFunctions[node.type](node, appliedRules); } - for (var rule in ast) { - check(ast[rule], []); + for (var rule in ast.rules) { + check(ast.rules[rule], []); } } ], @@ -432,18 +432,18 @@ PEG.Compiler = { replaceFunctions[node.type](node, from, to); } - for (var rule in ast) { - replace(ast[rule], from, to); + for (var rule in ast.rules) { + replace(ast.rules[rule], from, to); } } - for (var rule in ast) { - if (isProxyRule(ast[rule])) { - replaceRuleRefs(ast, ast[rule].name, ast[rule].expression.name); + for (var rule in ast.rules) { + if (isProxyRule(ast.rules[rule])) { + replaceRuleRefs(ast, ast.rules[rule].name, ast.rules[rule].expression.name); if (rule === startRule) { - startRule = ast[rule].expression.name; + startRule = ast.rules[rule].expression.name; } - delete ast[rule]; + delete ast.rules[rule]; } } @@ -452,6 +452,10 @@ PEG.Compiler = { ], _compileFunctions: { + initializer: function(node) { + return node.code; + }, + rule: function(node) { var resultVar = PEG.Compiler.generateUniqueIdentifier("result"); @@ -871,9 +875,13 @@ PEG.Compiler = { startRule = newAstNadStartRule[1]; } + var initializerCode = ast.initializer !== null + ? this.compileNode(ast.initializer) + : ""; + var parseFunctionDefinitions = []; - for (var rule in ast) { - parseFunctionDefinitions.push(this.compileNode(ast[rule])); + for (var rule in ast.rules) { + parseFunctionDefinitions.push(this.compileNode(ast.rules[rule])); } var source = this.formatCode( @@ -998,6 +1006,8 @@ PEG.Compiler = { " return { line: line, column: column };", " }", " ", + " ${initializerCode}", + " ", " var result = parse_${startRule}({ reportMatchFailures: true });", " ", " /*", @@ -1054,6 +1064,7 @@ PEG.Compiler = { " return result;", "})()", { + initializerCode: initializerCode, parseFunctionDefinitions: parseFunctionDefinitions.join("\n\n"), startRule: startRule } diff --git a/lib/metagrammar.js b/lib/metagrammar.js index c45a59e..ecabcd7 100644 --- a/lib/metagrammar.js +++ b/lib/metagrammar.js @@ -72,18 +72,25 @@ PEG.grammarParser = (function(){ var savedPos0 = pos; var result2 = parse___(context); if (result2 !== null) { - var result4 = parse_rule(context); - if (result4 !== null) { - var result3 = []; - while (result4 !== null) { - result3.push(result4); - var result4 = parse_rule(context); - } - } else { - var result3 = null; - } + var result6 = parse_initializer(context); + var result3 = result6 !== null ? result6 : ''; if (result3 !== null) { - var result1 = [result2, result3]; + var result5 = parse_rule(context); + if (result5 !== null) { + var result4 = []; + while (result5 !== null) { + result4.push(result5); + var result5 = parse_rule(context); + } + } else { + var result4 = null; + } + if (result4 !== null) { + var result1 = [result2, result3, result4]; + } else { + var result1 = null; + pos = savedPos0; + } } else { var result1 = null; pos = savedPos0; @@ -93,11 +100,15 @@ PEG.grammarParser = (function(){ pos = savedPos0; } var result0 = result1 !== null - ? (function(rules) { - var result = {}; - PEG.ArrayUtils.each(rules, function(rule) { result[rule.name] = rule; }); - return result; - })(result1[1]) + ? (function(initializer, rules) { + var rulesConverted = {}; + PEG.ArrayUtils.each(rules, function(rule) { rulesConverted[rule.name] = rule; }); + + return { + initializer: initializer !== "" ? initializer : null, + rules: rulesConverted + } + })(result1[1], result1[2]) : null; @@ -109,6 +120,48 @@ PEG.grammarParser = (function(){ return result0; } + function parse_initializer(context) { + var cacheKey = "initializer" + '@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos1 = pos; + var result9 = parse_action(context); + if (result9 !== null) { + var result11 = parse_semicolon(context); + var result10 = result11 !== null ? result11 : ''; + if (result10 !== null) { + var result8 = [result9, result10]; + } else { + var result8 = null; + pos = savedPos1; + } + } else { + var result8 = null; + pos = savedPos1; + } + var result7 = result8 !== null + ? (function(code) { + return { + type: "initializer", + code: code + }; + })(result8[0]) + : null; + + + + cache[cacheKey] = { + nextPos: pos, + result: result7 + }; + return result7; + } + function parse_rule(context) { var cacheKey = "rule" + '@' + pos; var cachedResult = cache[cacheKey]; @@ -118,58 +171,58 @@ PEG.grammarParser = (function(){ } - var savedPos1 = pos; - var result7 = parse_identifier(context); - if (result7 !== null) { - var result14 = parse_literal(context); - if (result14 !== null) { - var result8 = result14; + var savedPos2 = pos; + var result14 = parse_identifier(context); + if (result14 !== null) { + var result21 = parse_literal(context); + if (result21 !== null) { + var result15 = result21; } else { if (input.substr(pos, 0) === "") { - var result13 = ""; + var result20 = ""; pos += 0; } else { - var result13 = null; + var result20 = null; if (context.reportMatchFailures) { matchFailed(quoteString("")); } } - if (result13 !== null) { - var result8 = result13; + if (result20 !== null) { + var result15 = result20; } else { - var result8 = null;; + var result15 = null;; }; } - if (result8 !== null) { - var result9 = parse_equals(context); - if (result9 !== null) { - var result10 = parse_choice(context); - if (result10 !== null) { - var result12 = parse_semicolon(context); - var result11 = result12 !== null ? result12 : ''; - if (result11 !== null) { - var result6 = [result7, result8, result9, result10, result11]; + if (result15 !== null) { + var result16 = parse_equals(context); + if (result16 !== null) { + var result17 = parse_choice(context); + if (result17 !== null) { + var result19 = parse_semicolon(context); + var result18 = result19 !== null ? result19 : ''; + if (result18 !== null) { + var result13 = [result14, result15, result16, result17, result18]; } else { - var result6 = null; - pos = savedPos1; + var result13 = null; + pos = savedPos2; } } else { - var result6 = null; - pos = savedPos1; + var result13 = null; + pos = savedPos2; } } else { - var result6 = null; - pos = savedPos1; + var result13 = null; + pos = savedPos2; } } else { - var result6 = null; - pos = savedPos1; + var result13 = null; + pos = savedPos2; } } else { - var result6 = null; - pos = savedPos1; + var result13 = null; + pos = savedPos2; } - var result5 = result6 !== null + var result12 = result13 !== null ? (function(name, displayName, expression) { return { type: "rule", @@ -177,16 +230,16 @@ PEG.grammarParser = (function(){ displayName: displayName !== "" ? displayName : null, expression: expression }; - })(result6[0], result6[1], result6[3]) + })(result13[0], result13[1], result13[3]) : null; cache[cacheKey] = { nextPos: pos, - result: result5 + result: result12 }; - return result5; + return result12; } function parse_choice(context) { @@ -198,52 +251,52 @@ PEG.grammarParser = (function(){ } - var savedPos2 = pos; - var result17 = parse_sequence(context); - if (result17 !== null) { - var result18 = []; - var savedPos3 = pos; - var result20 = parse_slash(context); - if (result20 !== null) { - var result21 = parse_sequence(context); - if (result21 !== null) { - var result19 = [result20, result21]; + var savedPos3 = pos; + var result24 = parse_sequence(context); + if (result24 !== null) { + var result25 = []; + var savedPos4 = pos; + var result27 = parse_slash(context); + if (result27 !== null) { + var result28 = parse_sequence(context); + if (result28 !== null) { + var result26 = [result27, result28]; } else { - var result19 = null; - pos = savedPos3; + var result26 = null; + pos = savedPos4; } } else { - var result19 = null; - pos = savedPos3; + var result26 = null; + pos = savedPos4; } - while (result19 !== null) { - result18.push(result19); - var savedPos3 = pos; - var result20 = parse_slash(context); - if (result20 !== null) { - var result21 = parse_sequence(context); - if (result21 !== null) { - var result19 = [result20, result21]; + while (result26 !== null) { + result25.push(result26); + var savedPos4 = pos; + var result27 = parse_slash(context); + if (result27 !== null) { + var result28 = parse_sequence(context); + if (result28 !== null) { + var result26 = [result27, result28]; } else { - var result19 = null; - pos = savedPos3; + var result26 = null; + pos = savedPos4; } } else { - var result19 = null; - pos = savedPos3; + var result26 = null; + pos = savedPos4; } } - if (result18 !== null) { - var result16 = [result17, result18]; + if (result25 !== null) { + var result23 = [result24, result25]; } else { - var result16 = null; - pos = savedPos2; + var result23 = null; + pos = savedPos3; } } else { - var result16 = null; - pos = savedPos2; + var result23 = null; + pos = savedPos3; } - var result15 = result16 !== null + var result22 = result23 !== null ? (function(head, tail) { if (tail.length > 0) { var alternatives = [head].concat(PEG.ArrayUtils.map( @@ -257,16 +310,16 @@ PEG.grammarParser = (function(){ } else { return head; } - })(result16[0], result16[1]) + })(result23[0], result23[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result15 + result: result22 }; - return result15; + return result22; } function parse_sequence(context) { @@ -278,26 +331,26 @@ PEG.grammarParser = (function(){ } - var savedPos4 = pos; - var result28 = []; - var result30 = parse_labeled(context); - while (result30 !== null) { - result28.push(result30); - var result30 = parse_labeled(context); + var savedPos5 = pos; + var result35 = []; + var result37 = parse_labeled(context); + while (result37 !== null) { + result35.push(result37); + var result37 = parse_labeled(context); } - if (result28 !== null) { - var result29 = parse_action(context); - if (result29 !== null) { - var result27 = [result28, result29]; + if (result35 !== null) { + var result36 = parse_action(context); + if (result36 !== null) { + var result34 = [result35, result36]; } else { - var result27 = null; - pos = savedPos4; + var result34 = null; + pos = savedPos5; } } else { - var result27 = null; - pos = savedPos4; + var result34 = null; + pos = savedPos5; } - var result26 = result27 !== null + var result33 = result34 !== null ? (function(elements, code) { var expression = elements.length != 1 ? { @@ -310,18 +363,18 @@ PEG.grammarParser = (function(){ expression: expression, code: code }; - })(result27[0], result27[1]) + })(result34[0], result34[1]) : null; - if (result26 !== null) { - var result22 = result26; + if (result33 !== null) { + var result29 = result33; } else { - var result24 = []; - var result25 = parse_labeled(context); - while (result25 !== null) { - result24.push(result25); - var result25 = parse_labeled(context); + var result31 = []; + var result32 = parse_labeled(context); + while (result32 !== null) { + result31.push(result32); + var result32 = parse_labeled(context); } - var result23 = result24 !== null + var result30 = result31 !== null ? (function(elements) { return elements.length != 1 ? { @@ -329,12 +382,12 @@ PEG.grammarParser = (function(){ elements: elements } : elements[0]; - })(result24) + })(result31) : null; - if (result23 !== null) { - var result22 = result23; + if (result30 !== null) { + var result29 = result30; } else { - var result22 = null;; + var result29 = null;; }; } @@ -342,9 +395,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result22 + result: result29 }; - return result22; + return result29; } function parse_labeled(context) { @@ -356,43 +409,43 @@ PEG.grammarParser = (function(){ } - var savedPos5 = pos; - var result35 = parse_identifier(context); - if (result35 !== null) { - var result36 = parse_colon(context); - if (result36 !== null) { - var result37 = parse_prefixed(context); - if (result37 !== null) { - var result34 = [result35, result36, result37]; + var savedPos6 = pos; + var result42 = parse_identifier(context); + if (result42 !== null) { + var result43 = parse_colon(context); + if (result43 !== null) { + var result44 = parse_prefixed(context); + if (result44 !== null) { + var result41 = [result42, result43, result44]; } else { - var result34 = null; - pos = savedPos5; + var result41 = null; + pos = savedPos6; } } else { - var result34 = null; - pos = savedPos5; + var result41 = null; + pos = savedPos6; } } else { - var result34 = null; - pos = savedPos5; + var result41 = null; + pos = savedPos6; } - var result33 = result34 !== null + var result40 = result41 !== null ? (function(label, expression) { return { type: "labeled", label: label, expression: expression }; - })(result34[0], result34[2]) + })(result41[0], result41[2]) : null; - if (result33 !== null) { - var result31 = result33; + if (result40 !== null) { + var result38 = result40; } else { - var result32 = parse_prefixed(context); - if (result32 !== null) { - var result31 = result32; + var result39 = parse_prefixed(context); + if (result39 !== null) { + var result38 = result39; } else { - var result31 = null;; + var result38 = null;; }; } @@ -400,9 +453,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result31 + result: result38 }; - return result31; + return result38; } function parse_prefixed(context) { @@ -414,61 +467,61 @@ PEG.grammarParser = (function(){ } - var savedPos7 = pos; - var result46 = parse_and(context); - if (result46 !== null) { - var result47 = parse_suffixed(context); - if (result47 !== null) { - var result45 = [result46, result47]; + var savedPos8 = pos; + var result53 = parse_and(context); + if (result53 !== null) { + var result54 = parse_suffixed(context); + if (result54 !== null) { + var result52 = [result53, result54]; } else { - var result45 = null; - pos = savedPos7; + var result52 = null; + pos = savedPos8; } } else { - var result45 = null; - pos = savedPos7; + var result52 = null; + pos = savedPos8; } - var result44 = result45 !== null + var result51 = result52 !== null ? (function(expression) { return { type: "and_predicate", expression: expression }; - })(result45[1]) + })(result52[1]) : null; - if (result44 !== null) { - var result38 = result44; - } else { - var savedPos6 = pos; - var result42 = parse_not(context); - if (result42 !== null) { - var result43 = parse_suffixed(context); - if (result43 !== null) { - var result41 = [result42, result43]; + if (result51 !== null) { + var result45 = result51; + } else { + var savedPos7 = pos; + var result49 = parse_not(context); + if (result49 !== null) { + var result50 = parse_suffixed(context); + if (result50 !== null) { + var result48 = [result49, result50]; } else { - var result41 = null; - pos = savedPos6; + var result48 = null; + pos = savedPos7; } } else { - var result41 = null; - pos = savedPos6; + var result48 = null; + pos = savedPos7; } - var result40 = result41 !== null + var result47 = result48 !== null ? (function(expression) { return { type: "not_predicate", expression: expression }; - })(result41[1]) + })(result48[1]) : null; - if (result40 !== null) { - var result38 = result40; + if (result47 !== null) { + var result45 = result47; } else { - var result39 = parse_suffixed(context); - if (result39 !== null) { - var result38 = result39; + var result46 = parse_suffixed(context); + if (result46 !== null) { + var result45 = result46; } else { - var result38 = null;; + var result45 = null;; }; }; } @@ -477,9 +530,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result38 + result: result45 }; - return result38; + return result45; } function parse_suffixed(context) { @@ -491,86 +544,86 @@ PEG.grammarParser = (function(){ } - var savedPos10 = pos; - var result60 = parse_primary(context); - if (result60 !== null) { - var result61 = parse_question(context); - if (result61 !== null) { - var result59 = [result60, result61]; + var savedPos11 = pos; + var result67 = parse_primary(context); + if (result67 !== null) { + var result68 = parse_question(context); + if (result68 !== null) { + var result66 = [result67, result68]; } else { - var result59 = null; - pos = savedPos10; + var result66 = null; + pos = savedPos11; } } else { - var result59 = null; - pos = savedPos10; + var result66 = null; + pos = savedPos11; } - var result58 = result59 !== null + var result65 = result66 !== null ? (function(expression) { return { type: "optional", expression: expression }; - })(result59[0]) + })(result66[0]) : null; - if (result58 !== null) { - var result48 = result58; - } else { - var savedPos9 = pos; - var result56 = parse_primary(context); - if (result56 !== null) { - var result57 = parse_star(context); - if (result57 !== null) { - var result55 = [result56, result57]; + if (result65 !== null) { + var result55 = result65; + } else { + var savedPos10 = pos; + var result63 = parse_primary(context); + if (result63 !== null) { + var result64 = parse_star(context); + if (result64 !== null) { + var result62 = [result63, result64]; } else { - var result55 = null; - pos = savedPos9; + var result62 = null; + pos = savedPos10; } } else { - var result55 = null; - pos = savedPos9; + var result62 = null; + pos = savedPos10; } - var result54 = result55 !== null + var result61 = result62 !== null ? (function(expression) { return { type: "zero_or_more", expression: expression }; - })(result55[0]) + })(result62[0]) : null; - if (result54 !== null) { - var result48 = result54; - } else { - var savedPos8 = pos; - var result52 = parse_primary(context); - if (result52 !== null) { - var result53 = parse_plus(context); - if (result53 !== null) { - var result51 = [result52, result53]; + if (result61 !== null) { + var result55 = result61; + } else { + var savedPos9 = pos; + var result59 = parse_primary(context); + if (result59 !== null) { + var result60 = parse_plus(context); + if (result60 !== null) { + var result58 = [result59, result60]; } else { - var result51 = null; - pos = savedPos8; + var result58 = null; + pos = savedPos9; } } else { - var result51 = null; - pos = savedPos8; + var result58 = null; + pos = savedPos9; } - var result50 = result51 !== null + var result57 = result58 !== null ? (function(expression) { return { type: "one_or_more", expression: expression }; - })(result51[0]) + })(result58[0]) : null; - if (result50 !== null) { - var result48 = result50; + if (result57 !== null) { + var result55 = result57; } else { - var result49 = parse_primary(context); - if (result49 !== null) { - var result48 = result49; + var result56 = parse_primary(context); + if (result56 !== null) { + var result55 = result56; } else { - var result48 = null;; + var result55 = null;; }; }; }; @@ -580,9 +633,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result48 + result: result55 }; - return result48; + return result55; } function parse_primary(context) { @@ -594,122 +647,122 @@ PEG.grammarParser = (function(){ } - var savedPos12 = pos; - var result75 = parse_identifier(context); - if (result75 !== null) { - var savedPos13 = pos; + var savedPos13 = pos; + var result82 = parse_identifier(context); + if (result82 !== null) { + var savedPos14 = pos; var savedReportMatchFailuresVar0 = context.reportMatchFailures; context.reportMatchFailures = false; - var savedPos14 = pos; - var result81 = parse_literal(context); - if (result81 !== null) { - var result78 = result81; + var savedPos15 = pos; + var result88 = parse_literal(context); + if (result88 !== null) { + var result85 = result88; } else { if (input.substr(pos, 0) === "") { - var result80 = ""; + var result87 = ""; pos += 0; } else { - var result80 = null; + var result87 = null; if (context.reportMatchFailures) { matchFailed(quoteString("")); } } - if (result80 !== null) { - var result78 = result80; + if (result87 !== null) { + var result85 = result87; } else { - var result78 = null;; + var result85 = null;; }; } - if (result78 !== null) { - var result79 = parse_equals(context); - if (result79 !== null) { - var result77 = [result78, result79]; + if (result85 !== null) { + var result86 = parse_equals(context); + if (result86 !== null) { + var result84 = [result85, result86]; } else { - var result77 = null; - pos = savedPos14; + var result84 = null; + pos = savedPos15; } } else { - var result77 = null; - pos = savedPos14; + var result84 = null; + pos = savedPos15; } context.reportMatchFailures = savedReportMatchFailuresVar0; - if (result77 === null) { - var result76 = ''; + if (result84 === null) { + var result83 = ''; } else { - var result76 = null; - pos = savedPos13; + var result83 = null; + pos = savedPos14; } - if (result76 !== null) { - var result74 = [result75, result76]; + if (result83 !== null) { + var result81 = [result82, result83]; } else { - var result74 = null; - pos = savedPos12; + var result81 = null; + pos = savedPos13; } } else { - var result74 = null; - pos = savedPos12; + var result81 = null; + pos = savedPos13; } - var result73 = result74 !== null + var result80 = result81 !== null ? (function(name) { return { type: "rule_ref", name: name }; - })(result74[0]) + })(result81[0]) : null; - if (result73 !== null) { - var result62 = result73; + if (result80 !== null) { + var result69 = result80; } else { - var result72 = parse_literal(context); - var result71 = result72 !== null + var result79 = parse_literal(context); + var result78 = result79 !== null ? (function(value) { return { type: "literal", value: value }; - })(result72) + })(result79) : null; - if (result71 !== null) { - var result62 = result71; + if (result78 !== null) { + var result69 = result78; } else { - var result70 = parse_dot(context); - var result69 = result70 !== null + var result77 = parse_dot(context); + var result76 = result77 !== null ? (function() { return { type: "any" }; })() : null; - if (result69 !== null) { - var result62 = result69; + if (result76 !== null) { + var result69 = result76; } else { - var result68 = parse_class(context); - if (result68 !== null) { - var result62 = result68; + var result75 = parse_class(context); + if (result75 !== null) { + var result69 = result75; } else { - var savedPos11 = pos; - var result65 = parse_lparen(context); - if (result65 !== null) { - var result66 = parse_choice(context); - if (result66 !== null) { - var result67 = parse_rparen(context); - if (result67 !== null) { - var result64 = [result65, result66, result67]; + var savedPos12 = pos; + var result72 = parse_lparen(context); + if (result72 !== null) { + var result73 = parse_choice(context); + if (result73 !== null) { + var result74 = parse_rparen(context); + if (result74 !== null) { + var result71 = [result72, result73, result74]; } else { - var result64 = null; - pos = savedPos11; + var result71 = null; + pos = savedPos12; } } else { - var result64 = null; - pos = savedPos11; + var result71 = null; + pos = savedPos12; } } else { - var result64 = null; - pos = savedPos11; + var result71 = null; + pos = savedPos12; } - var result63 = result64 !== null - ? (function(expression) { return expression; })(result64[1]) + var result70 = result71 !== null + ? (function(expression) { return expression; })(result71[1]) : null; - if (result63 !== null) { - var result62 = result63; + if (result70 !== null) { + var result69 = result70; } else { - var result62 = null;; + var result69 = null;; }; }; }; @@ -720,9 +773,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result62 + result: result69 }; - return result62; + return result69; } function parse_action(context) { @@ -735,33 +788,33 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; - var savedPos15 = pos; - var result84 = parse_braced(context); - if (result84 !== null) { - var result85 = parse___(context); - if (result85 !== null) { - var result83 = [result84, result85]; + var savedPos16 = pos; + var result91 = parse_braced(context); + if (result91 !== null) { + var result92 = parse___(context); + if (result92 !== null) { + var result90 = [result91, result92]; } else { - var result83 = null; - pos = savedPos15; + var result90 = null; + pos = savedPos16; } } else { - var result83 = null; - pos = savedPos15; + var result90 = null; + pos = savedPos16; } - var result82 = result83 !== null - ? (function(braced) { return braced.substr(1, braced.length - 2); })(result83[0]) + var result89 = result90 !== null + ? (function(braced) { return braced.substr(1, braced.length - 2); })(result90[0]) : null; context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result82 === null) { + if (context.reportMatchFailures && result89 === null) { matchFailed("action"); } cache[cacheKey] = { nextPos: pos, - result: result82 + result: result89 }; - return result82; + return result89; } function parse_braced(context) { @@ -773,80 +826,80 @@ PEG.grammarParser = (function(){ } - var savedPos16 = pos; + var savedPos17 = pos; if (input.substr(pos, 1) === "{") { - var result88 = "{"; + var result95 = "{"; pos += 1; } else { - var result88 = null; + var result95 = null; if (context.reportMatchFailures) { matchFailed(quoteString("{")); } } - if (result88 !== null) { - var result89 = []; - var result93 = parse_braced(context); - if (result93 !== null) { - var result91 = result93; + if (result95 !== null) { + var result96 = []; + var result100 = parse_braced(context); + if (result100 !== null) { + var result98 = result100; } else { - var result92 = parse_nonBraceCharacter(context); - if (result92 !== null) { - var result91 = result92; + var result99 = parse_nonBraceCharacter(context); + if (result99 !== null) { + var result98 = result99; } else { - var result91 = null;; + var result98 = null;; }; } - while (result91 !== null) { - result89.push(result91); - var result93 = parse_braced(context); - if (result93 !== null) { - var result91 = result93; + while (result98 !== null) { + result96.push(result98); + var result100 = parse_braced(context); + if (result100 !== null) { + var result98 = result100; } else { - var result92 = parse_nonBraceCharacter(context); - if (result92 !== null) { - var result91 = result92; + var result99 = parse_nonBraceCharacter(context); + if (result99 !== null) { + var result98 = result99; } else { - var result91 = null;; + var result98 = null;; }; } } - if (result89 !== null) { + if (result96 !== null) { if (input.substr(pos, 1) === "}") { - var result90 = "}"; + var result97 = "}"; pos += 1; } else { - var result90 = null; + var result97 = null; if (context.reportMatchFailures) { matchFailed(quoteString("}")); } } - if (result90 !== null) { - var result87 = [result88, result89, result90]; + if (result97 !== null) { + var result94 = [result95, result96, result97]; } else { - var result87 = null; - pos = savedPos16; + var result94 = null; + pos = savedPos17; } } else { - var result87 = null; - pos = savedPos16; + var result94 = null; + pos = savedPos17; } } else { - var result87 = null; - pos = savedPos16; + var result94 = null; + pos = savedPos17; } - var result86 = result87 !== null + var result93 = result94 !== null ? (function(parts) { return "{" + parts.join("") + "}"; - })(result87[1]) + })(result94[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result86 + result: result93 }; - return result86; + return result93; } function parse_nonBraceCharacters(context) { @@ -858,27 +911,27 @@ PEG.grammarParser = (function(){ } - var result96 = parse_nonBraceCharacter(context); - if (result96 !== null) { - var result95 = []; - while (result96 !== null) { - result95.push(result96); - var result96 = parse_nonBraceCharacter(context); + var result103 = parse_nonBraceCharacter(context); + if (result103 !== null) { + var result102 = []; + while (result103 !== null) { + result102.push(result103); + var result103 = parse_nonBraceCharacter(context); } } else { - var result95 = null; + var result102 = null; } - var result94 = result95 !== null - ? (function(chars) { return chars.join(""); })(result95) + var result101 = result102 !== null + ? (function(chars) { return chars.join(""); })(result102) : null; cache[cacheKey] = { nextPos: pos, - result: result94 + result: result101 }; - return result94; + return result101; } function parse_nonBraceCharacter(context) { @@ -891,10 +944,10 @@ PEG.grammarParser = (function(){ if (input.substr(pos).match(/^[^{}]/) !== null) { - var result97 = input.charAt(pos); + var result104 = input.charAt(pos); pos++; } else { - var result97 = null; + var result104 = null; if (context.reportMatchFailures) { matchFailed("[^{}]"); } @@ -904,9 +957,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result97 + result: result104 }; - return result97; + return result104; } function parse_equals(context) { @@ -918,29 +971,29 @@ PEG.grammarParser = (function(){ } - var savedPos17 = pos; + var savedPos18 = pos; if (input.substr(pos, 1) === "=") { - var result100 = "="; + var result107 = "="; pos += 1; } else { - var result100 = null; + var result107 = null; if (context.reportMatchFailures) { matchFailed(quoteString("=")); } } - if (result100 !== null) { - var result101 = parse___(context); - if (result101 !== null) { - var result99 = [result100, result101]; + if (result107 !== null) { + var result108 = parse___(context); + if (result108 !== null) { + var result106 = [result107, result108]; } else { - var result99 = null; - pos = savedPos17; + var result106 = null; + pos = savedPos18; } } else { - var result99 = null; - pos = savedPos17; + var result106 = null; + pos = savedPos18; } - var result98 = result99 !== null + var result105 = result106 !== null ? (function() { return "="; })() : null; @@ -948,9 +1001,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result98 + result: result105 }; - return result98; + return result105; } function parse_colon(context) { @@ -962,29 +1015,29 @@ PEG.grammarParser = (function(){ } - var savedPos18 = pos; + var savedPos19 = pos; if (input.substr(pos, 1) === ":") { - var result104 = ":"; + var result111 = ":"; pos += 1; } else { - var result104 = null; + var result111 = null; if (context.reportMatchFailures) { matchFailed(quoteString(":")); } } - if (result104 !== null) { - var result105 = parse___(context); - if (result105 !== null) { - var result103 = [result104, result105]; + if (result111 !== null) { + var result112 = parse___(context); + if (result112 !== null) { + var result110 = [result111, result112]; } else { - var result103 = null; - pos = savedPos18; + var result110 = null; + pos = savedPos19; } } else { - var result103 = null; - pos = savedPos18; + var result110 = null; + pos = savedPos19; } - var result102 = result103 !== null + var result109 = result110 !== null ? (function() { return ":"; })() : null; @@ -992,9 +1045,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result102 + result: result109 }; - return result102; + return result109; } function parse_semicolon(context) { @@ -1006,29 +1059,29 @@ PEG.grammarParser = (function(){ } - var savedPos19 = pos; + var savedPos20 = pos; if (input.substr(pos, 1) === ";") { - var result108 = ";"; + var result115 = ";"; pos += 1; } else { - var result108 = null; + var result115 = null; if (context.reportMatchFailures) { matchFailed(quoteString(";")); } } - if (result108 !== null) { - var result109 = parse___(context); - if (result109 !== null) { - var result107 = [result108, result109]; + if (result115 !== null) { + var result116 = parse___(context); + if (result116 !== null) { + var result114 = [result115, result116]; } else { - var result107 = null; - pos = savedPos19; + var result114 = null; + pos = savedPos20; } } else { - var result107 = null; - pos = savedPos19; + var result114 = null; + pos = savedPos20; } - var result106 = result107 !== null + var result113 = result114 !== null ? (function() { return ";"; })() : null; @@ -1036,9 +1089,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result106 + result: result113 }; - return result106; + return result113; } function parse_slash(context) { @@ -1050,29 +1103,29 @@ PEG.grammarParser = (function(){ } - var savedPos20 = pos; + var savedPos21 = pos; if (input.substr(pos, 1) === "/") { - var result112 = "/"; + var result119 = "/"; pos += 1; } else { - var result112 = null; + var result119 = null; if (context.reportMatchFailures) { matchFailed(quoteString("/")); } } - if (result112 !== null) { - var result113 = parse___(context); - if (result113 !== null) { - var result111 = [result112, result113]; + if (result119 !== null) { + var result120 = parse___(context); + if (result120 !== null) { + var result118 = [result119, result120]; } else { - var result111 = null; - pos = savedPos20; + var result118 = null; + pos = savedPos21; } } else { - var result111 = null; - pos = savedPos20; + var result118 = null; + pos = savedPos21; } - var result110 = result111 !== null + var result117 = result118 !== null ? (function() { return "/"; })() : null; @@ -1080,9 +1133,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result110 + result: result117 }; - return result110; + return result117; } function parse_and(context) { @@ -1094,29 +1147,29 @@ PEG.grammarParser = (function(){ } - var savedPos21 = pos; + var savedPos22 = pos; if (input.substr(pos, 1) === "&") { - var result116 = "&"; + var result123 = "&"; pos += 1; } else { - var result116 = null; + var result123 = null; if (context.reportMatchFailures) { matchFailed(quoteString("&")); } } - if (result116 !== null) { - var result117 = parse___(context); - if (result117 !== null) { - var result115 = [result116, result117]; + if (result123 !== null) { + var result124 = parse___(context); + if (result124 !== null) { + var result122 = [result123, result124]; } else { - var result115 = null; - pos = savedPos21; + var result122 = null; + pos = savedPos22; } } else { - var result115 = null; - pos = savedPos21; + var result122 = null; + pos = savedPos22; } - var result114 = result115 !== null + var result121 = result122 !== null ? (function() { return "&"; })() : null; @@ -1124,9 +1177,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result114 + result: result121 }; - return result114; + return result121; } function parse_not(context) { @@ -1138,29 +1191,29 @@ PEG.grammarParser = (function(){ } - var savedPos22 = pos; + var savedPos23 = pos; if (input.substr(pos, 1) === "!") { - var result120 = "!"; + var result127 = "!"; pos += 1; } else { - var result120 = null; + var result127 = null; if (context.reportMatchFailures) { matchFailed(quoteString("!")); } } - if (result120 !== null) { - var result121 = parse___(context); - if (result121 !== null) { - var result119 = [result120, result121]; + if (result127 !== null) { + var result128 = parse___(context); + if (result128 !== null) { + var result126 = [result127, result128]; } else { - var result119 = null; - pos = savedPos22; + var result126 = null; + pos = savedPos23; } } else { - var result119 = null; - pos = savedPos22; + var result126 = null; + pos = savedPos23; } - var result118 = result119 !== null + var result125 = result126 !== null ? (function() { return "!"; })() : null; @@ -1168,9 +1221,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result118 + result: result125 }; - return result118; + return result125; } function parse_question(context) { @@ -1182,29 +1235,29 @@ PEG.grammarParser = (function(){ } - var savedPos23 = pos; + var savedPos24 = pos; if (input.substr(pos, 1) === "?") { - var result124 = "?"; + var result131 = "?"; pos += 1; } else { - var result124 = null; + var result131 = null; if (context.reportMatchFailures) { matchFailed(quoteString("?")); } } - if (result124 !== null) { - var result125 = parse___(context); - if (result125 !== null) { - var result123 = [result124, result125]; + if (result131 !== null) { + var result132 = parse___(context); + if (result132 !== null) { + var result130 = [result131, result132]; } else { - var result123 = null; - pos = savedPos23; + var result130 = null; + pos = savedPos24; } } else { - var result123 = null; - pos = savedPos23; + var result130 = null; + pos = savedPos24; } - var result122 = result123 !== null + var result129 = result130 !== null ? (function() { return "?"; })() : null; @@ -1212,9 +1265,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result122 + result: result129 }; - return result122; + return result129; } function parse_star(context) { @@ -1226,29 +1279,29 @@ PEG.grammarParser = (function(){ } - var savedPos24 = pos; + var savedPos25 = pos; if (input.substr(pos, 1) === "*") { - var result128 = "*"; + var result135 = "*"; pos += 1; } else { - var result128 = null; + var result135 = null; if (context.reportMatchFailures) { matchFailed(quoteString("*")); } } - if (result128 !== null) { - var result129 = parse___(context); - if (result129 !== null) { - var result127 = [result128, result129]; + if (result135 !== null) { + var result136 = parse___(context); + if (result136 !== null) { + var result134 = [result135, result136]; } else { - var result127 = null; - pos = savedPos24; + var result134 = null; + pos = savedPos25; } } else { - var result127 = null; - pos = savedPos24; + var result134 = null; + pos = savedPos25; } - var result126 = result127 !== null + var result133 = result134 !== null ? (function() { return "*"; })() : null; @@ -1256,9 +1309,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result126 + result: result133 }; - return result126; + return result133; } function parse_plus(context) { @@ -1270,29 +1323,29 @@ PEG.grammarParser = (function(){ } - var savedPos25 = pos; + var savedPos26 = pos; if (input.substr(pos, 1) === "+") { - var result132 = "+"; + var result139 = "+"; pos += 1; } else { - var result132 = null; + var result139 = null; if (context.reportMatchFailures) { matchFailed(quoteString("+")); } } - if (result132 !== null) { - var result133 = parse___(context); - if (result133 !== null) { - var result131 = [result132, result133]; + if (result139 !== null) { + var result140 = parse___(context); + if (result140 !== null) { + var result138 = [result139, result140]; } else { - var result131 = null; - pos = savedPos25; + var result138 = null; + pos = savedPos26; } } else { - var result131 = null; - pos = savedPos25; + var result138 = null; + pos = savedPos26; } - var result130 = result131 !== null + var result137 = result138 !== null ? (function() { return "+"; })() : null; @@ -1300,9 +1353,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result130 + result: result137 }; - return result130; + return result137; } function parse_lparen(context) { @@ -1314,29 +1367,29 @@ PEG.grammarParser = (function(){ } - var savedPos26 = pos; + var savedPos27 = pos; if (input.substr(pos, 1) === "(") { - var result136 = "("; + var result143 = "("; pos += 1; } else { - var result136 = null; + var result143 = null; if (context.reportMatchFailures) { matchFailed(quoteString("(")); } } - if (result136 !== null) { - var result137 = parse___(context); - if (result137 !== null) { - var result135 = [result136, result137]; + if (result143 !== null) { + var result144 = parse___(context); + if (result144 !== null) { + var result142 = [result143, result144]; } else { - var result135 = null; - pos = savedPos26; + var result142 = null; + pos = savedPos27; } } else { - var result135 = null; - pos = savedPos26; + var result142 = null; + pos = savedPos27; } - var result134 = result135 !== null + var result141 = result142 !== null ? (function() { return "("; })() : null; @@ -1344,9 +1397,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result134 + result: result141 }; - return result134; + return result141; } function parse_rparen(context) { @@ -1358,29 +1411,29 @@ PEG.grammarParser = (function(){ } - var savedPos27 = pos; + var savedPos28 = pos; if (input.substr(pos, 1) === ")") { - var result140 = ")"; + var result147 = ")"; pos += 1; } else { - var result140 = null; + var result147 = null; if (context.reportMatchFailures) { matchFailed(quoteString(")")); } } - if (result140 !== null) { - var result141 = parse___(context); - if (result141 !== null) { - var result139 = [result140, result141]; + if (result147 !== null) { + var result148 = parse___(context); + if (result148 !== null) { + var result146 = [result147, result148]; } else { - var result139 = null; - pos = savedPos27; + var result146 = null; + pos = savedPos28; } } else { - var result139 = null; - pos = savedPos27; + var result146 = null; + pos = savedPos28; } - var result138 = result139 !== null + var result145 = result146 !== null ? (function() { return ")"; })() : null; @@ -1388,9 +1441,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result138 + result: result145 }; - return result138; + return result145; } function parse_dot(context) { @@ -1402,29 +1455,29 @@ PEG.grammarParser = (function(){ } - var savedPos28 = pos; + var savedPos29 = pos; if (input.substr(pos, 1) === ".") { - var result144 = "."; + var result151 = "."; pos += 1; } else { - var result144 = null; + var result151 = null; if (context.reportMatchFailures) { matchFailed(quoteString(".")); } } - if (result144 !== null) { - var result145 = parse___(context); - if (result145 !== null) { - var result143 = [result144, result145]; + if (result151 !== null) { + var result152 = parse___(context); + if (result152 !== null) { + var result150 = [result151, result152]; } else { - var result143 = null; - pos = savedPos28; + var result150 = null; + pos = savedPos29; } } else { - var result143 = null; - pos = savedPos28; + var result150 = null; + pos = savedPos29; } - var result142 = result143 !== null + var result149 = result150 !== null ? (function() { return "."; })() : null; @@ -1432,9 +1485,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result142 + result: result149 }; - return result142; + return result149; } function parse_identifier(context) { @@ -1447,149 +1500,149 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; - var savedPos29 = pos; - var result158 = parse_letter(context); - if (result158 !== null) { - var result148 = result158; + var savedPos30 = pos; + var result165 = parse_letter(context); + if (result165 !== null) { + var result155 = result165; } else { if (input.substr(pos, 1) === "_") { - var result157 = "_"; + var result164 = "_"; pos += 1; } else { - var result157 = null; + var result164 = null; if (context.reportMatchFailures) { matchFailed(quoteString("_")); } } - if (result157 !== null) { - var result148 = result157; + if (result164 !== null) { + var result155 = result164; } else { if (input.substr(pos, 1) === "$") { - var result156 = "$"; + var result163 = "$"; pos += 1; } else { - var result156 = null; + var result163 = null; if (context.reportMatchFailures) { matchFailed(quoteString("$")); } } - if (result156 !== null) { - var result148 = result156; + if (result163 !== null) { + var result155 = result163; } else { - var result148 = null;; + var result155 = null;; }; }; } - if (result148 !== null) { - var result149 = []; - var result155 = parse_letter(context); - if (result155 !== null) { - var result151 = result155; + if (result155 !== null) { + var result156 = []; + var result162 = parse_letter(context); + if (result162 !== null) { + var result158 = result162; } else { - var result154 = parse_digit(context); - if (result154 !== null) { - var result151 = result154; + var result161 = parse_digit(context); + if (result161 !== null) { + var result158 = result161; } else { if (input.substr(pos, 1) === "_") { - var result153 = "_"; + var result160 = "_"; pos += 1; } else { - var result153 = null; + var result160 = null; if (context.reportMatchFailures) { matchFailed(quoteString("_")); } } - if (result153 !== null) { - var result151 = result153; + if (result160 !== null) { + var result158 = result160; } else { if (input.substr(pos, 1) === "$") { - var result152 = "$"; + var result159 = "$"; pos += 1; } else { - var result152 = null; + var result159 = null; if (context.reportMatchFailures) { matchFailed(quoteString("$")); } } - if (result152 !== null) { - var result151 = result152; + if (result159 !== null) { + var result158 = result159; } else { - var result151 = null;; + var result158 = null;; }; }; }; } - while (result151 !== null) { - result149.push(result151); - var result155 = parse_letter(context); - if (result155 !== null) { - var result151 = result155; + while (result158 !== null) { + result156.push(result158); + var result162 = parse_letter(context); + if (result162 !== null) { + var result158 = result162; } else { - var result154 = parse_digit(context); - if (result154 !== null) { - var result151 = result154; + var result161 = parse_digit(context); + if (result161 !== null) { + var result158 = result161; } else { if (input.substr(pos, 1) === "_") { - var result153 = "_"; + var result160 = "_"; pos += 1; } else { - var result153 = null; + var result160 = null; if (context.reportMatchFailures) { matchFailed(quoteString("_")); } } - if (result153 !== null) { - var result151 = result153; + if (result160 !== null) { + var result158 = result160; } else { if (input.substr(pos, 1) === "$") { - var result152 = "$"; + var result159 = "$"; pos += 1; } else { - var result152 = null; + var result159 = null; if (context.reportMatchFailures) { matchFailed(quoteString("$")); } } - if (result152 !== null) { - var result151 = result152; + if (result159 !== null) { + var result158 = result159; } else { - var result151 = null;; + var result158 = null;; }; }; }; } } - if (result149 !== null) { - var result150 = parse___(context); - if (result150 !== null) { - var result147 = [result148, result149, result150]; + if (result156 !== null) { + var result157 = parse___(context); + if (result157 !== null) { + var result154 = [result155, result156, result157]; } else { - var result147 = null; - pos = savedPos29; + var result154 = null; + pos = savedPos30; } } else { - var result147 = null; - pos = savedPos29; + var result154 = null; + pos = savedPos30; } } else { - var result147 = null; - pos = savedPos29; + var result154 = null; + pos = savedPos30; } - var result146 = result147 !== null + var result153 = result154 !== null ? (function(head, tail) { return head + tail.join(""); - })(result147[0], result147[1]) + })(result154[0], result154[1]) : null; context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result146 === null) { + if (context.reportMatchFailures && result153 === null) { matchFailed("identifier"); } cache[cacheKey] = { nextPos: pos, - result: result146 + result: result153 }; - return result146; + return result153; } function parse_literal(context) { @@ -1602,43 +1655,43 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; - var savedPos30 = pos; - var result164 = parse_doubleQuotedLiteral(context); - if (result164 !== null) { - var result161 = result164; + var savedPos31 = pos; + var result171 = parse_doubleQuotedLiteral(context); + if (result171 !== null) { + var result168 = result171; } else { - var result163 = parse_singleQuotedLiteral(context); - if (result163 !== null) { - var result161 = result163; + var result170 = parse_singleQuotedLiteral(context); + if (result170 !== null) { + var result168 = result170; } else { - var result161 = null;; + var result168 = null;; }; } - if (result161 !== null) { - var result162 = parse___(context); - if (result162 !== null) { - var result160 = [result161, result162]; + if (result168 !== null) { + var result169 = parse___(context); + if (result169 !== null) { + var result167 = [result168, result169]; } else { - var result160 = null; - pos = savedPos30; + var result167 = null; + pos = savedPos31; } } else { - var result160 = null; - pos = savedPos30; + var result167 = null; + pos = savedPos31; } - var result159 = result160 !== null - ? (function(literal) { return literal; })(result160[0]) + var result166 = result167 !== null + ? (function(literal) { return literal; })(result167[0]) : null; context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result159 === null) { + if (context.reportMatchFailures && result166 === null) { matchFailed("literal"); } cache[cacheKey] = { nextPos: pos, - result: result159 + result: result166 }; - return result159; + return result166; } function parse_doubleQuotedLiteral(context) { @@ -1650,58 +1703,58 @@ PEG.grammarParser = (function(){ } - var savedPos31 = pos; + var savedPos32 = pos; if (input.substr(pos, 1) === "\"") { - var result167 = "\""; + var result174 = "\""; pos += 1; } else { - var result167 = null; + var result174 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\"")); } } - if (result167 !== null) { - var result168 = []; - var result170 = parse_doubleQuotedCharacter(context); - while (result170 !== null) { - result168.push(result170); - var result170 = parse_doubleQuotedCharacter(context); + if (result174 !== null) { + var result175 = []; + var result177 = parse_doubleQuotedCharacter(context); + while (result177 !== null) { + result175.push(result177); + var result177 = parse_doubleQuotedCharacter(context); } - if (result168 !== null) { + if (result175 !== null) { if (input.substr(pos, 1) === "\"") { - var result169 = "\""; + var result176 = "\""; pos += 1; } else { - var result169 = null; + var result176 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\"")); } } - if (result169 !== null) { - var result166 = [result167, result168, result169]; + if (result176 !== null) { + var result173 = [result174, result175, result176]; } else { - var result166 = null; - pos = savedPos31; + var result173 = null; + pos = savedPos32; } } else { - var result166 = null; - pos = savedPos31; + var result173 = null; + pos = savedPos32; } } else { - var result166 = null; - pos = savedPos31; + var result173 = null; + pos = savedPos32; } - var result165 = result166 !== null - ? (function(chars) { return chars.join(""); })(result166[1]) + var result172 = result173 !== null + ? (function(chars) { return chars.join(""); })(result173[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result165 + result: result172 }; - return result165; + return result172; } function parse_doubleQuotedCharacter(context) { @@ -1713,31 +1766,31 @@ PEG.grammarParser = (function(){ } - var result177 = parse_simpleDoubleQuotedCharacter(context); - if (result177 !== null) { - var result171 = result177; + var result184 = parse_simpleDoubleQuotedCharacter(context); + if (result184 !== null) { + var result178 = result184; } else { - var result176 = parse_simpleEscapeSequence(context); - if (result176 !== null) { - var result171 = result176; + var result183 = parse_simpleEscapeSequence(context); + if (result183 !== null) { + var result178 = result183; } else { - var result175 = parse_zeroEscapeSequence(context); - if (result175 !== null) { - var result171 = result175; + var result182 = parse_zeroEscapeSequence(context); + if (result182 !== null) { + var result178 = result182; } else { - var result174 = parse_hexEscapeSequence(context); - if (result174 !== null) { - var result171 = result174; + var result181 = parse_hexEscapeSequence(context); + if (result181 !== null) { + var result178 = result181; } else { - var result173 = parse_unicodeEscapeSequence(context); - if (result173 !== null) { - var result171 = result173; + var result180 = parse_unicodeEscapeSequence(context); + if (result180 !== null) { + var result178 = result180; } else { - var result172 = parse_eolEscapeSequence(context); - if (result172 !== null) { - var result171 = result172; + var result179 = parse_eolEscapeSequence(context); + if (result179 !== null) { + var result178 = result179; } else { - var result171 = null;; + var result178 = null;; }; }; }; @@ -1749,9 +1802,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result171 + result: result178 }; - return result171; + return result178; } function parse_simpleDoubleQuotedCharacter(context) { @@ -1763,80 +1816,80 @@ PEG.grammarParser = (function(){ } - var savedPos32 = pos; var savedPos33 = pos; + var savedPos34 = pos; var savedReportMatchFailuresVar1 = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos, 1) === "\"") { - var result185 = "\""; + var result192 = "\""; pos += 1; } else { - var result185 = null; + var result192 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\"")); } } - if (result185 !== null) { - var result182 = result185; + if (result192 !== null) { + var result189 = result192; } else { if (input.substr(pos, 1) === "\\") { - var result184 = "\\"; + var result191 = "\\"; pos += 1; } else { - var result184 = null; + var result191 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\")); } } - if (result184 !== null) { - var result182 = result184; + if (result191 !== null) { + var result189 = result191; } else { - var result183 = parse_eolChar(context); - if (result183 !== null) { - var result182 = result183; + var result190 = parse_eolChar(context); + if (result190 !== null) { + var result189 = result190; } else { - var result182 = null;; + var result189 = null;; }; }; } context.reportMatchFailures = savedReportMatchFailuresVar1; - if (result182 === null) { - var result180 = ''; + if (result189 === null) { + var result187 = ''; } else { - var result180 = null; - pos = savedPos33; + var result187 = null; + pos = savedPos34; } - if (result180 !== null) { + if (result187 !== null) { if (input.length > pos) { - var result181 = input.charAt(pos); + var result188 = input.charAt(pos); pos++; } else { - var result181 = null; + var result188 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result181 !== null) { - var result179 = [result180, result181]; + if (result188 !== null) { + var result186 = [result187, result188]; } else { - var result179 = null; - pos = savedPos32; + var result186 = null; + pos = savedPos33; } } else { - var result179 = null; - pos = savedPos32; + var result186 = null; + pos = savedPos33; } - var result178 = result179 !== null - ? (function(char_) { return char_; })(result179[1]) + var result185 = result186 !== null + ? (function(char_) { return char_; })(result186[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result178 + result: result185 }; - return result178; + return result185; } function parse_singleQuotedLiteral(context) { @@ -1848,58 +1901,58 @@ PEG.grammarParser = (function(){ } - var savedPos34 = pos; + var savedPos35 = pos; if (input.substr(pos, 1) === "'") { - var result188 = "'"; + var result195 = "'"; pos += 1; } else { - var result188 = null; + var result195 = null; if (context.reportMatchFailures) { matchFailed(quoteString("'")); } } - if (result188 !== null) { - var result189 = []; - var result191 = parse_singleQuotedCharacter(context); - while (result191 !== null) { - result189.push(result191); - var result191 = parse_singleQuotedCharacter(context); + if (result195 !== null) { + var result196 = []; + var result198 = parse_singleQuotedCharacter(context); + while (result198 !== null) { + result196.push(result198); + var result198 = parse_singleQuotedCharacter(context); } - if (result189 !== null) { + if (result196 !== null) { if (input.substr(pos, 1) === "'") { - var result190 = "'"; + var result197 = "'"; pos += 1; } else { - var result190 = null; + var result197 = null; if (context.reportMatchFailures) { matchFailed(quoteString("'")); } } - if (result190 !== null) { - var result187 = [result188, result189, result190]; + if (result197 !== null) { + var result194 = [result195, result196, result197]; } else { - var result187 = null; - pos = savedPos34; + var result194 = null; + pos = savedPos35; } } else { - var result187 = null; - pos = savedPos34; + var result194 = null; + pos = savedPos35; } } else { - var result187 = null; - pos = savedPos34; + var result194 = null; + pos = savedPos35; } - var result186 = result187 !== null - ? (function(chars) { return chars.join(""); })(result187[1]) + var result193 = result194 !== null + ? (function(chars) { return chars.join(""); })(result194[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result186 + result: result193 }; - return result186; + return result193; } function parse_singleQuotedCharacter(context) { @@ -1911,31 +1964,31 @@ PEG.grammarParser = (function(){ } - var result198 = parse_simpleSingleQuotedCharacter(context); - if (result198 !== null) { - var result192 = result198; + var result205 = parse_simpleSingleQuotedCharacter(context); + if (result205 !== null) { + var result199 = result205; } else { - var result197 = parse_simpleEscapeSequence(context); - if (result197 !== null) { - var result192 = result197; + var result204 = parse_simpleEscapeSequence(context); + if (result204 !== null) { + var result199 = result204; } else { - var result196 = parse_zeroEscapeSequence(context); - if (result196 !== null) { - var result192 = result196; + var result203 = parse_zeroEscapeSequence(context); + if (result203 !== null) { + var result199 = result203; } else { - var result195 = parse_hexEscapeSequence(context); - if (result195 !== null) { - var result192 = result195; + var result202 = parse_hexEscapeSequence(context); + if (result202 !== null) { + var result199 = result202; } else { - var result194 = parse_unicodeEscapeSequence(context); - if (result194 !== null) { - var result192 = result194; + var result201 = parse_unicodeEscapeSequence(context); + if (result201 !== null) { + var result199 = result201; } else { - var result193 = parse_eolEscapeSequence(context); - if (result193 !== null) { - var result192 = result193; + var result200 = parse_eolEscapeSequence(context); + if (result200 !== null) { + var result199 = result200; } else { - var result192 = null;; + var result199 = null;; }; }; }; @@ -1947,9 +2000,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result192 + result: result199 }; - return result192; + return result199; } function parse_simpleSingleQuotedCharacter(context) { @@ -1961,80 +2014,80 @@ PEG.grammarParser = (function(){ } - var savedPos35 = pos; var savedPos36 = pos; + var savedPos37 = pos; var savedReportMatchFailuresVar2 = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos, 1) === "'") { - var result206 = "'"; + var result213 = "'"; pos += 1; } else { - var result206 = null; + var result213 = null; if (context.reportMatchFailures) { matchFailed(quoteString("'")); } } - if (result206 !== null) { - var result203 = result206; + if (result213 !== null) { + var result210 = result213; } else { if (input.substr(pos, 1) === "\\") { - var result205 = "\\"; + var result212 = "\\"; pos += 1; } else { - var result205 = null; + var result212 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\")); } } - if (result205 !== null) { - var result203 = result205; + if (result212 !== null) { + var result210 = result212; } else { - var result204 = parse_eolChar(context); - if (result204 !== null) { - var result203 = result204; + var result211 = parse_eolChar(context); + if (result211 !== null) { + var result210 = result211; } else { - var result203 = null;; + var result210 = null;; }; }; } context.reportMatchFailures = savedReportMatchFailuresVar2; - if (result203 === null) { - var result201 = ''; + if (result210 === null) { + var result208 = ''; } else { - var result201 = null; - pos = savedPos36; + var result208 = null; + pos = savedPos37; } - if (result201 !== null) { + if (result208 !== null) { if (input.length > pos) { - var result202 = input.charAt(pos); + var result209 = input.charAt(pos); pos++; } else { - var result202 = null; + var result209 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result202 !== null) { - var result200 = [result201, result202]; + if (result209 !== null) { + var result207 = [result208, result209]; } else { - var result200 = null; - pos = savedPos35; + var result207 = null; + pos = savedPos36; } } else { - var result200 = null; - pos = savedPos35; + var result207 = null; + pos = savedPos36; } - var result199 = result200 !== null - ? (function(char_) { return char_; })(result200[1]) + var result206 = result207 !== null + ? (function(char_) { return char_; })(result207[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result199 + result: result206 }; - return result199; + return result206; } function parse_class(context) { @@ -2047,89 +2100,89 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; - var savedPos37 = pos; + var savedPos38 = pos; if (input.substr(pos, 1) === "[") { - var result209 = "["; + var result216 = "["; pos += 1; } else { - var result209 = null; + var result216 = null; if (context.reportMatchFailures) { matchFailed(quoteString("[")); } } - if (result209 !== null) { + if (result216 !== null) { if (input.substr(pos, 1) === "^") { - var result217 = "^"; + var result224 = "^"; pos += 1; } else { - var result217 = null; + var result224 = null; if (context.reportMatchFailures) { matchFailed(quoteString("^")); } } - var result210 = result217 !== null ? result217 : ''; - if (result210 !== null) { - var result211 = []; - var result216 = parse_classCharacterRange(context); - if (result216 !== null) { - var result214 = result216; + var result217 = result224 !== null ? result224 : ''; + if (result217 !== null) { + var result218 = []; + var result223 = parse_classCharacterRange(context); + if (result223 !== null) { + var result221 = result223; } else { - var result215 = parse_classCharacter(context); - if (result215 !== null) { - var result214 = result215; + var result222 = parse_classCharacter(context); + if (result222 !== null) { + var result221 = result222; } else { - var result214 = null;; + var result221 = null;; }; } - while (result214 !== null) { - result211.push(result214); - var result216 = parse_classCharacterRange(context); - if (result216 !== null) { - var result214 = result216; + while (result221 !== null) { + result218.push(result221); + var result223 = parse_classCharacterRange(context); + if (result223 !== null) { + var result221 = result223; } else { - var result215 = parse_classCharacter(context); - if (result215 !== null) { - var result214 = result215; + var result222 = parse_classCharacter(context); + if (result222 !== null) { + var result221 = result222; } else { - var result214 = null;; + var result221 = null;; }; } } - if (result211 !== null) { + if (result218 !== null) { if (input.substr(pos, 1) === "]") { - var result212 = "]"; + var result219 = "]"; pos += 1; } else { - var result212 = null; + var result219 = null; if (context.reportMatchFailures) { matchFailed(quoteString("]")); } } - if (result212 !== null) { - var result213 = parse___(context); - if (result213 !== null) { - var result208 = [result209, result210, result211, result212, result213]; + if (result219 !== null) { + var result220 = parse___(context); + if (result220 !== null) { + var result215 = [result216, result217, result218, result219, result220]; } else { - var result208 = null; - pos = savedPos37; + var result215 = null; + pos = savedPos38; } } else { - var result208 = null; - pos = savedPos37; + var result215 = null; + pos = savedPos38; } } else { - var result208 = null; - pos = savedPos37; + var result215 = null; + pos = savedPos38; } } else { - var result208 = null; - pos = savedPos37; + var result215 = null; + pos = savedPos38; } } else { - var result208 = null; - pos = savedPos37; + var result215 = null; + pos = savedPos38; } - var result207 = result208 !== null + var result214 = result215 !== null ? (function(inverted, parts) { partsConverted = PEG.ArrayUtils.map(parts, function(part) { return part.data; @@ -2148,18 +2201,18 @@ PEG.grammarParser = (function(){ // FIXME: Get the raw text from the input directly. rawText: rawText }; - })(result208[1], result208[2]) + })(result215[1], result215[2]) : null; context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result207 === null) { + if (context.reportMatchFailures && result214 === null) { matchFailed("character class"); } cache[cacheKey] = { nextPos: pos, - result: result207 + result: result214 }; - return result207; + return result214; } function parse_classCharacterRange(context) { @@ -2171,35 +2224,35 @@ PEG.grammarParser = (function(){ } - var savedPos38 = pos; - var result220 = parse_classCharacter(context); - if (result220 !== null) { + var savedPos39 = pos; + var result227 = parse_classCharacter(context); + if (result227 !== null) { if (input.substr(pos, 1) === "-") { - var result221 = "-"; + var result228 = "-"; pos += 1; } else { - var result221 = null; + var result228 = null; if (context.reportMatchFailures) { matchFailed(quoteString("-")); } } - if (result221 !== null) { - var result222 = parse_classCharacter(context); - if (result222 !== null) { - var result219 = [result220, result221, result222]; + if (result228 !== null) { + var result229 = parse_classCharacter(context); + if (result229 !== null) { + var result226 = [result227, result228, result229]; } else { - var result219 = null; - pos = savedPos38; + var result226 = null; + pos = savedPos39; } } else { - var result219 = null; - pos = savedPos38; + var result226 = null; + pos = savedPos39; } } else { - var result219 = null; - pos = savedPos38; + var result226 = null; + pos = savedPos39; } - var result218 = result219 !== null + var result225 = result226 !== null ? (function(begin, end) { if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) { throw new this.SyntaxError( @@ -2212,16 +2265,16 @@ PEG.grammarParser = (function(){ // FIXME: Get the raw text from the input directly. rawText: begin.rawText + "-" + end.rawText } - })(result219[0], result219[2]) + })(result226[0], result226[2]) : null; cache[cacheKey] = { nextPos: pos, - result: result218 + result: result225 }; - return result218; + return result225; } function parse_classCharacter(context) { @@ -2233,24 +2286,24 @@ PEG.grammarParser = (function(){ } - var result224 = parse_bracketDelimitedCharacter(context); - var result223 = result224 !== null + var result231 = parse_bracketDelimitedCharacter(context); + var result230 = result231 !== null ? (function(char_) { return { data: char_, // FIXME: Get the raw text from the input directly. rawText: PEG.RegExpUtils.quoteForClass(char_) }; - })(result224) + })(result231) : null; cache[cacheKey] = { nextPos: pos, - result: result223 + result: result230 }; - return result223; + return result230; } function parse_bracketDelimitedCharacter(context) { @@ -2262,31 +2315,31 @@ PEG.grammarParser = (function(){ } - var result231 = parse_simpleBracketDelimitedCharacter(context); - if (result231 !== null) { - var result225 = result231; + var result238 = parse_simpleBracketDelimitedCharacter(context); + if (result238 !== null) { + var result232 = result238; } else { - var result230 = parse_simpleEscapeSequence(context); - if (result230 !== null) { - var result225 = result230; + var result237 = parse_simpleEscapeSequence(context); + if (result237 !== null) { + var result232 = result237; } else { - var result229 = parse_zeroEscapeSequence(context); - if (result229 !== null) { - var result225 = result229; + var result236 = parse_zeroEscapeSequence(context); + if (result236 !== null) { + var result232 = result236; } else { - var result228 = parse_hexEscapeSequence(context); - if (result228 !== null) { - var result225 = result228; + var result235 = parse_hexEscapeSequence(context); + if (result235 !== null) { + var result232 = result235; } else { - var result227 = parse_unicodeEscapeSequence(context); - if (result227 !== null) { - var result225 = result227; + var result234 = parse_unicodeEscapeSequence(context); + if (result234 !== null) { + var result232 = result234; } else { - var result226 = parse_eolEscapeSequence(context); - if (result226 !== null) { - var result225 = result226; + var result233 = parse_eolEscapeSequence(context); + if (result233 !== null) { + var result232 = result233; } else { - var result225 = null;; + var result232 = null;; }; }; }; @@ -2298,9 +2351,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result225 + result: result232 }; - return result225; + return result232; } function parse_simpleBracketDelimitedCharacter(context) { @@ -2312,80 +2365,80 @@ PEG.grammarParser = (function(){ } - var savedPos39 = pos; var savedPos40 = pos; + var savedPos41 = pos; var savedReportMatchFailuresVar3 = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos, 1) === "]") { - var result239 = "]"; + var result246 = "]"; pos += 1; } else { - var result239 = null; + var result246 = null; if (context.reportMatchFailures) { matchFailed(quoteString("]")); } } - if (result239 !== null) { - var result236 = result239; + if (result246 !== null) { + var result243 = result246; } else { if (input.substr(pos, 1) === "\\") { - var result238 = "\\"; + var result245 = "\\"; pos += 1; } else { - var result238 = null; + var result245 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\")); } } - if (result238 !== null) { - var result236 = result238; + if (result245 !== null) { + var result243 = result245; } else { - var result237 = parse_eolChar(context); - if (result237 !== null) { - var result236 = result237; + var result244 = parse_eolChar(context); + if (result244 !== null) { + var result243 = result244; } else { - var result236 = null;; + var result243 = null;; }; }; } context.reportMatchFailures = savedReportMatchFailuresVar3; - if (result236 === null) { - var result234 = ''; + if (result243 === null) { + var result241 = ''; } else { - var result234 = null; - pos = savedPos40; + var result241 = null; + pos = savedPos41; } - if (result234 !== null) { + if (result241 !== null) { if (input.length > pos) { - var result235 = input.charAt(pos); + var result242 = input.charAt(pos); pos++; } else { - var result235 = null; + var result242 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result235 !== null) { - var result233 = [result234, result235]; + if (result242 !== null) { + var result240 = [result241, result242]; } else { - var result233 = null; - pos = savedPos39; + var result240 = null; + pos = savedPos40; } } else { - var result233 = null; - pos = savedPos39; + var result240 = null; + pos = savedPos40; } - var result232 = result233 !== null - ? (function(char_) { return char_; })(result233[1]) + var result239 = result240 !== null + ? (function(char_) { return char_; })(result240[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result232 + result: result239 }; - return result232; + return result239; } function parse_simpleEscapeSequence(context) { @@ -2397,89 +2450,89 @@ PEG.grammarParser = (function(){ } - var savedPos41 = pos; + var savedPos42 = pos; if (input.substr(pos, 1) === "\\") { - var result242 = "\\"; + var result249 = "\\"; pos += 1; } else { - var result242 = null; + var result249 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\")); } } - if (result242 !== null) { - var savedPos42 = pos; + if (result249 !== null) { + var savedPos43 = pos; var savedReportMatchFailuresVar4 = context.reportMatchFailures; context.reportMatchFailures = false; - var result249 = parse_digit(context); - if (result249 !== null) { - var result245 = result249; + var result256 = parse_digit(context); + if (result256 !== null) { + var result252 = result256; } else { if (input.substr(pos, 1) === "x") { - var result248 = "x"; + var result255 = "x"; pos += 1; } else { - var result248 = null; + var result255 = null; if (context.reportMatchFailures) { matchFailed(quoteString("x")); } } - if (result248 !== null) { - var result245 = result248; + if (result255 !== null) { + var result252 = result255; } else { if (input.substr(pos, 1) === "u") { - var result247 = "u"; + var result254 = "u"; pos += 1; } else { - var result247 = null; + var result254 = null; if (context.reportMatchFailures) { matchFailed(quoteString("u")); } } - if (result247 !== null) { - var result245 = result247; + if (result254 !== null) { + var result252 = result254; } else { - var result246 = parse_eolChar(context); - if (result246 !== null) { - var result245 = result246; + var result253 = parse_eolChar(context); + if (result253 !== null) { + var result252 = result253; } else { - var result245 = null;; + var result252 = null;; }; }; }; } context.reportMatchFailures = savedReportMatchFailuresVar4; - if (result245 === null) { - var result243 = ''; + if (result252 === null) { + var result250 = ''; } else { - var result243 = null; - pos = savedPos42; + var result250 = null; + pos = savedPos43; } - if (result243 !== null) { + if (result250 !== null) { if (input.length > pos) { - var result244 = input.charAt(pos); + var result251 = input.charAt(pos); pos++; } else { - var result244 = null; + var result251 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result244 !== null) { - var result241 = [result242, result243, result244]; + if (result251 !== null) { + var result248 = [result249, result250, result251]; } else { - var result241 = null; - pos = savedPos41; + var result248 = null; + pos = savedPos42; } } else { - var result241 = null; - pos = savedPos41; + var result248 = null; + pos = savedPos42; } } else { - var result241 = null; - pos = savedPos41; + var result248 = null; + pos = savedPos42; } - var result240 = result241 !== null + var result247 = result248 !== null ? (function(char_) { return char_ .replace("b", "\b") @@ -2488,16 +2541,16 @@ PEG.grammarParser = (function(){ .replace("r", "\r") .replace("t", "\t") .replace("v", "\x0B") // IE does not recognize "\v". - })(result241[2]) + })(result248[2]) : null; cache[cacheKey] = { nextPos: pos, - result: result240 + result: result247 }; - return result240; + return result247; } function parse_zeroEscapeSequence(context) { @@ -2509,39 +2562,39 @@ PEG.grammarParser = (function(){ } - var savedPos43 = pos; + var savedPos44 = pos; if (input.substr(pos, 2) === "\\0") { - var result252 = "\\0"; + var result259 = "\\0"; pos += 2; } else { - var result252 = null; + var result259 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\0")); } } - if (result252 !== null) { - var savedPos44 = pos; + if (result259 !== null) { + var savedPos45 = pos; var savedReportMatchFailuresVar5 = context.reportMatchFailures; context.reportMatchFailures = false; - var result254 = parse_digit(context); + var result261 = parse_digit(context); context.reportMatchFailures = savedReportMatchFailuresVar5; - if (result254 === null) { - var result253 = ''; + if (result261 === null) { + var result260 = ''; } else { - var result253 = null; - pos = savedPos44; + var result260 = null; + pos = savedPos45; } - if (result253 !== null) { - var result251 = [result252, result253]; + if (result260 !== null) { + var result258 = [result259, result260]; } else { - var result251 = null; - pos = savedPos43; + var result258 = null; + pos = savedPos44; } } else { - var result251 = null; - pos = savedPos43; + var result258 = null; + pos = savedPos44; } - var result250 = result251 !== null + var result257 = result258 !== null ? (function() { return "\0"; })() : null; @@ -2549,9 +2602,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result250 + result: result257 }; - return result250; + return result257; } function parse_hexEscapeSequence(context) { @@ -2563,47 +2616,47 @@ PEG.grammarParser = (function(){ } - var savedPos45 = pos; + var savedPos46 = pos; if (input.substr(pos, 2) === "\\x") { - var result257 = "\\x"; + var result264 = "\\x"; pos += 2; } else { - var result257 = null; + var result264 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\x")); } } - if (result257 !== null) { - var result258 = parse_hexDigit(context); - if (result258 !== null) { - var result259 = parse_hexDigit(context); - if (result259 !== null) { - var result256 = [result257, result258, result259]; + if (result264 !== null) { + var result265 = parse_hexDigit(context); + if (result265 !== null) { + var result266 = parse_hexDigit(context); + if (result266 !== null) { + var result263 = [result264, result265, result266]; } else { - var result256 = null; - pos = savedPos45; + var result263 = null; + pos = savedPos46; } } else { - var result256 = null; - pos = savedPos45; + var result263 = null; + pos = savedPos46; } } else { - var result256 = null; - pos = savedPos45; + var result263 = null; + pos = savedPos46; } - var result255 = result256 !== null + var result262 = result263 !== null ? (function(h1, h2) { return String.fromCharCode(parseInt("0x" + h1 + h2)); - })(result256[1], result256[2]) + })(result263[1], result263[2]) : null; cache[cacheKey] = { nextPos: pos, - result: result255 + result: result262 }; - return result255; + return result262; } function parse_unicodeEscapeSequence(context) { @@ -2615,59 +2668,59 @@ PEG.grammarParser = (function(){ } - var savedPos46 = pos; + var savedPos47 = pos; if (input.substr(pos, 2) === "\\u") { - var result262 = "\\u"; + var result269 = "\\u"; pos += 2; } else { - var result262 = null; + var result269 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\u")); } } - if (result262 !== null) { - var result263 = parse_hexDigit(context); - if (result263 !== null) { - var result264 = parse_hexDigit(context); - if (result264 !== null) { - var result265 = parse_hexDigit(context); - if (result265 !== null) { - var result266 = parse_hexDigit(context); - if (result266 !== null) { - var result261 = [result262, result263, result264, result265, result266]; + if (result269 !== null) { + var result270 = parse_hexDigit(context); + if (result270 !== null) { + var result271 = parse_hexDigit(context); + if (result271 !== null) { + var result272 = parse_hexDigit(context); + if (result272 !== null) { + var result273 = parse_hexDigit(context); + if (result273 !== null) { + var result268 = [result269, result270, result271, result272, result273]; } else { - var result261 = null; - pos = savedPos46; + var result268 = null; + pos = savedPos47; } } else { - var result261 = null; - pos = savedPos46; + var result268 = null; + pos = savedPos47; } } else { - var result261 = null; - pos = savedPos46; + var result268 = null; + pos = savedPos47; } } else { - var result261 = null; - pos = savedPos46; + var result268 = null; + pos = savedPos47; } } else { - var result261 = null; - pos = savedPos46; + var result268 = null; + pos = savedPos47; } - var result260 = result261 !== null + var result267 = result268 !== null ? (function(h1, h2, h3, h4) { return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); - })(result261[1], result261[2], result261[3], result261[4]) + })(result268[1], result268[2], result268[3], result268[4]) : null; cache[cacheKey] = { nextPos: pos, - result: result260 + result: result267 }; - return result260; + return result267; } function parse_eolEscapeSequence(context) { @@ -2679,39 +2732,39 @@ PEG.grammarParser = (function(){ } - var savedPos47 = pos; + var savedPos48 = pos; if (input.substr(pos, 1) === "\\") { - var result269 = "\\"; + var result276 = "\\"; pos += 1; } else { - var result269 = null; + var result276 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\\")); } } - if (result269 !== null) { - var result270 = parse_eol(context); - if (result270 !== null) { - var result268 = [result269, result270]; + if (result276 !== null) { + var result277 = parse_eol(context); + if (result277 !== null) { + var result275 = [result276, result277]; } else { - var result268 = null; - pos = savedPos47; + var result275 = null; + pos = savedPos48; } } else { - var result268 = null; - pos = savedPos47; + var result275 = null; + pos = savedPos48; } - var result267 = result268 !== null - ? (function(eol) { return eol; })(result268[1]) + var result274 = result275 !== null + ? (function(eol) { return eol; })(result275[1]) : null; cache[cacheKey] = { nextPos: pos, - result: result267 + result: result274 }; - return result267; + return result274; } function parse_digit(context) { @@ -2724,10 +2777,10 @@ PEG.grammarParser = (function(){ if (input.substr(pos).match(/^[0-9]/) !== null) { - var result271 = input.charAt(pos); + var result278 = input.charAt(pos); pos++; } else { - var result271 = null; + var result278 = null; if (context.reportMatchFailures) { matchFailed("[0-9]"); } @@ -2737,9 +2790,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result271 + result: result278 }; - return result271; + return result278; } function parse_hexDigit(context) { @@ -2752,10 +2805,10 @@ PEG.grammarParser = (function(){ if (input.substr(pos).match(/^[0-9a-fA-F]/) !== null) { - var result272 = input.charAt(pos); + var result279 = input.charAt(pos); pos++; } else { - var result272 = null; + var result279 = null; if (context.reportMatchFailures) { matchFailed("[0-9a-fA-F]"); } @@ -2765,9 +2818,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result272 + result: result279 }; - return result272; + return result279; } function parse_letter(context) { @@ -2779,15 +2832,15 @@ PEG.grammarParser = (function(){ } - var result275 = parse_lowerCaseLetter(context); - if (result275 !== null) { - var result273 = result275; + var result282 = parse_lowerCaseLetter(context); + if (result282 !== null) { + var result280 = result282; } else { - var result274 = parse_upperCaseLetter(context); - if (result274 !== null) { - var result273 = result274; + var result281 = parse_upperCaseLetter(context); + if (result281 !== null) { + var result280 = result281; } else { - var result273 = null;; + var result280 = null;; }; } @@ -2795,9 +2848,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result273 + result: result280 }; - return result273; + return result280; } function parse_lowerCaseLetter(context) { @@ -2810,10 +2863,10 @@ PEG.grammarParser = (function(){ if (input.substr(pos).match(/^[a-z]/) !== null) { - var result276 = input.charAt(pos); + var result283 = input.charAt(pos); pos++; } else { - var result276 = null; + var result283 = null; if (context.reportMatchFailures) { matchFailed("[a-z]"); } @@ -2823,9 +2876,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result276 + result: result283 }; - return result276; + return result283; } function parse_upperCaseLetter(context) { @@ -2838,10 +2891,10 @@ PEG.grammarParser = (function(){ if (input.substr(pos).match(/^[A-Z]/) !== null) { - var result277 = input.charAt(pos); + var result284 = input.charAt(pos); pos++; } else { - var result277 = null; + var result284 = null; if (context.reportMatchFailures) { matchFailed("[A-Z]"); } @@ -2851,9 +2904,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result277 + result: result284 }; - return result277; + return result284; } function parse___(context) { @@ -2865,38 +2918,38 @@ PEG.grammarParser = (function(){ } - var result278 = []; - var result282 = parse_whitespace(context); - if (result282 !== null) { - var result279 = result282; + var result285 = []; + var result289 = parse_whitespace(context); + if (result289 !== null) { + var result286 = result289; } else { - var result281 = parse_eol(context); - if (result281 !== null) { - var result279 = result281; + var result288 = parse_eol(context); + if (result288 !== null) { + var result286 = result288; } else { - var result280 = parse_comment(context); - if (result280 !== null) { - var result279 = result280; + var result287 = parse_comment(context); + if (result287 !== null) { + var result286 = result287; } else { - var result279 = null;; + var result286 = null;; }; }; } - while (result279 !== null) { - result278.push(result279); - var result282 = parse_whitespace(context); - if (result282 !== null) { - var result279 = result282; + while (result286 !== null) { + result285.push(result286); + var result289 = parse_whitespace(context); + if (result289 !== null) { + var result286 = result289; } else { - var result281 = parse_eol(context); - if (result281 !== null) { - var result279 = result281; + var result288 = parse_eol(context); + if (result288 !== null) { + var result286 = result288; } else { - var result280 = parse_comment(context); - if (result280 !== null) { - var result279 = result280; + var result287 = parse_comment(context); + if (result287 !== null) { + var result286 = result287; } else { - var result279 = null;; + var result286 = null;; }; }; } @@ -2906,9 +2959,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result278 + result: result285 }; - return result278; + return result285; } function parse_comment(context) { @@ -2921,27 +2974,27 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; - var result285 = parse_singleLineComment(context); - if (result285 !== null) { - var result283 = result285; + var result292 = parse_singleLineComment(context); + if (result292 !== null) { + var result290 = result292; } else { - var result284 = parse_multiLineComment(context); - if (result284 !== null) { - var result283 = result284; + var result291 = parse_multiLineComment(context); + if (result291 !== null) { + var result290 = result291; } else { - var result283 = null;; + var result290 = null;; }; } context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result283 === null) { + if (context.reportMatchFailures && result290 === null) { matchFailed("comment"); } cache[cacheKey] = { nextPos: pos, - result: result283 + result: result290 }; - return result283; + return result290; } function parse_singleLineComment(context) { @@ -2953,103 +3006,103 @@ PEG.grammarParser = (function(){ } - var savedPos48 = pos; + var savedPos49 = pos; if (input.substr(pos, 2) === "//") { - var result287 = "//"; + var result294 = "//"; pos += 2; } else { - var result287 = null; + var result294 = null; if (context.reportMatchFailures) { matchFailed(quoteString("//")); } } - if (result287 !== null) { - var result288 = []; - var savedPos49 = pos; + if (result294 !== null) { + var result295 = []; var savedPos50 = pos; + var savedPos51 = pos; var savedReportMatchFailuresVar6 = context.reportMatchFailures; context.reportMatchFailures = false; - var result292 = parse_eolChar(context); + var result299 = parse_eolChar(context); context.reportMatchFailures = savedReportMatchFailuresVar6; - if (result292 === null) { - var result290 = ''; + if (result299 === null) { + var result297 = ''; } else { - var result290 = null; - pos = savedPos50; + var result297 = null; + pos = savedPos51; } - if (result290 !== null) { + if (result297 !== null) { if (input.length > pos) { - var result291 = input.charAt(pos); + var result298 = input.charAt(pos); pos++; } else { - var result291 = null; + var result298 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result291 !== null) { - var result289 = [result290, result291]; + if (result298 !== null) { + var result296 = [result297, result298]; } else { - var result289 = null; - pos = savedPos49; + var result296 = null; + pos = savedPos50; } } else { - var result289 = null; - pos = savedPos49; + var result296 = null; + pos = savedPos50; } - while (result289 !== null) { - result288.push(result289); - var savedPos49 = pos; + while (result296 !== null) { + result295.push(result296); var savedPos50 = pos; + var savedPos51 = pos; var savedReportMatchFailuresVar6 = context.reportMatchFailures; context.reportMatchFailures = false; - var result292 = parse_eolChar(context); + var result299 = parse_eolChar(context); context.reportMatchFailures = savedReportMatchFailuresVar6; - if (result292 === null) { - var result290 = ''; + if (result299 === null) { + var result297 = ''; } else { - var result290 = null; - pos = savedPos50; + var result297 = null; + pos = savedPos51; } - if (result290 !== null) { + if (result297 !== null) { if (input.length > pos) { - var result291 = input.charAt(pos); + var result298 = input.charAt(pos); pos++; } else { - var result291 = null; + var result298 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result291 !== null) { - var result289 = [result290, result291]; + if (result298 !== null) { + var result296 = [result297, result298]; } else { - var result289 = null; - pos = savedPos49; + var result296 = null; + pos = savedPos50; } } else { - var result289 = null; - pos = savedPos49; + var result296 = null; + pos = savedPos50; } } - if (result288 !== null) { - var result286 = [result287, result288]; + if (result295 !== null) { + var result293 = [result294, result295]; } else { - var result286 = null; - pos = savedPos48; + var result293 = null; + pos = savedPos49; } } else { - var result286 = null; - pos = savedPos48; + var result293 = null; + pos = savedPos49; } cache[cacheKey] = { nextPos: pos, - result: result286 + result: result293 }; - return result286; + return result293; } function parse_multiLineComment(context) { @@ -3061,133 +3114,133 @@ PEG.grammarParser = (function(){ } - var savedPos51 = pos; + var savedPos52 = pos; if (input.substr(pos, 2) === "/*") { - var result294 = "/*"; + var result301 = "/*"; pos += 2; } else { - var result294 = null; + var result301 = null; if (context.reportMatchFailures) { matchFailed(quoteString("/*")); } } - if (result294 !== null) { - var result295 = []; - var savedPos52 = pos; + if (result301 !== null) { + var result302 = []; var savedPos53 = pos; + var savedPos54 = pos; var savedReportMatchFailuresVar7 = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos, 2) === "*/") { - var result300 = "*/"; + var result307 = "*/"; pos += 2; } else { - var result300 = null; + var result307 = null; if (context.reportMatchFailures) { matchFailed(quoteString("*/")); } } context.reportMatchFailures = savedReportMatchFailuresVar7; - if (result300 === null) { - var result298 = ''; + if (result307 === null) { + var result305 = ''; } else { - var result298 = null; - pos = savedPos53; + var result305 = null; + pos = savedPos54; } - if (result298 !== null) { + if (result305 !== null) { if (input.length > pos) { - var result299 = input.charAt(pos); + var result306 = input.charAt(pos); pos++; } else { - var result299 = null; + var result306 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result299 !== null) { - var result297 = [result298, result299]; + if (result306 !== null) { + var result304 = [result305, result306]; } else { - var result297 = null; - pos = savedPos52; + var result304 = null; + pos = savedPos53; } } else { - var result297 = null; - pos = savedPos52; + var result304 = null; + pos = savedPos53; } - while (result297 !== null) { - result295.push(result297); - var savedPos52 = pos; + while (result304 !== null) { + result302.push(result304); var savedPos53 = pos; + var savedPos54 = pos; var savedReportMatchFailuresVar7 = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos, 2) === "*/") { - var result300 = "*/"; + var result307 = "*/"; pos += 2; } else { - var result300 = null; + var result307 = null; if (context.reportMatchFailures) { matchFailed(quoteString("*/")); } } context.reportMatchFailures = savedReportMatchFailuresVar7; - if (result300 === null) { - var result298 = ''; + if (result307 === null) { + var result305 = ''; } else { - var result298 = null; - pos = savedPos53; + var result305 = null; + pos = savedPos54; } - if (result298 !== null) { + if (result305 !== null) { if (input.length > pos) { - var result299 = input.charAt(pos); + var result306 = input.charAt(pos); pos++; } else { - var result299 = null; + var result306 = null; if (context.reportMatchFailures) { matchFailed('any character'); } } - if (result299 !== null) { - var result297 = [result298, result299]; + if (result306 !== null) { + var result304 = [result305, result306]; } else { - var result297 = null; - pos = savedPos52; + var result304 = null; + pos = savedPos53; } } else { - var result297 = null; - pos = savedPos52; + var result304 = null; + pos = savedPos53; } } - if (result295 !== null) { + if (result302 !== null) { if (input.substr(pos, 2) === "*/") { - var result296 = "*/"; + var result303 = "*/"; pos += 2; } else { - var result296 = null; + var result303 = null; if (context.reportMatchFailures) { matchFailed(quoteString("*/")); } } - if (result296 !== null) { - var result293 = [result294, result295, result296]; + if (result303 !== null) { + var result300 = [result301, result302, result303]; } else { - var result293 = null; - pos = savedPos51; + var result300 = null; + pos = savedPos52; } } else { - var result293 = null; - pos = savedPos51; + var result300 = null; + pos = savedPos52; } } else { - var result293 = null; - pos = savedPos51; + var result300 = null; + pos = savedPos52; } cache[cacheKey] = { nextPos: pos, - result: result293 + result: result300 }; - return result293; + return result300; } function parse_eol(context) { @@ -3201,81 +3254,81 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos, 1) === "\n") { - var result306 = "\n"; + var result313 = "\n"; pos += 1; } else { - var result306 = null; + var result313 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\n")); } } - if (result306 !== null) { - var result301 = result306; + if (result313 !== null) { + var result308 = result313; } else { if (input.substr(pos, 2) === "\r\n") { - var result305 = "\r\n"; + var result312 = "\r\n"; pos += 2; } else { - var result305 = null; + var result312 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\r\n")); } } - if (result305 !== null) { - var result301 = result305; + if (result312 !== null) { + var result308 = result312; } else { if (input.substr(pos, 1) === "\r") { - var result304 = "\r"; + var result311 = "\r"; pos += 1; } else { - var result304 = null; + var result311 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\r")); } } - if (result304 !== null) { - var result301 = result304; + if (result311 !== null) { + var result308 = result311; } else { if (input.substr(pos, 1) === "\u2028") { - var result303 = "\u2028"; + var result310 = "\u2028"; pos += 1; } else { - var result303 = null; + var result310 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\u2028")); } } - if (result303 !== null) { - var result301 = result303; + if (result310 !== null) { + var result308 = result310; } else { if (input.substr(pos, 1) === "\u2029") { - var result302 = "\u2029"; + var result309 = "\u2029"; pos += 1; } else { - var result302 = null; + var result309 = null; if (context.reportMatchFailures) { matchFailed(quoteString("\u2029")); } } - if (result302 !== null) { - var result301 = result302; + if (result309 !== null) { + var result308 = result309; } else { - var result301 = null;; + var result308 = null;; }; }; }; }; } context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result301 === null) { + if (context.reportMatchFailures && result308 === null) { matchFailed("end of line"); } cache[cacheKey] = { nextPos: pos, - result: result301 + result: result308 }; - return result301; + return result308; } function parse_eolChar(context) { @@ -3288,10 +3341,10 @@ PEG.grammarParser = (function(){ if (input.substr(pos).match(/^[\n\r\u2028\u2029]/) !== null) { - var result307 = input.charAt(pos); + var result314 = input.charAt(pos); pos++; } else { - var result307 = null; + var result314 = null; if (context.reportMatchFailures) { matchFailed("[\\n\\r\\u2028\\u2029]"); } @@ -3301,9 +3354,9 @@ PEG.grammarParser = (function(){ cache[cacheKey] = { nextPos: pos, - result: result307 + result: result314 }; - return result307; + return result314; } function parse_whitespace(context) { @@ -3317,24 +3370,24 @@ PEG.grammarParser = (function(){ var savedReportMatchFailures = context.reportMatchFailures; context.reportMatchFailures = false; if (input.substr(pos).match(/^[   ᠎ -    ]/) !== null) { - var result308 = input.charAt(pos); + var result315 = input.charAt(pos); pos++; } else { - var result308 = null; + var result315 = null; if (context.reportMatchFailures) { matchFailed("[   ᠎ -    ]"); } } context.reportMatchFailures = savedReportMatchFailures; - if (context.reportMatchFailures && result308 === null) { + if (context.reportMatchFailures && result315 === null) { matchFailed("whitespace"); } cache[cacheKey] = { nextPos: pos, - result: result308 + result: result315 }; - return result308; + return result315; } function buildErrorMessage() { @@ -3392,6 +3445,8 @@ PEG.grammarParser = (function(){ return { line: line, column: column }; } + + var result = parse_grammar({ reportMatchFailures: true }); /* diff --git a/lib/metagrammar.pegjs b/lib/metagrammar.pegjs index 46e3ee4..69a4b8b 100644 --- a/lib/metagrammar.pegjs +++ b/lib/metagrammar.pegjs @@ -1,8 +1,20 @@ grammar - = __ rules:rule+ { - var result = {}; - PEG.ArrayUtils.each(rules, function(rule) { result[rule.name] = rule; }); - return result; + = __ initializer:initializer? rules:rule+ { + var rulesConverted = {}; + PEG.ArrayUtils.each(rules, function(rule) { rulesConverted[rule.name] = rule; }); + + return { + initializer: initializer !== "" ? initializer : null, + rules: rulesConverted + } + } + +initializer + = code:action semicolon? { + return { + type: "initializer", + code: code + }; } rule diff --git a/test/compiler-test.js b/test/compiler-test.js index 01bc1f4..6a4625c 100644 --- a/test/compiler-test.js +++ b/test/compiler-test.js @@ -379,6 +379,18 @@ test("actions", function() { doesNotParse(notAMatchParser, "b"); }); +test("initializer", function() { + var variableDefinitionParser = PEG.buildParser( + '{ a = 42; }; start = "a" { return a; }' + ); + parses(variableDefinitionParser, "a", 42); + + var functionDefinitionparser = PEG.buildParser( + '{ function f() { return 42; } }; start = "a" { return f(); }' + ); + parses(variableDefinitionParser, "a", 42); +}); + test("rule references", function() { var parser = PEG.buildParser([ 'start = static / dynamic', diff --git a/test/metagrammar-test.js b/test/metagrammar-test.js index 2c0711f..7591418 100644 --- a/test/metagrammar-test.js +++ b/test/metagrammar-test.js @@ -20,6 +20,13 @@ global.grammarParserDoesNotParseWithMessage = function(input, message) { module("Grammar Parser"); +function initializer(code) { + return { + type: "initializer", + code: code + }; +} + function rule(name, displayName, expression) { return { type: "rule", @@ -119,7 +126,10 @@ var sequenceLiterals = sequence([literalAbcd, literalEfgh, literalIjkl]); var choiceLiterals = choice([literalAbcd, literalEfgh, literalIjkl]); function oneRuleGrammar(expression) { - return { start: rule("start", null, expression) }; + return { + initializer: null, + rules: { start: rule("start", null, expression) } + }; } var simpleGrammar = oneRuleGrammar(literal("abcd")); @@ -144,19 +154,42 @@ function actionGrammar(action) { return oneRuleGrammar(action_(literal("a"), action)); } +var initializerGrammar = { + initializer: initializer(" code "), + rules: { + a: rule("a", null, literalAbcd), + } +}; + /* Canonical grammar is "a: \"abcd\"; b: \"efgh\"; c: \"ijkl\";". */ test("parses grammar", function() { - grammarParserParses('a = "abcd"', { a: rule("a", null, literalAbcd) }); + grammarParserParses( + 'a = "abcd"', + { + initializer: null, + rules: { a: rule("a", null, literalAbcd) } + } + ); + grammarParserParses('{ code }; a = "abcd"', initializerGrammar); grammarParserParses( 'a = "abcd"; b = "efgh"; c = "ijkl"', { - a: rule("a", null, literalAbcd), - b: rule("b", null, literalEfgh), - c: rule("c", null, literalIjkl) + initializer: null, + rules: { + a: rule("a", null, literalAbcd), + b: rule("b", null, literalEfgh), + c: rule("c", null, literalIjkl) + } } ); }); +/* Canonical initializer is "{ code }". */ +test("parses initializer", function() { + grammarParserParses('{ code }a = "abcd"', initializerGrammar); + grammarParserParses('{ code };a = "abcd"', initializerGrammar); +}); + /* Canonical rule is "a: \"abcd\"". */ test("parses rule", function() { grammarParserParses( @@ -166,7 +199,8 @@ test("parses rule", function() { grammarParserParses( 'start "start rule" = "abcd" / "efgh" / "ijkl"', { - start: rule("start", "start rule", choiceLiterals) + initializer: null, + rules: { start: rule("start", "start rule", choiceLiterals) } } ); grammarParserParses(