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); }
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; }
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); } }
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); } }
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; }
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; }
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; }