diff --git a/src/parse.js b/src/parse.js
index 8644cc1e8..e1debf8ef 100644
--- a/src/parse.js
+++ b/src/parse.js
@@ -150,18 +150,20 @@ function parse(source, root) {
         throw illegal(token, 'number');
     }
 
-    function parseId(token) {
+    function parseId(token, acceptNegative) {
         var tokenLower = lower(token);
         switch (tokenLower) {
             case "min": return 1;
             case "max": return 0x1FFFFFFF;
             case "0": return 0;
         }
-        if (/^[1-9][0-9]*$/.test(token))
+        if (token.charAt(0) === '-' && !acceptNegative)
+            throw illegal(token, "id");
+        if (/^\-?[1-9][0-9]*$/.test(token))
             return parseInt(token, 10);
-        if (/^0[x][0-9a-f]+$/.test(tokenLower))
+        if (/^\-?0[x][0-9a-f]+$/.test(tokenLower))
             return parseInt(token, 16);
-        if (/^0[0-7]+$/.test(token))
+        if (/^\-?0[0-7]+$/.test(token))
             return parseInt(token, 8);
         throw illegal(token, "id");
     }
@@ -357,7 +359,7 @@ function parse(source, root) {
             throw illegal(token, s_name);
         var name = token;
         skip("=");
-        var value = parseId(next());
+        var value = parseId(next(), true);
         parseInlineOptions(parent.values[name] = new Number(value)); // eslint-disable-line no-new-wrappers
     }