src/sap.ui.core/src/sap/ui/base/BindingParser.js
function expression(sInput, iStart, oBindingMode) {
			var oBinding = ExpressionParser.parse(resolveEmbeddedBinding.bind(null, oEnv), sString,
					iStart, null, bStaticContext ? oContext : null);

			/**
			 * Recursively sets the mode <code>oBindingMode</code> on the given binding (or its
			 * parts).
			 *
			 * @param {object} oBinding
			 *   a binding which may be composite
			 * @param {int} [iIndex]
			 *   index provided by <code>forEach</code>
			 */
			function setMode(oBinding, iIndex) {
				if (oBinding.parts) {
					oBinding.parts.forEach(function (vPart, i) {
						if (typeof vPart === "string") {
							vPart = oBinding.parts[i] = {path : vPart};
						}
						setMode(vPart, i);
					});
					b2ndLevelMergedNeeded = b2ndLevelMergedNeeded || iIndex !== undefined;
				} else {
					oBinding.mode = oBindingMode;
				}
			}

			if (sInput.charAt(oBinding.at) !== "}") {
				throw new SyntaxError("Expected '}' and instead saw '"
					+ sInput.charAt(oBinding.at)
					+ "' in expression binding "
					+ sInput
					+ " at position "
					+ oBinding.at);
			}
			oBinding.at += 1;
			if (oBinding.result) {
				setMode(oBinding.result);
			} else {
				aFragments[aFragments.length - 1] = String(oBinding.constant);
				bUnescaped = true;
			}
			return oBinding;
		}
function expression(sInput, iStart, oBindingMode) {
			var oBinding = ExpressionParser.parse(resolveEmbeddedBinding.bind(null, oEnv), sString,
					iStart, null, bStaticContext ? oContext : null);

			/**
			 * Recursively sets the mode <code>oBindingMode</code> on the given binding (or its
			 * parts).
			 *
			 * @param {object} oBinding
			 *   a binding which may be composite
			 * @param {int} [iIndex]
			 *   index provided by <code>forEach</code>
			 */
			function setMode(oBinding, iIndex) {
				if (oBinding.parts) {
					oBinding.parts.forEach(function (vPart, i) {
						if (typeof vPart === "string") {
							vPart = oBinding.parts[i] = {path : vPart};
						}
						setMode(vPart, i);
					});
					b2ndLevelMergedNeeded = b2ndLevelMergedNeeded || iIndex !== undefined;
				} else {
					oBinding.mode = oBindingMode;
				}
			}

			if (sInput.charAt(oBinding.at) !== "}") {
				throw new SyntaxError("Expected '}' and instead saw '"
					+ sInput.charAt(oBinding.at)
					+ "' in expression binding "
					+ sInput
					+ " at position "
					+ oBinding.at);
			}
			oBinding.at += 1;
			if (oBinding.result) {
				setMode(oBinding.result);
			} else {
				aFragments[aFragments.length - 1] = String(oBinding.constant);
				bUnescaped = true;
			}
			return oBinding;
		}
function expression ( sInput , iStart , oBindingMode ) { var oBinding = ExpressionParser . parse ( resolveEmbeddedBinding . bind ( null , oEnv ) , sString , iStart , null , bStaticContext ? oContext : null ) ; /**
			 * Recursively sets the mode <code>oBindingMode</code> on the given binding (or its
			 * parts).
			 *
			 * @param {object} oBinding
			 *   a binding which may be composite
			 * @param {int} [iIndex]
			 *   index provided by <code>forEach</code>
			 */ function setMode ( oBinding , iIndex ) { if ( oBinding . parts ) { oBinding . parts . forEach ( function ( vPart , i ) { if ( typeof vPart === "string" ) { vPart = oBinding . parts [ i ] = { path : vPart } ; } setMode ( vPart , i ) ; } ) ; b2ndLevelMergedNeeded = b2ndLevelMergedNeeded || iIndex !== undefined ; } else { oBinding . mode = oBindingMode ; } } if ( sInput . charAt ( oBinding . at ) !== "}" ) { throw new SyntaxError ( "Expected '}' and instead saw '" + sInput . charAt ( oBinding . at ) + "' in expression binding " + sInput + " at position " + oBinding . at ) ; } oBinding . at += 1 ; if ( oBinding . result ) { setMode ( oBinding . result ) ; } else { aFragments [ aFragments . length - 1 ] = String ( oBinding . constant ) ; bUnescaped = true ; } return oBinding ; }
Parses an expression. Sets the flags accordingly.

@param {string} sInput The input string to parse from
@param {int} iStart The start index
@param {sap.ui.model.BindingMode} oBindingMode the binding mode
@returns {object} a result object with the binding in <code>result</code> and the index
after the last character belonging to the expression in <code>at</code>
@throws SyntaxError if the expression string is invalid
Parses an expression . Sets the flags accordingly .