Ejemplo n.º 1
0
        private Expression ParseLambda(
            TokenStream tokens,
            Token firstToken,
            IList <AType> argTypes,
            IList <Token> args,
            Node owner)
        {
            tokens.PopExpected("=>");
            Lambda             lambda = new Lambda(firstToken, owner, args, argTypes);
            IList <Executable> lambdaCode;

            if (tokens.IsNext("{"))
            {
                lambdaCode = this.parser.ExecutableParser.ParseBlock(tokens, false, lambda, false);
            }
            else
            {
                Expression lambdaBodyExpression = this.parser.ExpressionParser.ParseTernary(tokens, lambda);
                lambdaCode = new Executable[] { new ExpressionAsExecutable(lambdaBodyExpression, lambda) };
            }

            if (lambdaCode.Count == 1 && lambdaCode[0] is ExpressionAsExecutable)
            {
                // If a lambda contains a single expression as its code body, then this is an implicit return statement.
                ExpressionAsExecutable eae = (ExpressionAsExecutable)lambdaCode[0];
                lambdaCode[0] = new ReturnStatement(eae.FirstToken, eae.Expression, lambda);
            }
            lambda.Code = lambdaCode.ToArray();
            return(lambda);
        }
Ejemplo n.º 2
0
 protected abstract void TranslateExpressionAsExecutable(List <string> output, ExpressionAsExecutable exprAsExec);
Ejemplo n.º 3
0
 protected override void TranslateExpressionAsExecutable(List <string> output, ExpressionAsExecutable exprAsExec)
 {
     output.Add(this.CurrentTabIndention);
     TranslateExpression(output, exprAsExec.Expression);
     output.Add(";" + this.NL);
 }
Ejemplo n.º 4
0
 private void CompileExpressionAsExecutable(ParserContext parser, ByteBuffer buffer, ExpressionAsExecutable expr)
 {
     this.CompileExpression(parser, buffer, expr.Expression, false);
 }
Ejemplo n.º 5
0
        public static Executable Parse(ParserContext context, TokenStream tokens, TopLevelEntity parent, bool enableSemicolon)
        {
            switch (tokens.PeekValue())
            {
            case "for": return(ParseForLoop(context, tokens, parent));

            case "foreach": return(ParseForEachLoop(context, tokens, parent));

            case "if": return(ParseIfStatement(context, tokens, parent));

            case "while": return(ParseWhileLoop(context, tokens, parent));

            case "do": return(ParseDoWhileLoop(context, tokens, parent));

            case "switch": return(ParseSwitchStatement(context, tokens, parent));

            case "throw": return(ParseThrowStatement(context, tokens, parent));

            case "return": return(ParseReturnStatement(context, tokens, parent));

            case "using": return(ParseUsingStatement(context, tokens, parent));

            case "try": return(ParseTryStatement(context, tokens, parent));

            default:
                break;
            }

            // check for variable declaration
            int        state = tokens.CurrentState;
            CSharpType variableDeclarationType = CSharpType.TryParse(tokens);

            if (variableDeclarationType != null)
            {
                Token variableName = tokens.PopWordIfPresent();
                if (variableName != null && (tokens.IsNext(";") || tokens.IsNext("=") || tokens.IsNext(",")))
                {
                    // This is a variable declaration.
                    Executable varDecl = ParseVariableDeclaration(context, tokens, variableDeclarationType, variableName, parent);
                    if (enableSemicolon)
                    {
                        tokens.PopExpected(";");
                    }
                    return(varDecl);
                }

                tokens.RestoreState(state);
            }

            Expression expr = ExpressionParser.Parse(context, tokens, parent);

            Executable exec;

            string nextToken = tokens.PeekValue();

            switch (nextToken)
            {
            case "=":
            case "+=":
            case "-=":
            case "*=":
            case "/=":
            case "%=":
            case "|=":
            case "&=":
            case "^=":
            case "<<=":
            case ">>=":
                Token      assignmentOpToken = tokens.Pop();
                Expression assignmentValue   = ExpressionParser.Parse(context, tokens, parent);
                exec = new AssignmentStatement(expr.FirstToken, expr, assignmentOpToken, assignmentValue, parent);
                break;

            default:
                exec = new ExpressionAsExecutable(expr, parent);
                break;
            }

            if (enableSemicolon)
            {
                tokens.PopExpected(";");
            }
            return(exec);
        }