public static List <Statement> Lex(string[] data)
        {
            int curStatement       = 0;
            int curExpression      = 0;
            List <Statement> stats = new List <Statement>();

            stats.Add(new Statement(curStatement));
            curStatement++;
            for (int x = 0; x < data.Length; x++)
            {
                ExpressionData expdat = getExpression(data, x, curExpression);
                curExpression = expdat.curExpression;
                x             = expdat.x;
                stats[curStatement - 1].Expressions.Add(expdat.exp);
                if (x < data.Length - 1 && stats[curStatement - 1].Expressions[stats[curStatement - 1].Expressions.Count - 1].DIR == Directive.Dendl || stats[curStatement - 1].Expressions[stats[curStatement - 1].Expressions.Count - 1].Nested.Count > 0)
                {
                    stats.Add(new Statement(curStatement));
                    curStatement++;
                }
            }
            return(stats);
        }
        private static ExpressionData getExpression(string[] data, int x, int curExpression)
        {
            ExpressionData expdat = new ExpressionData();

            expdat.curExpression = curExpression;
            expdat.x             = x;
            expdat.exp           = new Expression(-4, Directive.Dneq, new Byte[0]);
            switch (data[x])
            {
            case "+":
                expdat.exp = (new Expression(curExpression, Directive.Dadd, new Byte[0]));
                expdat.curExpression++;
                break;

            case "-":
                expdat.exp = (new Expression(curExpression, Directive.Dsub, new Byte[0]));
                expdat.curExpression++;
                break;

            case "*":
                expdat.exp = new Expression(curExpression, Directive.Dmul, new Byte[0]);
                expdat.curExpression++;
                break;

            case "/":
                expdat.exp = new Expression(curExpression, Directive.Ddiv, new Byte[0]);
                expdat.curExpression++;
                break;

            case "^":
                expdat.exp = new Expression(curExpression, Directive.Dpow, new Byte[0]);
                expdat.curExpression++;
                break;

            case "@":
                expdat.exp = new Expression(curExpression, Directive.Drot, new Byte[0]);
                expdat.curExpression++;
                break;

            case "%":
                expdat.exp = new Expression(curExpression, Directive.Dmod, new Byte[0]);
                expdat.curExpression++;
                break;

            case "=":
                expdat.exp = new Expression(curExpression, Directive.Dasn, new Byte[0]);
                expdat.curExpression++;
                break;

            case "==":
                expdat.exp = new Expression(curExpression, Directive.Deq, new Byte[0]);
                expdat.curExpression++;
                break;

            case "!=":
                expdat.exp = (new Expression(curExpression, Directive.Dneq, new Byte[0]));
                expdat.curExpression++;
                break;

            case "<=":
                expdat.exp = (new Expression(curExpression, Directive.Dlteq, new Byte[0]));
                expdat.curExpression++;
                break;

            case ">=":
                expdat.exp = (new Expression(curExpression, Directive.Dgteq, new Byte[0]));
                expdat.curExpression++;
                break;

            case "<":
                expdat.exp = (new Expression(curExpression, Directive.Dlt, new Byte[0]));
                expdat.curExpression++;
                break;

            case ">":
                expdat.exp = (new Expression(curExpression, Directive.Dgt, new Byte[0]));
                expdat.curExpression++;
                break;

            case "&&":
                expdat.exp = (new Expression(curExpression, Directive.Dand, new Byte[0]));
                expdat.curExpression++;
                break;

            case "||":
                expdat.exp = (new Expression(curExpression, Directive.Dor, new Byte[0]));
                expdat.curExpression++;
                break;

            case "^^":
                expdat.exp = (new Expression(curExpression, Directive.Dxor, new Byte[0]));
                expdat.curExpression++;
                break;

            case "if":
                expdat.exp = (new Expression(curExpression, Directive.Dif, new Byte[0]));
                expdat.curExpression++;
                break;

            case "else":
                expdat.exp = (new Expression(curExpression, Directive.Delse, new Byte[0]));
                expdat.curExpression++;
                break;

            case "elif":
                expdat.exp = (new Expression(curExpression, Directive.Delif, new Byte[0]));
                expdat.curExpression++;
                break;

            case "while":
                expdat.exp = (new Expression(curExpression, Directive.Dwhile, new Byte[0]));
                expdat.curExpression++;
                break;

            case "dowhile":
                expdat.exp = (new Expression(curExpression, Directive.Ddowhile, new Byte[0]));
                expdat.curExpression++;
                break;

            case "for":
                expdat.exp = (new Expression(curExpression, Directive.Dfor, new Byte[0]));
                expdat.curExpression++;
                break;

            case "foreach":
                expdat.exp = (new Expression(curExpression, Directive.Dforeach, new Byte[0]));
                expdat.curExpression++;
                break;

            case ";":
                expdat.exp = (new Expression(curExpression, Directive.Dendl, new Byte[0]));
                expdat.curExpression++;
                break;

            case ":":
                expdat.exp = (new Expression(curExpression, Directive.Dcol, new Byte[0]));
                expdat.curExpression++;
                break;

            case "switch":
                expdat.exp = (new Expression(curExpression, Directive.Dswitch, new Byte[0]));
                expdat.curExpression++;
                break;

            case "break":
                expdat.exp = (new Expression(curExpression, Directive.Dbreak, new Byte[0]));
                expdat.curExpression++;
                break;

            case "return":
                expdat.exp = (new Expression(curExpression, Directive.Dreturn, new Byte[0]));
                expdat.curExpression++;
                break;

            case "func":
                expdat.exp = (new Expression(curExpression, Directive.Dfunc, new Byte[0]));
                expdat.curExpression++;
                break;

            case "true":
                expdat.exp = (new Expression(curExpression, Directive.Dbol, BitConverter.GetBytes(true)));
                expdat.curExpression++;
                break;

            case "false":
                expdat.exp = (new Expression(curExpression, Directive.Dbol, BitConverter.GetBytes(false)));
                expdat.curExpression++;
                break;

            case "void":
                expdat.exp = (new Expression(curExpression, Directive.Dvoi, new Byte[0]));
                expdat.curExpression++;
                break;

            default:
                if (data[x][0].ToString() == "\"" && data[x][data[x].Length - 1].ToString() == "\"")
                {
                    expdat.exp = (new Expression(curExpression, Directive.Dbol, Encoding.ASCII.GetBytes(string.Join("", data[x].Skip(1).Take(data[x].Length - 2).ToArray()))));
                    expdat.curExpression++;
                }
                else if (isNumeric(data[x]))
                {
                    switch (determineBestNumericDataType(data[x]))
                    {
                    case DataType.DTsho:
                        expdat.exp = (new Expression(curExpression, Directive.Dsho, BitConverter.GetBytes(Convert.ToInt16(data[x]))));
                        expdat.curExpression++;
                        break;

                    case DataType.DTint:
                        expdat.exp = (new Expression(curExpression, Directive.Dint, BitConverter.GetBytes(Convert.ToInt32(data[x]))));
                        expdat.curExpression++;
                        break;

                    case DataType.DTlon:
                        expdat.exp = (new Expression(curExpression, Directive.Dlon, BitConverter.GetBytes(Convert.ToInt64(data[x]))));
                        expdat.curExpression++;
                        break;

                    case DataType.DTflo:
                        expdat.exp = (new Expression(curExpression, Directive.Dflo, BitConverter.GetBytes((float)Convert.ToDouble(data[x]))));
                        expdat.curExpression++;
                        break;

                    case DataType.DTdob:
                        expdat.exp = (new Expression(curExpression, Directive.Ddob, BitConverter.GetBytes(Convert.ToDouble(data[x]))));
                        expdat.curExpression++;
                        break;

                    case DataType.DTdec:
                        expdat.exp = (new Expression(curExpression, Directive.Dsho, IFE.BitconverterExt.GetBytes(Convert.ToDecimal(data[x]))));
                        expdat.curExpression++;
                        break;
                    }
                }
                else
                {
                    expdat.exp = (new Expression(curExpression, Directive.Dvar, Encoding.ASCII.GetBytes(data[x])));
                    expdat.curExpression++;
                }
                break;
            }
            if (x < data.Length - 1 && data[x + 1] == "(")
            {
                int[][] positions = GetArgumentPositions(data, x);
                for (int y = 0; y < positions.Length - 1; y++)
                {
                    expdat.exp.Arguments.Add(new List <Expression>());
                    for (int z = 0; z < positions[y].Length; z++)
                    {
                        expdat.exp.Arguments[y].Add(getExpression(data, positions[y][z], expdat.curExpression).exp);
                        expdat.curExpression++;
                    }
                }
                x = positions[positions.Length - 1][positions[positions.Length - 1].Length - 1] - 1;
            }
            if (x < data.Length - 1 && data[x + 1] == "[")
            {
                int[][] positions = GetArgumentPositions(data, x);
                for (int y = 0; y < positions.Length - 1; y++)
                {
                    expdat.exp.Indices.Add(new List <Expression>());
                    for (int z = 0; z < positions[y].Length; z++)
                    {
                        expdat.exp.Indices[y].Add(getExpression(data, positions[y][z], expdat.curExpression).exp);
                        expdat.curExpression++;
                    }
                }
                x = positions[positions.Length - 1][positions[positions.Length - 1].Length - 1] - 1;
            }
            if (x < data.Length - 1 && data[x + 1] == "{")
            {
                int[][] positions = GetArgumentPositions(data, x);
                expdat.exp.Nested.AddRange(Lex(data.Skip(positions[0][0]).Take(positions[positions.Length - 1][positions[positions.Length - 1].Length - 1]).ToArray()));
                x = positions[positions.Length - 1][positions[positions.Length - 1].Length - 1] - 1;
            }
            expdat.x = x;
            return(expdat);
        }