//simple_stmt: small_stmt (';' small_stmt)* [';'] Newline private Statement ParseSimpleStmt() { Statement s = ParseSmallStmt(); string newline = null; if (MaybeEat(TokenKind.Semicolon)) { var itemWhiteSpace = MakeWhiteSpaceList(); if (itemWhiteSpace != null) { itemWhiteSpace.Add(_tokenWhiteSpace); } var start = s.StartIndex; List<Statement> l = new List<Statement>(); l.Add(s); while (true) { if (MaybeEatNewLine(out newline) || MaybeEatEof()) { break; } l.Add(ParseSmallStmt()); if (MaybeEatEof()) { // implies a new line break; } else if (!MaybeEat(TokenKind.Semicolon)) { EatNewLine(out newline); break; } if (itemWhiteSpace != null) { itemWhiteSpace.Add(_tokenWhiteSpace); } } Statement[] stmts = l.ToArray(); SuiteStatement ret = new SuiteStatement(stmts); ret.SetLoc(start, stmts[stmts.Length - 1].EndIndex); if (itemWhiteSpace != null) { AddListWhiteSpace(ret, itemWhiteSpace.ToArray()); } if (newline != null) { AddTrailingNewLine(ret, newline); } return ret; } else if (MaybeEatEof()) { } else if (EatNewLine(out newline)) { if (_verbatim) { AddTrailingNewLine(s, newline); } } else { // error handling, make sure we're making forward progress NextToken(); if (_verbatim) { AddTrailingNewLine(s, _tokenWhiteSpace + _token.Token.VerbatimImage); } } return s; }
private JAst ParseFileWorker() { 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 && IsString(ce)) { // 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 (MaybeEatEof()) break; if (MaybeEatNewLine()) continue; Statement s = ParseStmt(); l.Add(s); } Statement[] stmts = l.ToArray(); SuiteStatement ret = new SuiteStatement(stmts); AddIsAltForm(ret); if (_token.Token != null) { ret.SetLoc(0, GetEnd()); } return CreateAst(ret); }