function () {
			var leftNode = this.parseConditionExpression();

			while (this.currentToken.type == 'logic') {
				var logic = this.currentToken.value;
				this.readNextToken();

				var rightNode = this.parseConditionExpression();

				// If we are chaining the same logical operator, add nodes to existing object instead of creating another one
				if (typeof leftNode.logic != 'undefined' && leftNode.logic == logic && typeof leftNode.terms != 'undefined') leftNode.terms.push(rightNode);
				else {
					var terms = [leftNode, rightNode];
					leftNode = {'logic': logic, 'terms': terms.slice(0)};
				}
			}

			return leftNode;
		}
function () {
			var leftNode = this.parseConditionExpression();

			while (this.currentToken.type == 'logic') {
				var logic = this.currentToken.value;
				this.readNextToken();

				var rightNode = this.parseConditionExpression();

				
				if (typeof leftNode.logic != 'undefined' && leftNode.logic == logic && typeof leftNode.terms != 'undefined') leftNode.terms.push(rightNode);
				else {
					var terms = [leftNode, rightNode];
					leftNode = {'logic': logic, 'terms': terms.slice(0)};
				}
			}

			return leftNode;
		}
function ( ) { var leftNode = this . parseConditionExpression ( ) ; while ( this . currentToken . type == 'logic' ) { var logic = this . currentToken . value ; this . readNextToken ( ) ; var rightNode = this . parseConditionExpression ( ) ; // If we are chaining the same logical operator, add nodes to existing object instead of creating another one if ( typeof leftNode . logic != 'undefined' && leftNode . logic == logic && typeof leftNode . terms != 'undefined' ) leftNode . terms . push ( rightNode ) ; else { var terms = [ leftNode , rightNode ] ; leftNode = { 'logic' : logic , 'terms' : terms . slice ( 0 ) } ; } } return leftNode ; }
Parse logical expressions (AND/OR)
Parse logical expressions ( AND / OR )