// 'from' relative_module 'import' identifier ['as' name] (',' identifier ['as' name]) * // 'from' relative_module 'import' '(' identifier ['as' name] (',' identifier ['as' name])* [','] ')' // 'from' module 'import' "*" private FromImportStatement ParseFromImportStmt() { Eat(TokenKind.KeywordFrom); string fromWhiteSpace = _tokenWhiteSpace; var start = GetStart(); ModuleName dname = ParseRelativeModuleName(); bool ateImport = Eat(TokenKind.KeywordImport); string importWhiteSpace = _tokenWhiteSpace; bool ateParen = ateImport && MaybeEat(TokenKind.LeftParenthesis); string parenWhiteSpace = ateParen ? _tokenWhiteSpace : null; NameExpression/*!*/[] names; NameExpression[] asNames; bool fromFuture = false; List<string> namesWhiteSpace = null; if (ateImport) { if (MaybeEat(TokenKind.Multiply)) { if (_langVersion.Is7x() && ((_functions != null && _functions.Count > 0) || _classDepth > 0)) { ReportSyntaxError(start, GetEnd(), "import * only allowed at module level"); } if (_verbatim) { namesWhiteSpace = new List<string>() { _tokenWhiteSpace }; } names = new[] { new NameExpression("*") }; asNames = null; } else { List<NameExpression/*!*/> l = new List<NameExpression>(); List<NameExpression> las = new List<NameExpression>(); ParseAsNameList(l, las, out namesWhiteSpace); names = l.ToArray(); asNames = las.ToArray(); } } else { names = EmptyNames; asNames = EmptyNames; } // Process from __future__ statement if (dname.Names.Count == 1 && dname.Names[0].Name == "__future__") { fromFuture = ProcessFutureStatements(start, names, fromFuture); } bool ateRightParen = false; if (ateParen) { ateRightParen = Eat(TokenKind.RightParenthesis); } FromImportStatement ret = new FromImportStatement(dname, names, asNames, fromFuture, AbsoluteImports); if (_verbatim) { AddPreceedingWhiteSpace(ret, fromWhiteSpace); AddSecondPreceedingWhiteSpace(ret, importWhiteSpace); if (namesWhiteSpace != null) { AddNamesWhiteSpace(ret, namesWhiteSpace.ToArray()); } if (ateParen) { AddThirdPreceedingWhiteSpace(ret, parenWhiteSpace); AddFourthPreceedingWhiteSpace(ret, _tokenWhiteSpace); if (!ateRightParen) { AddErrorMissingCloseGrouping(ret); } } else { AddIsAltForm(ret); } if (!ateImport) { AddErrorIsIncompleteNode(ret); } } ret.SetLoc(start, GetEnd()); return ret; }