|  | @@ -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
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  | -})();
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +});
 |