// '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); SourceLocation start = GetStart(); ModuleName dname = ParseRelativeModuleName(); Eat(TokenKind.KeywordImport); bool ateParen = MaybeEat(TokenKind.LeftParenthesis); SymbolId[] names; SymbolId[] asNames; bool fromFuture = false; if (MaybeEat(TokenKind.Multiply)) { names = FromImportStatement.Star; asNames = null; if (dname is RelativeModuleName) { ReportSyntaxError("'import *' not allowed with 'from .'"); } } else { List<SymbolId> l = new List<SymbolId>(); List<SymbolId> las = new List<SymbolId>(); if (MaybeEat(TokenKind.LeftParenthesis)) { ParseAsNameList(l, las); Eat(TokenKind.RightParenthesis); } else { ParseAsNameList(l, las); } names = l.ToArray(); asNames = las.ToArray(); } // Process from __future__ statement if (dname.Names.Count == 1 && dname.Names[0] == Symbols.Future) { if (!_fromFutureAllowed) { ReportSyntaxError(IronPython.Resources.MisplacedFuture); } if (names == FromImportStatement.Star) { ReportSyntaxError(IronPython.Resources.NoFutureStar); } fromFuture = true; foreach (SymbolId name in names) { if (name == Symbols.Division) { _languageFeatures |= PythonLanguageFeatures.TrueDivision; } else if (name == Symbols.WithStmt) { _languageFeatures |= PythonLanguageFeatures.AllowWithStatement; } else if (name == Symbols.AbsoluteImport) { _languageFeatures |= PythonLanguageFeatures.AbsoluteImports; } else if (name == Symbols.PrintFunction && Python26) { _languageFeatures |= PythonLanguageFeatures.PrintFunction; _tokenizer.PrintFunction = true; } else if (name == Symbols.UnicodeLiterals && Python26) { // nop for us, just ignore it... } else if (name == Symbols.NestedScopes) { } else if (name == Symbols.Generators) { } else { string strName = SymbolTable.IdToString(name); fromFuture = false; if (strName != "braces") { ReportSyntaxError(IronPython.Resources.UnknownFutureFeature + strName); } else { // match CPython error message ReportSyntaxError(IronPython.Resources.NotAChance); } } } } if (ateParen) { Eat(TokenKind.RightParenthesis); } FromImportStatement ret = new FromImportStatement(dname, names, asNames, fromFuture, AbsoluteImports); ret.SetLoc(start, GetEnd()); return ret; }
// '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); var start = GetStart(); ModuleName dname = ParseRelativeModuleName(); Eat(TokenKind.KeywordImport); bool ateParen = MaybeEat(TokenKind.LeftParenthesis); string[] names; string[] asNames; bool fromFuture = false; if (MaybeEat(TokenKind.Multiply)) { names = (string[])FromImportStatement.Star; asNames = null; } else { List<string> l = new List<string>(); List<string> las = new List<string>(); if (MaybeEat(TokenKind.LeftParenthesis)) { ParseAsNameList(l, las); Eat(TokenKind.RightParenthesis); } else { ParseAsNameList(l, las); } names = l.ToArray(); asNames = las.ToArray(); } // Process from __future__ statement if (dname.Names.Count == 1 && dname.Names[0] == "__future__") { if (!_fromFutureAllowed) { ReportSyntaxError(IronPython.Resources.MisplacedFuture); } if (names == FromImportStatement.Star) { ReportSyntaxError(IronPython.Resources.NoFutureStar); } fromFuture = true; foreach (string name in names) { if (name == "division") { _languageFeatures |= ModuleOptions.TrueDivision; } else if (name == "with_statement") { _languageFeatures |= ModuleOptions.WithStatement; } else if (name == "absolute_import") { _languageFeatures |= ModuleOptions.AbsoluteImports; } else if (name == "print_function") { _languageFeatures |= ModuleOptions.PrintFunction; _tokenizer.PrintFunction = true; } else if (name == "unicode_literals") { _tokenizer.UnicodeLiterals = true; _languageFeatures |= ModuleOptions.UnicodeLiterals; } else if (name == "nested_scopes") { } else if (name == "generators") { } else { string strName = name; fromFuture = false; if (strName != "braces") { ReportSyntaxError(IronPython.Resources.UnknownFutureFeature + strName); } else { // match CPython error message ReportSyntaxError(IronPython.Resources.NotAChance); } } } } if (ateParen) { Eat(TokenKind.RightParenthesis); } FromImportStatement ret = new FromImportStatement(dname, (string[])names, asNames, fromFuture, AbsoluteImports); ret.SetLoc(_globalParent, start, GetEnd()); return ret; }
//| 'from' dotted_name 'import' ('*' | as_name_list | '(' as_name_list ')' ) private FromImportStatement ParseFromImportStmt() { Eat(TokenKind.KeywordFrom); Location start = GetStart(); DottedName dname = ParseDottedName(); Eat(TokenKind.KeywordImport); IList<SymbolId> names; IList<SymbolId> asNames; bool fromFuture = false; if (MaybeEat(TokenKind.Multiply)) { names = FromImportStatement.Star; asNames = null; } else { List<SymbolId> l = new List<SymbolId>(); List<SymbolId> las = new List<SymbolId>(); if (MaybeEat(TokenKind.LeftParenthesis)) { ParseAsNameList(l, las); Eat(TokenKind.RightParenthesis); } else { ParseAsNameList(l, las); } names = l.ToArray(); asNames = las.ToArray(); } // Process from __future__ statement if (dname.Names.Count == 1 && dname.Names[0] == SymbolTable.Future) { if (!fromFutureAllowed) { ReportSyntaxError("from __future__ imports must occur at the beginning of the file"); } if (names == FromImportStatement.Star) { ReportSyntaxError("future statement does not support import *"); } fromFuture = true; foreach (SymbolId name in names) { if (name == SymbolTable.Division) { context.TrueDivision = true; } else if (Options.Python25 && name == SymbolTable.WithStmt) { context.AllowWithStatement = true; } else if (name == SymbolTable.NestedScopes) { } else if (name == SymbolTable.Generators) { } else { fromFuture = false; ReportSyntaxError(string.Format("future feature is not defined: {0}", name.GetString())); } } } FromImportStatement ret = new FromImportStatement(dname, names, asNames, fromFuture); ret.SetLoc(GetExternal(), start, GetEnd()); return ret; }