//with_stmt: 'with' with_item (',' with_item)* ':' suite //with_item: test ['as' expr] private WithStatement ParseWithStmt() { Eat(TokenKind.KeywordWith); var withItem = ParseWithItem(); List<WithItem> items = null; while (MaybeEat(TokenKind.Comma)) { if (items == null) { items = new List<WithItem>(); } items.Add(ParseWithItem()); } var header = GetEnd(); Statement body = ParseSuite(); if (items != null) { for (int i = items.Count - 1; i >= 0; i--) { var curItem = items[i]; var innerWith = new WithStatement(curItem.ContextManager, curItem.Variable, body); innerWith.HeaderIndex = header; innerWith.SetLoc(_globalParent, withItem.Start, GetEnd()); body = innerWith; header = GetEnd(); } } WithStatement ret = new WithStatement(withItem.ContextManager, withItem.Variable, body); ret.HeaderIndex = header; ret.SetLoc(_globalParent, withItem.Start, GetEnd()); return ret; }
//with_stmt: 'with' expression [ 'as' with_var ] ':' suite private WithStatement ParseWithStmt() { SkipName(Symbols.With); SourceLocation start = GetStart(); Expression contextManager = ParseExpression(); Expression var = null; if (PeekName(Symbols.As)) { SkipName(Symbols.As); var = ParseExpression(); } SourceLocation header = GetEnd(); Statement body = ParseSuite(); WithStatement ret = new WithStatement(contextManager, var, body); ret.Header = header; ret.SetLoc(start, GetEnd()); return ret; }
//with_stmt: 'with' expression [ 'as' with_var ] ':' suite private WithStatement ParseWithStmt() { Eat(TokenKind.KeywordWith); SourceLocation start = GetStart(); Expression contextManager = ParseExpression(); Expression var = null; if (MaybeEat(TokenKind.KeywordAs)) { var = ParseExpression(); } SourceLocation header = GetEnd(); Statement body = ParseSuite(); WithStatement ret = new WithStatement(contextManager, var, body); ret.Header = header; ret.SetLoc(start, GetEnd()); return ret; }
//with_stmt: 'with' test [ 'as' with_var ] ':' suite private WithStatement ParseWithStmt() { EatName(SymbolTable.With); Location start = GetStart(); Expression contextManager = ParseTest(); Expression var = null; if (PeekName(SymbolTable.As)) { EatName(SymbolTable.As); var = ParseTest(); } Location header = GetEnd(); Statement body = ParseSuite(); WithStatement ret = new WithStatement(contextManager, var, body); ret.Header = header; ret.SetLoc(GetExternal(), start, GetEnd()); return ret; }