Exemplo n.º 1
0
        internal Variable GetDataType(TokenExpression dataTypeToken)
        {
            bool     isRef           = false;
            bool     isArray         = false;
            int      structType      = -1;
            int      arrayDimensions = 0;
            DataType dataType        = DataType.Void;

            for (int i = 0; i < dataTypeToken.Subexpressions.Count; i++)
            {
                var token = dataTypeToken.Subexpressions[i];

                switch (token.TokenType)
                {
                case TokenType.ArrayType:
                    dataTypeToken = token;
                    i             = -1;
                    continue;

                case TokenType.Ref:
                    isRef = true;
                    break;

                case TokenType.Array:
                    isArray = true;
                    //i++;
                    arrayDimensions = 1;
                    break;

                case TokenType.Number:
                    arrayDimensions = token.Token.ToInt();
                    break;

                case TokenType.Void:
                    dataType = DataType.Void;
                    break;

                case TokenType.Int:
                    dataType = DataType.Int;
                    if (isArray)
                    {
                        dataType += 4;
                    }
                    if (isRef)
                    {
                        dataType += 8;
                    }
                    break;

                case TokenType.Struct:
                    dataType   = DataType.Struct;
                    structType = -1;
                    if (isArray)
                    {
                        dataType += 4;
                    }
                    if (isRef)
                    {
                        dataType += 8;
                    }
                    break;

                case TokenType.String:
                    dataType = DataType.String;
                    if (isArray)
                    {
                        dataType += 4;
                    }
                    if (isRef)
                    {
                        dataType += 8;
                    }
                    break;

                case TokenType.Float:
                    dataType = DataType.Float;
                    if (isArray)
                    {
                        dataType += 4;
                    }
                    if (isRef)
                    {
                        dataType += 8;
                    }
                    break;

                case TokenType.Bool:
                    dataType = DataType.Bool;
                    if (isArray && !isRef)
                    {
                        dataType += 3;
                    }
                    else if (!isArray && isRef)
                    {
                        dataType += 4;
                    }
                    else if (isArray && isRef)
                    {
                        dataType += 5;
                    }
                    break;

                case TokenType.Lint:
                    dataType = DataType.Lint;
                    if (isArray && !isRef)
                    {
                        dataType += 3;
                    }
                    else if (!isArray && isRef)
                    {
                        dataType += 4;
                    }
                    else if (isArray && isRef)
                    {
                        dataType += 5;
                    }
                    break;

                case TokenType.IMainSystem:
                    dataType = DataType.IMainSystem;
                    break;

                case TokenType.Identifier:
                    string name = token.Token.Value;
                    if (Structs.Contains(name))
                    {
                        structType = Structs.NameToIndex[name];
                        dataType   = DataType.Struct;
                        if (isArray)
                        {
                            dataType += 4;
                        }
                        if (isRef)
                        {
                            dataType += 8;
                        }
                    }
                    else if (Functypes.Contains(name))
                    {
                        structType = Functypes.NameToIndex[name];
                        dataType   = DataType.Functype;
                        if (isArray && !isRef)
                        {
                            dataType += 3;
                        }
                        else if (!isArray && isRef)
                        {
                            dataType += 4;
                        }
                        else if (isArray && isRef)
                        {
                            dataType += 5;
                        }
                    }
                    else if (Delegates.Contains(name))
                    {
                        structType = Delegates.NameToIndex[name];
                        dataType   = DataType.Delegate;
                        if (isArray && !isRef)
                        {
                            dataType += 3;
                        }
                        else if (!isArray && isRef)
                        {
                            dataType += 4;
                        }
                        else if (isArray && isRef)
                        {
                            dataType += 5;
                        }
                    }
                    else
                    {
                        //HLL data types
                        if (name == "intp")
                        {
                            dataType = DataType.RefInt;
                        }
                        else if (name == "stringp")
                        {
                            dataType = DataType.RefString;
                        }
                        else if (name == "floatp")
                        {
                            dataType = DataType.RefFloat;
                        }
                        else if (name == "boolp")
                        {
                            dataType = DataType.RefBool;
                        }
                        else
                        {
                            //unknown data type
                            dataType = DataType.Struct;
                            if (isRef)
                            {
                                dataType = DataType.RefStruct;
                            }
                            structType = -1;
                        }
                    }
                    break;
                }
            }
            return(new Variable("", dataType, structType, arrayDimensions));
        }