| using System; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using System.Text; | 
 | using OfficeOpenXml.FormulaParsing.ExcelUtilities; | 
 |  | 
 | namespace OfficeOpenXml.FormulaParsing | 
 | { | 
 |     /// <summary> | 
 |     /// This class implements a stack on which instances of <see cref="ParsingScope"/> | 
 |     /// are put. Each ParsingScope represents the parsing of an address in the workbook. | 
 |     /// </summary> | 
 |     public class ParsingScopes | 
 |     { | 
 |         private readonly IParsingLifetimeEventHandler _lifetimeEventHandler; | 
 |  | 
 |         public ParsingScopes(IParsingLifetimeEventHandler lifetimeEventHandler) | 
 |         { | 
 |             _lifetimeEventHandler = lifetimeEventHandler; | 
 |         } | 
 |         private Stack<ParsingScope> _scopes = new Stack<ParsingScope>(); | 
 |  | 
 |         /// <summary> | 
 |         /// Creates a new <see cref="ParsingScope"/> and puts it on top of the stack. | 
 |         /// </summary> | 
 |         /// <param name="address"></param> | 
 |         /// <returns></returns> | 
 |         public virtual ParsingScope NewScope(RangeAddress address) | 
 |         { | 
 |             ParsingScope scope; | 
 |             if (_scopes.Count() > 0) | 
 |             { | 
 |                 scope = new ParsingScope(this, _scopes.Peek(), address); | 
 |             } | 
 |             else | 
 |             { | 
 |                 scope = new ParsingScope(this, address); | 
 |             } | 
 |             _scopes.Push(scope); | 
 |             return scope; | 
 |         } | 
 |  | 
 |  | 
 |         /// <summary> | 
 |         /// The current parsing scope. | 
 |         /// </summary> | 
 |         public virtual ParsingScope Current | 
 |         { | 
 |             get { return _scopes.Count() > 0 ? _scopes.Peek() : null; } | 
 |         } | 
 |  | 
 |         /// <summary> | 
 |         /// Removes the current scope, setting the calling scope to current. | 
 |         /// </summary> | 
 |         /// <param name="parsingScope"></param> | 
 |         public virtual void KillScope(ParsingScope parsingScope) | 
 |         { | 
 |             _scopes.Pop(); | 
 |             if (_scopes.Count() == 0) | 
 |             { | 
 |                 _lifetimeEventHandler.ParsingCompleted(); | 
 |             } | 
 |         } | 
 |     } | 
 | } |