|  | @@ -43,6 +43,7 @@ smalltalk.parser = (function(){
 | 
	
		
			
				|  |  |          "identifier": parse_identifier,
 | 
	
		
			
				|  |  |          "varIdentifier": parse_varIdentifier,
 | 
	
		
			
				|  |  |          "keyword": parse_keyword,
 | 
	
		
			
				|  |  | +        "selector": parse_selector,
 | 
	
		
			
				|  |  |          "className": parse_className,
 | 
	
		
			
				|  |  |          "string": parse_string,
 | 
	
		
			
				|  |  |          "symbol": parse_symbol,
 | 
	
	
		
			
				|  | @@ -579,6 +580,75 @@ smalltalk.parser = (function(){
 | 
	
		
			
				|  |  |          return result0;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  | +      function parse_selector() {
 | 
	
		
			
				|  |  | +        var cacheKey = "selector@" + pos.offset;
 | 
	
		
			
				|  |  | +        var cachedResult = cache[cacheKey];
 | 
	
		
			
				|  |  | +        if (cachedResult) {
 | 
	
		
			
				|  |  | +          pos = clone(cachedResult.nextPos);
 | 
	
		
			
				|  |  | +          return cachedResult.result;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        var result0, result1, result2;
 | 
	
		
			
				|  |  | +        var pos0, pos1;
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        pos0 = clone(pos);
 | 
	
		
			
				|  |  | +        pos1 = clone(pos);
 | 
	
		
			
				|  |  | +        if (/^[a-zA-Z]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | +          result0 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | +          advance(pos, 1);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          result0 = null;
 | 
	
		
			
				|  |  | +          if (reportFailures === 0) {
 | 
	
		
			
				|  |  | +            matchFailed("[a-zA-Z]");
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (result0 !== null) {
 | 
	
		
			
				|  |  | +          result1 = [];
 | 
	
		
			
				|  |  | +          if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | +            result2 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | +            advance(pos, 1);
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            result2 = null;
 | 
	
		
			
				|  |  | +            if (reportFailures === 0) {
 | 
	
		
			
				|  |  | +              matchFailed("[a-zA-Z0-9:]");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          while (result2 !== null) {
 | 
	
		
			
				|  |  | +            result1.push(result2);
 | 
	
		
			
				|  |  | +            if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | +              result2 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | +              advance(pos, 1);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +              result2 = null;
 | 
	
		
			
				|  |  | +              if (reportFailures === 0) {
 | 
	
		
			
				|  |  | +                matchFailed("[a-zA-Z0-9:]");
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          if (result1 !== null) {
 | 
	
		
			
				|  |  | +            result0 = [result0, result1];
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            result0 = null;
 | 
	
		
			
				|  |  | +            pos = clone(pos1);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          result0 = null;
 | 
	
		
			
				|  |  | +          pos = clone(pos1);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (result0 !== null) {
 | 
	
		
			
				|  |  | +          result0 = (function(offset, line, column, first, others) {return first + others.join("")})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (result0 === null) {
 | 
	
		
			
				|  |  | +          pos = clone(pos0);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        cache[cacheKey] = {
 | 
	
		
			
				|  |  | +          nextPos: clone(pos),
 | 
	
		
			
				|  |  | +          result:  result0
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        return result0;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  |        function parse_className() {
 | 
	
		
			
				|  |  |          var cacheKey = "className@" + pos.offset;
 | 
	
		
			
				|  |  |          var cachedResult = cache[cacheKey];
 | 
	
	
		
			
				|  | @@ -778,7 +848,7 @@ smalltalk.parser = (function(){
 | 
	
		
			
				|  |  |            return cachedResult.result;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  | -        var result0, result1, result2, result3;
 | 
	
		
			
				|  |  | +        var result0, result1;
 | 
	
		
			
				|  |  |          var pos0, pos1, pos2;
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |          pos0 = clone(pos);
 | 
	
	
		
			
				|  | @@ -793,95 +863,16 @@ smalltalk.parser = (function(){
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (result0 !== null) {
 | 
	
		
			
				|  |  | -          result1 = [];
 | 
	
		
			
				|  |  | -          pos2 = clone(pos);
 | 
	
		
			
				|  |  | -          if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | -            result3 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | -            advance(pos, 1);
 | 
	
		
			
				|  |  | -          } else {
 | 
	
		
			
				|  |  | -            result3 = null;
 | 
	
		
			
				|  |  | -            if (reportFailures === 0) {
 | 
	
		
			
				|  |  | -              matchFailed("[a-zA-Z0-9:]");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          if (result3 !== null) {
 | 
	
		
			
				|  |  | -            result2 = [];
 | 
	
		
			
				|  |  | -            while (result3 !== null) {
 | 
	
		
			
				|  |  | -              result2.push(result3);
 | 
	
		
			
				|  |  | -              if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | -                result3 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | -                advance(pos, 1);
 | 
	
		
			
				|  |  | -              } else {
 | 
	
		
			
				|  |  | -                result3 = null;
 | 
	
		
			
				|  |  | -                if (reportFailures === 0) {
 | 
	
		
			
				|  |  | -                  matchFailed("[a-zA-Z0-9:]");
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          } else {
 | 
	
		
			
				|  |  | -            result2 = null;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          if (result2 !== null) {
 | 
	
		
			
				|  |  | -            result2 = (function(offset, line, column, digits) {return digits.join("")})(pos2.offset, pos2.line, pos2.column, result2);
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          if (result2 === null) {
 | 
	
		
			
				|  |  | -            pos = clone(pos2);
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          if (result2 === null) {
 | 
	
		
			
				|  |  | -            pos2 = clone(pos);
 | 
	
		
			
				|  |  | -            result2 = parse_string();
 | 
	
		
			
				|  |  | -            if (result2 !== null) {
 | 
	
		
			
				|  |  | -              result2 = (function(offset, line, column, node) {return node._value()})(pos2.offset, pos2.line, pos2.column, result2);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (result2 === null) {
 | 
	
		
			
				|  |  | -              pos = clone(pos2);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          while (result2 !== null) {
 | 
	
		
			
				|  |  | -            result1.push(result2);
 | 
	
		
			
				|  |  | +          result1 = parse_selector();
 | 
	
		
			
				|  |  | +          if (result1 === null) {
 | 
	
		
			
				|  |  |              pos2 = clone(pos);
 | 
	
		
			
				|  |  | -            if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | -              result3 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | -              advance(pos, 1);
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -              result3 = null;
 | 
	
		
			
				|  |  | -              if (reportFailures === 0) {
 | 
	
		
			
				|  |  | -                matchFailed("[a-zA-Z0-9:]");
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (result3 !== null) {
 | 
	
		
			
				|  |  | -              result2 = [];
 | 
	
		
			
				|  |  | -              while (result3 !== null) {
 | 
	
		
			
				|  |  | -                result2.push(result3);
 | 
	
		
			
				|  |  | -                if (/^[a-zA-Z0-9:]/.test(input.charAt(pos.offset))) {
 | 
	
		
			
				|  |  | -                  result3 = input.charAt(pos.offset);
 | 
	
		
			
				|  |  | -                  advance(pos, 1);
 | 
	
		
			
				|  |  | -                } else {
 | 
	
		
			
				|  |  | -                  result3 = null;
 | 
	
		
			
				|  |  | -                  if (reportFailures === 0) {
 | 
	
		
			
				|  |  | -                    matchFailed("[a-zA-Z0-9:]");
 | 
	
		
			
				|  |  | -                  }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -              result2 = null;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (result2 !== null) {
 | 
	
		
			
				|  |  | -              result2 = (function(offset, line, column, digits) {return digits.join("")})(pos2.offset, pos2.line, pos2.column, result2);
 | 
	
		
			
				|  |  | +            result1 = parse_string();
 | 
	
		
			
				|  |  | +            if (result1 !== null) {
 | 
	
		
			
				|  |  | +              result1 = (function(offset, line, column, node) {return node._value()})(pos2.offset, pos2.line, pos2.column, result1);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if (result2 === null) {
 | 
	
		
			
				|  |  | +            if (result1 === null) {
 | 
	
		
			
				|  |  |                pos = clone(pos2);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if (result2 === null) {
 | 
	
		
			
				|  |  | -              pos2 = clone(pos);
 | 
	
		
			
				|  |  | -              result2 = parse_string();
 | 
	
		
			
				|  |  | -              if (result2 !== null) {
 | 
	
		
			
				|  |  | -                result2 = (function(offset, line, column, node) {return node._value()})(pos2.offset, pos2.line, pos2.column, result2);
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -              if (result2 === null) {
 | 
	
		
			
				|  |  | -                pos = clone(pos2);
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            if (result1 !== null) {
 | 
	
		
			
				|  |  |              result0 = [result0, result1];
 | 
	
	
		
			
				|  | @@ -896,7 +887,7 @@ smalltalk.parser = (function(){
 | 
	
		
			
				|  |  |          if (result0 !== null) {
 | 
	
		
			
				|  |  |            result0 = (function(offset, line, column, val) {
 | 
	
		
			
				|  |  |                                return smalltalk.ValueNode._new()
 | 
	
		
			
				|  |  | -                                     ._value_(val.join("").replace(/\"/ig, '"'))
 | 
	
		
			
				|  |  | +                                     ._value_(val)
 | 
	
		
			
				|  |  |                            })(pos0.offset, pos0.line, pos0.column, result0[1]);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (result0 === null) {
 |