 				break;
 			}
 			for each (token in tokens)
-				if (token is String && '.[](){}'.indexOf(token as String) >= 0)
+				if (token is String && '..[](){}'.indexOf(token as String) >= 0)
 					throw new Error("Misplaced '" + token + "'");
 		}
 		

					// advance the evalIndex so the next parameter will be evaluated.
					call.evalIndex++;
				}
				return null; // unreachable
			};
			builtInSymbolTable['self'] = wrapperFunction;
			
			return wrapperFunction;
		}

				}
				else if (escapeIndex < bracketIndex) // handle '\'
				{
					// append everything before the escaped character
					output += input.substring(searchIndex, escapeIndex);
					
					// look up escaped character
					var c:String = input.charAt(escapeIndex + 1);
					c = DECODE_LOOKUP[c] || c;
					
					if ('0123'.indexOf(c) >= 0)
					{
						// \000 .. \377        a byte specified in octal
						var oct:String = input.substr(escapeIndex + 1, 3);
						c = String.fromCharCode(parseInt(oct, 8));
						searchIndex = escapeIndex + 4; // skip over escape sequence
					}
					else if (c == 'x')
					{
						// \x00 .. \xFF        a byte specified in hexadecimal
						var hex:String = input.substr(escapeIndex + 2, 2);
						c = String.fromCharCode(parseInt(hex, 16));
						searchIndex = escapeIndex + 4; // skip over escape sequence
					}
					else if (c == 'u')
					{
						// \u0000 .. \uFFFF    a 16-bit Unicode character specified in hexadecimal
						var unicode:String = input.substr(escapeIndex + 2, 4);
						c = String.fromCharCode(parseInt(unicode, 16));
						searchIndex = escapeIndex + 6; // skip over escape sequence
					}
					else
					{
						searchIndex = escapeIndex + 2; // skip over escape sequence
					}
					
					// append the escaped character
					output += c;
				}
				else if (bracketIndex < escapeIndex) // handle '{'
				{
