diff --git a/lib/modules/Tools.pmod/Standalone.pmod/precompile.pike b/lib/modules/Tools.pmod/Standalone.pmod/precompile.pike
index 29ab45ab9d25b2996da2afd93a4be1326de58566..066d6e03b7d755618ae989f3bd254dd0923fb3f7 100644
--- a/lib/modules/Tools.pmod/Standalone.pmod/precompile.pike
+++ b/lib/modules/Tools.pmod/Standalone.pmod/precompile.pike
@@ -1089,8 +1089,20 @@ class PikeType
 		  tmp=q[1..sizeof(q)-2]/({".."});
 		  /* Workaround for buggy Parser.Pike */
 		  if(sizeof(tmp)==1) tmp=q[1..sizeof(q)-2]/({".. "});
-		  if(sizeof(tmp[0])) low=tmp[0]->cast("string")*"";
-		  if(sizeof(tmp[1])) high=tmp[1]->cast("string")*"";
+		  if (sizeof(tmp) == 1) {
+		    int bits;
+		    /* Support the string(Xbit) syntax too. */
+		    if ((sizeof(q) == 4) && (q[2]->cast("string") == "bit") &&
+			((bits = (int)q[1]->cast("string")) > 0)) {
+		      low = "0";
+		      high = sprintf("%d", (1 << bits) - 1);
+		    } else {
+		      error("Syntax error in string subtype.\n");
+		    }
+		  } else {
+		    if(sizeof(tmp[0])) low=tmp[0]->cast("string")*"";
+		    if(sizeof(tmp[1])) high=tmp[1]->cast("string")*"";
+		  }
 		}
 		args=({PikeType(PC.Token(low)),PikeType(PC.Token(high))});
 		break;