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)); }