Beispiel #1
0
        private PythonAst ParseFileWorker(bool makeModule, bool returnValue) {
            _globalParent = new PythonAst(makeModule, _languageFeatures, false, _context);
            StartParsing();

            List<Statement> l = new List<Statement>();

            //
            // A future statement must appear near the top of the module. 
            // The only lines that can appear before a future statement are: 
            // - the module docstring (if any), 
            // - comments, 
            // - blank lines, and 
            // - other future statements. 
            // 

            MaybeEatNewLine();

            if (PeekToken(TokenKind.Constant)) {
                Statement s = ParseStmt();
                l.Add(s);
                _fromFutureAllowed = false;
                ExpressionStatement es = s as ExpressionStatement;
                if (es != null) {
                    ConstantExpression ce = es.Expression as ConstantExpression;
                    if (ce != null && ce.Value is string) {
                        // doc string
                        _fromFutureAllowed = true;
                    }
                }
            }

            MaybeEatNewLine();

            // from __future__
            if (_fromFutureAllowed) {
                while (PeekToken(Tokens.KeywordFromToken)) {
                    Statement s = ParseStmt();
                    l.Add(s);
                    FromImportStatement fis = s as FromImportStatement;
                    if (fis != null && !fis.IsFromFuture) {
                        // end of from __future__
                        break;
                    }
                }
            }

            // the end of from __future__ sequence
            _fromFutureAllowed = false;

            while (true) {
                if (MaybeEat(TokenKind.EndOfFile)) break;
                if (MaybeEatNewLine()) continue;

                Statement s = ParseStmt();
                l.Add(s);
            }

            Statement[] stmts = l.ToArray();

            if (returnValue && stmts.Length > 0) {
                ExpressionStatement exprStmt = stmts[stmts.Length - 1] as ExpressionStatement;
                if (exprStmt != null) {
                    var retStmt = new ReturnStatement(exprStmt.Expression);
                    stmts[stmts.Length - 1] = retStmt;
                    retStmt.SetLoc(_globalParent, exprStmt.Expression.IndexSpan);
                }
            }

            SuiteStatement ret = new SuiteStatement(stmts);
            ret.SetLoc(_globalParent, 0, GetEnd());
            return FinishParsing(ret);
        }
Beispiel #2
0
        private Statement ParseReturnStmt() {
            if (CurrentFunction == null) {
                ReportSyntaxError(IronPython.Resources.MisplacedReturn);
            }
            NextToken();
            Expression expr = null;
            var start = GetStart();
            if (!NeverTestToken(PeekToken())) {
                expr = ParseTestListAsExpr();
            }

            if (expr != null) {
                _returnWithValue = true;
                if (_isGenerator) {
                    ReportSyntaxError("'return' with argument inside generator");
                }
            }

            ReturnStatement ret = new ReturnStatement(expr);
            ret.SetLoc(_globalParent, start, GetEnd());
            return ret;
        }
Beispiel #3
0
 public PythonAst ParseTopExpression() {
     try {
         // TODO: move from source unit  .TrimStart(' ', '\t')
         _globalParent = new PythonAst(false, _languageFeatures, false, _context);
         ReturnStatement ret = new ReturnStatement(ParseTestListAsExpression());
         ret.SetLoc(_globalParent, 0, 0);
         return FinishParsing(ret);
     } catch (BadSourceException bse) {
         throw BadSourceError(bse);
     }
 }
Beispiel #4
0
 public PythonAst ParseTopExpression() {
     try {
         // TODO: move from source unit  .TrimStart(' ', '\t')
         ReturnStatement ret = new ReturnStatement(ParseTestListAsExpression());
         ret.SetLoc(SourceSpan.None);
         return new PythonAst(ret, false, _languageFeatures, false);
     } catch (BadSourceException bse) {
         throw BadSourceError(bse);
     }
 }
Beispiel #5
0
 private Statement ParseReturnStmt() {
     if (CurrentFunction == null) {
         ReportSyntaxError(IronPython.Resources.MisplacedReturn);
     }
     NextToken();
     Expression expr = null;
     SourceLocation start = GetStart();
     if (!NeverTestToken(PeekToken())) {
         expr = ParseTestListAsExpr(true);
     }
     ReturnStatement ret = new ReturnStatement(expr);
     ret.SetLoc(start, GetEnd());
     return ret;
 }
Beispiel #6
0
        private Expression FinishOldLambdef()
        {
            Location start = GetStart();
            Expression[] parameters, defaults;
            FunctionAttributes flags;
            ParseVarArgsList(out parameters, out defaults, out flags, TokenKind.Colon);
            Location mid = GetEnd();

            Expression expr = ParseOldTest();
            Statement body = new ReturnStatement(expr);
            body.SetLoc(GetExternal(), expr.Start, expr.End);
            FunctionDefinition func = new FunctionDefinition(SymbolTable.StringToId("<lambda$" + (oldLambdaCount++) + ">"), parameters, defaults, flags, body, context.SourceFile);
            func.SetLoc(GetExternal(), start, GetEnd());
            func.Header = mid;
            LambdaExpression ret = new LambdaExpression(func);
            ret.SetLoc(GetExternal(), start, GetEnd());
            return ret;
        }
Beispiel #7
0
 private Statement ParseReturnStmt()
 {
     if (CurrentFunction == null) {
         ReportSyntaxError("'return' outside function");
     }
     NextToken();
     Expression expr = null;
     Location start = GetStart();
     if (!NeverTestToken(PeekToken())) {
         expr = ParseTestListAsExpr(true);
     }
     ReturnStatement ret = new ReturnStatement(expr);
     ret.SetLoc(GetExternal(), start, GetEnd());
     return ret;
 }