Example #1
0
        private TotemAst ParseFileWorker(bool makeModule, bool returnValue)
        {
            _globalParent = new TotemAst(makeModule, false, _context);
            StartParsing();

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

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

                Statement s = ParseStatement();
                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);
        }
Example #2
0
        public TotemAst ParseTopExpression()
        {
            try
            {
                _globalParent = new TotemAst(false, false, _context);
                StartParsing();

                ReturnStatement ret = new ReturnStatement(ParseExpression());
                ret.SetLoc(_globalParent, 0, 0);
                return FinishParsing(ret);
            }
            catch (BadSourceException bse)
            {
                throw;
            }
        }
Example #3
0
        private LambdaExpression ParseLambdaBody(int startPosition, params Parameter[] parameters)
        {
            Expression exp;
            LambdaExpression ret;
            Statement st;
            if (PeekToken(TokenKind.LeftBrace))
            {
                var inFinally = _inFinally;
                var inLoop = _inLoop;
                var return_ = _return;
                var isGenerator = _isGenerator;
                var isAsync = _isAsync;
                _inLoop = false;
                _inFinally = false;
                _return = false;
                _isGenerator = false;
                _isAsync = false;
                FunctionDefinition fnDef = new FunctionDefinition(null, parameters);
                PushFunction(fnDef);

                st = ParseBlock();

                FunctionDefinition fnDef2 = PopFunction();
                Debug.Assert(fnDef == fnDef2);

                fnDef.Body = st;

                ret = new LambdaExpression(fnDef);

                _inLoop = inLoop;
                _inFinally = inFinally;
                _return = return_;
                _isGenerator = isGenerator;
                _isAsync = isAsync;
            }
            else
            {
                exp = ParseExpression();
                st = new ReturnStatement(exp);
                st.SetLoc(_globalParent, exp.IndexSpan);

                ret = new LambdaExpression(parameters, st);
            }

            ret.SetLoc(_globalParent, startPosition, GetEnd());
            return ret;
        }
Example #4
0
        private Statement ParseReturnStatement()
        {
            Eat(TokenKind.KeywordReturn);
            var start = GetStart();

            ReturnStatement stmt;

            if (CurrentFunction == null)
            {
                ReportSyntaxError(Resources.MisplacedReturn);
                return null;
            }

            _return = true;
            if (_isGenerator)
            {
                ReportSyntaxError(Resources.ReturnInGenerator);
                return null;
            }

            if (!MaybeEat(TokenKind.Semicolon))
            {
                var expr = ParseExpression();
                stmt = new ReturnStatement(expr);
                Eat(TokenKind.Semicolon);
            }
            else
            {
                stmt = new ReturnStatement(null);
            }

            stmt.SetLoc(_globalParent, start, GetEnd());
            return stmt;
        }
Example #5
0
 public override bool Walk(ReturnStatement node)
 {
     node.Parent = _currentScope;
     FunctionDefinition funcDef = _currentScope as FunctionDefinition;
     if (funcDef != null)
     {
         funcDef._hasReturn = true;
     }
     return base.Walk(node);
 }