|
@@ -1,15 +1,11 @@
|
|
|
-// jshint ignore:start
|
|
|
-define(['./boot'], function($boot) {
|
|
|
-var $globals = $boot.globals;
|
|
|
-$globals.SmalltalkParser = (function() {
|
|
|
+/*
|
|
|
+ * Generated by PEG.js 0.10.0.
|
|
|
+ *
|
|
|
+ * http://pegjs.org/
|
|
|
+ */
|
|
|
+define(["./boot"], function($boot) {
|
|
|
"use strict";
|
|
|
|
|
|
- /*
|
|
|
- * Generated by PEG.js 0.9.0.
|
|
|
- *
|
|
|
- * http://pegjs.org/
|
|
|
- */
|
|
|
-
|
|
|
function peg$subclass(child, parent) {
|
|
|
function ctor() { this.constructor = child; }
|
|
|
ctor.prototype = parent.prototype;
|
|
@@ -30,31 +26,137 @@ $globals.SmalltalkParser = (function() {
|
|
|
|
|
|
peg$subclass(peg$SyntaxError, Error);
|
|
|
|
|
|
- function peg$parse(input) {
|
|
|
- var options = arguments.length > 1 ? arguments[1] : {},
|
|
|
- parser = this,
|
|
|
+ peg$SyntaxError.buildMessage = function(expected, found) {
|
|
|
+ var DESCRIBE_EXPECTATION_FNS = {
|
|
|
+ literal: function(expectation) {
|
|
|
+ return "\"" + literalEscape(expectation.text) + "\"";
|
|
|
+ },
|
|
|
+
|
|
|
+ "class": function(expectation) {
|
|
|
+ var escapedParts = "",
|
|
|
+ i;
|
|
|
+
|
|
|
+ for (i = 0; i < expectation.parts.length; i++) {
|
|
|
+ escapedParts += expectation.parts[i] instanceof Array
|
|
|
+ ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
|
|
|
+ : classEscape(expectation.parts[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
|
|
|
+ },
|
|
|
+
|
|
|
+ any: function(expectation) {
|
|
|
+ return "any character";
|
|
|
+ },
|
|
|
+
|
|
|
+ end: function(expectation) {
|
|
|
+ return "end of input";
|
|
|
+ },
|
|
|
+
|
|
|
+ other: function(expectation) {
|
|
|
+ return expectation.description;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ function hex(ch) {
|
|
|
+ return ch.charCodeAt(0).toString(16).toUpperCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ function literalEscape(s) {
|
|
|
+ return s
|
|
|
+ .replace(/\\/g, '\\\\')
|
|
|
+ .replace(/"/g, '\\"')
|
|
|
+ .replace(/\0/g, '\\0')
|
|
|
+ .replace(/\t/g, '\\t')
|
|
|
+ .replace(/\n/g, '\\n')
|
|
|
+ .replace(/\r/g, '\\r')
|
|
|
+ .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
|
|
|
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); });
|
|
|
+ }
|
|
|
+
|
|
|
+ function classEscape(s) {
|
|
|
+ return s
|
|
|
+ .replace(/\\/g, '\\\\')
|
|
|
+ .replace(/\]/g, '\\]')
|
|
|
+ .replace(/\^/g, '\\^')
|
|
|
+ .replace(/-/g, '\\-')
|
|
|
+ .replace(/\0/g, '\\0')
|
|
|
+ .replace(/\t/g, '\\t')
|
|
|
+ .replace(/\n/g, '\\n')
|
|
|
+ .replace(/\r/g, '\\r')
|
|
|
+ .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
|
|
|
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); });
|
|
|
+ }
|
|
|
+
|
|
|
+ function describeExpectation(expectation) {
|
|
|
+ return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
|
|
|
+ }
|
|
|
+
|
|
|
+ function describeExpected(expected) {
|
|
|
+ var descriptions = new Array(expected.length),
|
|
|
+ i, j;
|
|
|
|
|
|
- peg$FAILED = {},
|
|
|
+ for (i = 0; i < expected.length; i++) {
|
|
|
+ descriptions[i] = describeExpectation(expected[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ descriptions.sort();
|
|
|
+
|
|
|
+ if (descriptions.length > 0) {
|
|
|
+ for (i = 1, j = 1; i < descriptions.length; i++) {
|
|
|
+ if (descriptions[i - 1] !== descriptions[i]) {
|
|
|
+ descriptions[j] = descriptions[i];
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ descriptions.length = j;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (descriptions.length) {
|
|
|
+ case 1:
|
|
|
+ return descriptions[0];
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ return descriptions[0] + " or " + descriptions[1];
|
|
|
+
|
|
|
+ default:
|
|
|
+ return descriptions.slice(0, -1).join(", ")
|
|
|
+ + ", or "
|
|
|
+ + descriptions[descriptions.length - 1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function describeFound(found) {
|
|
|
+ return found ? "\"" + literalEscape(found) + "\"" : "end of input";
|
|
|
+ }
|
|
|
+
|
|
|
+ return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
|
|
|
+ };
|
|
|
+
|
|
|
+ function peg$parse(input, options) {
|
|
|
+ options = options !== void 0 ? options : {};
|
|
|
+
|
|
|
+ var peg$FAILED = {},
|
|
|
|
|
|
peg$startRuleFunctions = { start: peg$parsestart },
|
|
|
peg$startRuleFunction = peg$parsestart,
|
|
|
|
|
|
peg$c0 = /^[ \t\x0B\f\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF\n\r\u2028\u2029]/,
|
|
|
- peg$c1 = { type: "class", value: "[ \\t\\v\\f\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000\\uFEFF\\n\\r\\u2028\\u2029]", description: "[ \\t\\v\\f\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000\\uFEFF\\n\\r\\u2028\\u2029]" },
|
|
|
+ peg$c1 = peg$classExpectation([" ", "\t", "\x0B", "\f", "\xA0", "\u1680", ["\u2000", "\u200A"], "\u202F", "\u205F", "\u3000", "\uFEFF", "\n", "\r", "\u2028", "\u2029"], false, false),
|
|
|
peg$c2 = "\"",
|
|
|
- peg$c3 = { type: "literal", value: "\"", description: "\"\\\"\"" },
|
|
|
+ peg$c3 = peg$literalExpectation("\"", false),
|
|
|
peg$c4 = /^[^"]/,
|
|
|
- peg$c5 = { type: "class", value: "[^\"]", description: "[^\"]" },
|
|
|
+ peg$c5 = peg$classExpectation(["\""], true, false),
|
|
|
peg$c6 = ".",
|
|
|
- peg$c7 = { type: "literal", value: ".", description: "\".\"" },
|
|
|
+ peg$c7 = peg$literalExpectation(".", false),
|
|
|
peg$c8 = /^[a-zA-Z]/,
|
|
|
- peg$c9 = { type: "class", value: "[a-zA-Z]", description: "[a-zA-Z]" },
|
|
|
+ peg$c9 = peg$classExpectation([["a", "z"], ["A", "Z"]], false, false),
|
|
|
peg$c10 = /^[a-zA-Z0-9]/,
|
|
|
- peg$c11 = { type: "class", value: "[a-zA-Z0-9]", description: "[a-zA-Z0-9]" },
|
|
|
+ peg$c11 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false),
|
|
|
peg$c12 = ":",
|
|
|
- peg$c13 = { type: "literal", value: ":", description: "\":\"" },
|
|
|
+ peg$c13 = peg$literalExpectation(":", false),
|
|
|
peg$c14 = /^[A-Z]/,
|
|
|
- peg$c15 = { type: "class", value: "[A-Z]", description: "[A-Z]" },
|
|
|
+ peg$c15 = peg$classExpectation([["A", "Z"]], false, false),
|
|
|
peg$c16 = function(val) {
|
|
|
return $globals.ValueNode._new()
|
|
|
._location_(location())
|
|
@@ -62,16 +164,16 @@ $globals.SmalltalkParser = (function() {
|
|
|
._value_(val);
|
|
|
},
|
|
|
peg$c17 = "'",
|
|
|
- peg$c18 = { type: "literal", value: "'", description: "\"'\"" },
|
|
|
+ peg$c18 = peg$literalExpectation("'", false),
|
|
|
peg$c19 = "''",
|
|
|
- peg$c20 = { type: "literal", value: "''", description: "\"''\"" },
|
|
|
+ peg$c20 = peg$literalExpectation("''", false),
|
|
|
peg$c21 = function() {return '\'';},
|
|
|
peg$c22 = /^[^']/,
|
|
|
- peg$c23 = { type: "class", value: "[^']", description: "[^']" },
|
|
|
+ peg$c23 = peg$classExpectation(["'"], true, false),
|
|
|
peg$c24 = function(val) {return val.join('');},
|
|
|
peg$c25 = "$",
|
|
|
- peg$c26 = { type: "literal", value: "$", description: "\"$\"" },
|
|
|
- peg$c27 = { type: "any", description: "any character" },
|
|
|
+ peg$c26 = peg$literalExpectation("$", false),
|
|
|
+ peg$c27 = peg$anyExpectation(),
|
|
|
peg$c28 = function(char) {
|
|
|
return $globals.ValueNode._new()
|
|
|
._location_(location())
|
|
@@ -79,44 +181,44 @@ $globals.SmalltalkParser = (function() {
|
|
|
._value_(char);
|
|
|
},
|
|
|
peg$c29 = "#",
|
|
|
- peg$c30 = { type: "literal", value: "#", description: "\"#\"" },
|
|
|
+ peg$c30 = peg$literalExpectation("#", false),
|
|
|
peg$c31 = function(rest) {return rest;},
|
|
|
peg$c32 = "e",
|
|
|
- peg$c33 = { type: "literal", value: "e", description: "\"e\"" },
|
|
|
+ peg$c33 = peg$literalExpectation("e", false),
|
|
|
peg$c34 = function(n) {return parseFloat(n);},
|
|
|
peg$c35 = "-",
|
|
|
- peg$c36 = { type: "literal", value: "-", description: "\"-\"" },
|
|
|
+ peg$c36 = peg$literalExpectation("-", false),
|
|
|
peg$c37 = "16r",
|
|
|
- peg$c38 = { type: "literal", value: "16r", description: "\"16r\"" },
|
|
|
+ peg$c38 = peg$literalExpectation("16r", false),
|
|
|
peg$c39 = /^[0-9a-fA-F]/,
|
|
|
- peg$c40 = { type: "class", value: "[0-9a-fA-F]", description: "[0-9a-fA-F]" },
|
|
|
+ peg$c40 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false),
|
|
|
peg$c41 = function(neg, num) {
|
|
|
return parseInt(((neg || '') + num), 16);
|
|
|
},
|
|
|
peg$c42 = /^[0-9]/,
|
|
|
- peg$c43 = { type: "class", value: "[0-9]", description: "[0-9]" },
|
|
|
+ peg$c43 = peg$classExpectation([["0", "9"]], false, false),
|
|
|
peg$c44 = function(n) {return parseFloat(n, 10);},
|
|
|
peg$c45 = function(n) {return parseInt(n, 10);},
|
|
|
peg$c46 = "#(",
|
|
|
- peg$c47 = { type: "literal", value: "#(", description: "\"#(\"" },
|
|
|
+ peg$c47 = peg$literalExpectation("#(", false),
|
|
|
peg$c48 = ")",
|
|
|
- peg$c49 = { type: "literal", value: ")", description: "\")\"" },
|
|
|
+ peg$c49 = peg$literalExpectation(")", false),
|
|
|
peg$c50 = function(rest) {
|
|
|
return rest
|
|
|
._location_(location())
|
|
|
._source_(text());
|
|
|
},
|
|
|
peg$c51 = "(",
|
|
|
- peg$c52 = { type: "literal", value: "(", description: "\"(\"" },
|
|
|
+ peg$c52 = peg$literalExpectation("(", false),
|
|
|
peg$c53 = function(lit) {return lit._value();},
|
|
|
peg$c54 = function(lits) {
|
|
|
return $globals.ValueNode._new()
|
|
|
._value_(lits);
|
|
|
},
|
|
|
peg$c55 = "{",
|
|
|
- peg$c56 = { type: "literal", value: "{", description: "\"{\"" },
|
|
|
+ peg$c56 = peg$literalExpectation("{", false),
|
|
|
peg$c57 = "}",
|
|
|
- peg$c58 = { type: "literal", value: "}", description: "\"}\"" },
|
|
|
+ peg$c58 = peg$literalExpectation("}", false),
|
|
|
peg$c59 = function(expressions) {
|
|
|
return $globals.DynamicArrayNode._new()
|
|
|
._location_(location())
|
|
@@ -124,7 +226,7 @@ $globals.SmalltalkParser = (function() {
|
|
|
._dagChildren_(expressions || []);
|
|
|
},
|
|
|
peg$c60 = "#{",
|
|
|
- peg$c61 = { type: "literal", value: "#{", description: "\"#{\"" },
|
|
|
+ peg$c61 = peg$literalExpectation("#{", false),
|
|
|
peg$c62 = function(expressions) {
|
|
|
return $globals.DynamicDictionaryNode._new()
|
|
|
._location_(location())
|
|
@@ -132,13 +234,13 @@ $globals.SmalltalkParser = (function() {
|
|
|
._dagChildren_(expressions || []);
|
|
|
},
|
|
|
peg$c63 = "true",
|
|
|
- peg$c64 = { type: "literal", value: "true", description: "\"true\"" },
|
|
|
+ peg$c64 = peg$literalExpectation("true", false),
|
|
|
peg$c65 = function() {return true;},
|
|
|
peg$c66 = "false",
|
|
|
- peg$c67 = { type: "literal", value: "false", description: "\"false\"" },
|
|
|
+ peg$c67 = peg$literalExpectation("false", false),
|
|
|
peg$c68 = function() {return false;},
|
|
|
peg$c69 = "nil",
|
|
|
- peg$c70 = { type: "literal", value: "nil", description: "\"nil\"" },
|
|
|
+ peg$c70 = peg$literalExpectation("nil", false),
|
|
|
peg$c71 = function() {return null;},
|
|
|
peg$c72 = function(identifier) {
|
|
|
return $globals.VariableNode._new()
|
|
@@ -147,7 +249,7 @@ $globals.SmalltalkParser = (function() {
|
|
|
._value_(identifier);
|
|
|
},
|
|
|
peg$c73 = /^[\\+*\/=><,@%~|&\-]/,
|
|
|
- peg$c74 = { type: "class", value: "[\\\\+*/=><,@%~|&-]", description: "[\\\\+*/=><,@%~|&-]" },
|
|
|
+ peg$c74 = peg$classExpectation(["\\", "+", "*", "/", "=", ">", "<", ",", "@", "%", "~", "|", "&", "-"], false, false),
|
|
|
peg$c75 = function(key, arg) {return {key:key, arg:arg};},
|
|
|
peg$c76 = function(pairs) {
|
|
|
var selector = '';
|
|
@@ -181,12 +283,12 @@ $globals.SmalltalkParser = (function() {
|
|
|
return $globals.Message._selector_arguments_(selector, args)
|
|
|
},
|
|
|
peg$c83 = "<",
|
|
|
- peg$c84 = { type: "literal", value: "<", description: "\"<\"" },
|
|
|
+ peg$c84 = peg$literalExpectation("<", false),
|
|
|
peg$c85 = ">",
|
|
|
- peg$c86 = { type: "literal", value: ">", description: "\">\"" },
|
|
|
+ peg$c86 = peg$literalExpectation(">", false),
|
|
|
peg$c87 = function(message) {return message;},
|
|
|
peg$c88 = ":=",
|
|
|
- peg$c89 = { type: "literal", value: ":=", description: "\":=\"" },
|
|
|
+ peg$c89 = peg$literalExpectation(":=", false),
|
|
|
peg$c90 = function(variable, expression) {
|
|
|
return $globals.AssignmentNode._new()
|
|
|
._location_(location())
|
|
@@ -195,7 +297,7 @@ $globals.SmalltalkParser = (function() {
|
|
|
._right_(expression);
|
|
|
},
|
|
|
peg$c91 = "^",
|
|
|
- peg$c92 = { type: "literal", value: "^", description: "\"^\"" },
|
|
|
+ peg$c92 = peg$literalExpectation("^", false),
|
|
|
peg$c93 = function(expression) {
|
|
|
return $globals.ReturnNode._new()
|
|
|
._location_(location())
|
|
@@ -203,7 +305,7 @@ $globals.SmalltalkParser = (function() {
|
|
|
._dagChildren_([expression]);
|
|
|
},
|
|
|
peg$c94 = "|",
|
|
|
- peg$c95 = { type: "literal", value: "|", description: "\"|\"" },
|
|
|
+ peg$c95 = peg$literalExpectation("|", false),
|
|
|
peg$c96 = function(variable) {return variable;},
|
|
|
peg$c97 = function(vars) {
|
|
|
return vars;
|
|
@@ -235,9 +337,9 @@ $globals.SmalltalkParser = (function() {
|
|
|
._dagChildren_(statements || []);
|
|
|
},
|
|
|
peg$c105 = "[",
|
|
|
- peg$c106 = { type: "literal", value: "[", description: "\"[\"" },
|
|
|
+ peg$c106 = peg$literalExpectation("[", false),
|
|
|
peg$c107 = "]",
|
|
|
- peg$c108 = { type: "literal", value: "]", description: "\"]\"" },
|
|
|
+ peg$c108 = peg$literalExpectation("]", false),
|
|
|
peg$c109 = function(params, sequence) {
|
|
|
return $globals.BlockNode._new()
|
|
|
._location_(location())
|
|
@@ -281,7 +383,7 @@ $globals.SmalltalkParser = (function() {
|
|
|
},
|
|
|
peg$c116 = function(receiver, tail) {return tail.length > 0;},
|
|
|
peg$c117 = ";",
|
|
|
- peg$c118 = { type: "literal", value: ";", description: "\";\"" },
|
|
|
+ peg$c118 = peg$literalExpectation(";", false),
|
|
|
peg$c119 = function(receiver, tail, mess) {return mess;},
|
|
|
peg$c120 = function(receiver, tail, messages) {
|
|
|
messages.unshift(receiver._withTail_(tail));
|
|
@@ -309,7 +411,7 @@ $globals.SmalltalkParser = (function() {
|
|
|
|
|
|
peg$currPos = 0,
|
|
|
peg$savedPos = 0,
|
|
|
- peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }],
|
|
|
+ peg$posDetailsCache = [{ line: 1, column: 1 }],
|
|
|
peg$maxFailPos = 0,
|
|
|
peg$maxFailExpected = [],
|
|
|
peg$silentFails = 0,
|
|
@@ -334,27 +436,44 @@ $globals.SmalltalkParser = (function() {
|
|
|
return peg$computeLocation(peg$savedPos, peg$currPos);
|
|
|
}
|
|
|
|
|
|
- function expected(description) {
|
|
|
- throw peg$buildException(
|
|
|
- null,
|
|
|
- [{ type: "other", description: description }],
|
|
|
+ function expected(description, location) {
|
|
|
+ location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
|
|
|
+
|
|
|
+ throw peg$buildStructuredError(
|
|
|
+ [peg$otherExpectation(description)],
|
|
|
input.substring(peg$savedPos, peg$currPos),
|
|
|
- peg$computeLocation(peg$savedPos, peg$currPos)
|
|
|
+ location
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- function error(message) {
|
|
|
- throw peg$buildException(
|
|
|
- message,
|
|
|
- null,
|
|
|
- input.substring(peg$savedPos, peg$currPos),
|
|
|
- peg$computeLocation(peg$savedPos, peg$currPos)
|
|
|
- );
|
|
|
+ function error(message, location) {
|
|
|
+ location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
|
|
|
+
|
|
|
+ throw peg$buildSimpleError(message, location);
|
|
|
+ }
|
|
|
+
|
|
|
+ function peg$literalExpectation(text, ignoreCase) {
|
|
|
+ return { type: "literal", text: text, ignoreCase: ignoreCase };
|
|
|
+ }
|
|
|
+
|
|
|
+ function peg$classExpectation(parts, inverted, ignoreCase) {
|
|
|
+ return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
|
|
|
+ }
|
|
|
+
|
|
|
+ function peg$anyExpectation() {
|
|
|
+ return { type: "any" };
|
|
|
+ }
|
|
|
+
|
|
|
+ function peg$endExpectation() {
|
|
|
+ return { type: "end" };
|
|
|
+ }
|
|
|
+
|
|
|
+ function peg$otherExpectation(description) {
|
|
|
+ return { type: "other", description: description };
|
|
|
}
|
|
|
|
|
|
function peg$computePosDetails(pos) {
|
|
|
- var details = peg$posDetailsCache[pos],
|
|
|
- p, ch;
|
|
|
+ var details = peg$posDetailsCache[pos], p;
|
|
|
|
|
|
if (details) {
|
|
|
return details;
|
|
@@ -367,23 +486,15 @@ $globals.SmalltalkParser = (function() {
|
|
|
details = peg$posDetailsCache[p];
|
|
|
details = {
|
|
|
line: details.line,
|
|
|
- column: details.column,
|
|
|
- seenCR: details.seenCR
|
|
|
+ column: details.column
|
|
|
};
|
|
|
|
|
|
while (p < pos) {
|
|
|
- ch = input.charAt(p);
|
|
|
- if (ch === "\n") {
|
|
|
- if (!details.seenCR) { details.line++; }
|
|
|
- details.column = 1;
|
|
|
- details.seenCR = false;
|
|
|
- } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
|
|
|
+ if (input.charCodeAt(p) === 10) {
|
|
|
details.line++;
|
|
|
details.column = 1;
|
|
|
- details.seenCR = true;
|
|
|
} else {
|
|
|
details.column++;
|
|
|
- details.seenCR = false;
|
|
|
}
|
|
|
|
|
|
p++;
|
|
@@ -423,71 +534,13 @@ $globals.SmalltalkParser = (function() {
|
|
|
peg$maxFailExpected.push(expected);
|
|
|
}
|
|
|
|
|
|
- function peg$buildException(message, expected, found, location) {
|
|
|
- function cleanupExpected(expected) {
|
|
|
- var i = 1;
|
|
|
-
|
|
|
- expected.sort(function(a, b) {
|
|
|
- if (a.description < b.description) {
|
|
|
- return -1;
|
|
|
- } else if (a.description > b.description) {
|
|
|
- return 1;
|
|
|
- } else {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- while (i < expected.length) {
|
|
|
- if (expected[i - 1] === expected[i]) {
|
|
|
- expected.splice(i, 1);
|
|
|
- } else {
|
|
|
- i++;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function buildMessage(expected, found) {
|
|
|
- function stringEscape(s) {
|
|
|
- function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }
|
|
|
-
|
|
|
- return s
|
|
|
- .replace(/\\/g, '\\\\')
|
|
|
- .replace(/"/g, '\\"')
|
|
|
- .replace(/\x08/g, '\\b')
|
|
|
- .replace(/\t/g, '\\t')
|
|
|
- .replace(/\n/g, '\\n')
|
|
|
- .replace(/\f/g, '\\f')
|
|
|
- .replace(/\r/g, '\\r')
|
|
|
- .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
|
|
|
- .replace(/[\x10-\x1F\x80-\xFF]/g, function(ch) { return '\\x' + hex(ch); })
|
|
|
- .replace(/[\u0100-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); })
|
|
|
- .replace(/[\u1000-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); });
|
|
|
- }
|
|
|
-
|
|
|
- var expectedDescs = new Array(expected.length),
|
|
|
- expectedDesc, foundDesc, i;
|
|
|
-
|
|
|
- for (i = 0; i < expected.length; i++) {
|
|
|
- expectedDescs[i] = expected[i].description;
|
|
|
- }
|
|
|
-
|
|
|
- expectedDesc = expected.length > 1
|
|
|
- ? expectedDescs.slice(0, -1).join(", ")
|
|
|
- + " or "
|
|
|
- + expectedDescs[expected.length - 1]
|
|
|
- : expectedDescs[0];
|
|
|
-
|
|
|
- foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";
|
|
|
-
|
|
|
- return "Expected " + expectedDesc + " but " + foundDesc + " found.";
|
|
|
- }
|
|
|
-
|
|
|
- if (expected !== null) {
|
|
|
- cleanupExpected(expected);
|
|
|
- }
|
|
|
+ function peg$buildSimpleError(message, location) {
|
|
|
+ return new peg$SyntaxError(message, null, null, location);
|
|
|
+ }
|
|
|
|
|
|
+ function peg$buildStructuredError(expected, found, location) {
|
|
|
return new peg$SyntaxError(
|
|
|
- message !== null ? message : buildMessage(expected, found),
|
|
|
+ peg$SyntaxError.buildMessage(expected, found),
|
|
|
expected,
|
|
|
found,
|
|
|
location
|
|
@@ -4063,17 +4116,20 @@ $globals.SmalltalkParser = (function() {
|
|
|
return s0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ var $globals = $boot.globals;
|
|
|
+
|
|
|
+
|
|
|
peg$result = peg$startRuleFunction();
|
|
|
|
|
|
if (peg$result !== peg$FAILED && peg$currPos === input.length) {
|
|
|
return peg$result;
|
|
|
} else {
|
|
|
if (peg$result !== peg$FAILED && peg$currPos < input.length) {
|
|
|
- peg$fail({ type: "end", description: "end of input" });
|
|
|
+ peg$fail(peg$endExpectation());
|
|
|
}
|
|
|
|
|
|
- throw peg$buildException(
|
|
|
- null,
|
|
|
+ throw peg$buildStructuredError(
|
|
|
peg$maxFailExpected,
|
|
|
peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
|
|
|
peg$maxFailPos < input.length
|
|
@@ -4087,5 +4143,4 @@ $globals.SmalltalkParser = (function() {
|
|
|
SyntaxError: peg$SyntaxError,
|
|
|
parse: peg$parse
|
|
|
};
|
|
|
-})();
|
|
|
-});
|
|
|
+});
|