示例#1
0
        public static SailReturnType ToReturnType(TypeNameExpression expr)
        {
            switch (expr.TypeName)
            {
            case "str":
                return(SailReturnType.STR);

            case "bool":
                return(SailReturnType.BOOL);

            case "int":
                return(SailReturnType.INT);

            case "float":
                return(SailReturnType.FLOAT);

            case "void":
                return(SailReturnType.VOID);
            }

            return(SailReturnType.UNKNOWN);
        }
        // main :: (args...) -> void { // Block }
        public IExpression Parse(Parser parser, Token token, IExpression left)
        {
            if (!(left is IdentifierExpression))
            {
                ErrorManager.CreateError("Expected identifier as name for function declaration!", ErrorType.Error, token.Line, token.Column);
                return(null);
            }

            string name = (left as IdentifierExpression).Value;

            if (parser.TokenStream.Peek().Type != TokenType.OPAREN)
            {
                ErrorManager.CreateError("Function parameters must be enclosed in parenthesis!", ErrorType.Error, token.Line, token.Column);
                return(null);
            }

            // Read past open parenthesis
            parser.TokenStream.Read();

            var parameters = new List <VarDeclarationNoAssignExpression>();

            if (parser.TokenStream.Peek().Type != TokenType.CPAREN)
            {
                do
                {
                    var variable = parser.ParseExpression(GetPrecedence() - 1);

                    if (!(variable is VarDeclarationNoAssignExpression))
                    {
                        ErrorManager.CreateError("Parameters must look like: (name: type, ...)!", ErrorType.Error, token.Line, token.Column);
                        return(null);
                    }

                    parameters.Add((VarDeclarationNoAssignExpression)variable);
                } while (parser.TokenStream.MatchAll(TokenType.COMMA));

                parser.TokenStream.Read();
            }
            else
            {
                parser.TokenStream.Read();
            }

            parser.Expect(TokenType.RIGHTARROW);

            var returnTypeExpressions     = new List <TypeNameExpression>();
            TypeNameExpression returnType = null;

            if (parser.TokenStream.Peek().Type == TokenType.OPAREN)
            {
                parser.TokenStream.Read();

                do
                {
                    var type = parser.ParseExpression(GetPrecedence());

                    if (!(type is TypeNameExpression))
                    {
                        ErrorManager.CreateError("Function return type(s) must be a typename!", ErrorType.Error, token.Line, token.Column);
                        return(null);
                    }

                    returnTypeExpressions.Add((TypeNameExpression)type);
                } while (parser.TokenStream.MatchAll(TokenType.COMMA));

                parser.Expect(TokenType.CPAREN);
            }
            else
            {
                returnType = (parser.ParseExpression(0) as TypeNameExpression);
                if (returnType == null)
                {
                    ErrorManager.CreateError("Your function must have a return type: -> [(]type [, type, ...)]!", ErrorType.Error, token.Line, token.Column);
                    return(null);
                }

                if (!(returnType is TypeNameExpression))
                {
                    ErrorManager.CreateError("Function return type(s) must be a typename!", ErrorType.Error, token.Line, token.Column);
                    return(null);
                }
            }

            var block = parser.ParseExpression(GetPrecedence());

            if (block == null || !(block is BlockExpression))
            {
                ErrorManager.CreateError("Function declaration must have a body ({ ... })!", ErrorType.Error, token.Line, token.Column);
                return(null);
            }

            var returnTypes = new List <SailReturnType>();

            if (returnTypeExpressions.Any())
            {
                foreach (var rt in returnTypeExpressions)
                {
                    returnTypes.Add(TypeResolver.ToReturnType(rt));
                }
            }

            else
            {
                returnTypes.Add(TypeResolver.ToReturnType(returnType));
            }

            return(new FunctionExpression(token.Line, token.Column, name, parameters, returnTypes, block as BlockExpression));
        }
示例#3
0
 public static SailType ToSailType(TypeNameExpression expr)
 {
     return(ToSailType(expr.TypeName));
 }