Merge remote-tracking branch 'ianloic/fuchsia' into fuchsia

* ianloic/fuchsia:
  Ignore comments in JSON. Not spec compliant but useful.
  Add BUILD.gn for Fuchsia
diff --git a/BUILD.gn b/BUILD.gn
new file mode 100644
index 0000000..d299d84
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,9 @@
+# Copyright 2016 The Fuchsia Authors.  All Rights Reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+static_library("json") {
+  sources = [
+    "src/json.hpp"
+  ]
+}
diff --git a/src/json.hpp b/src/json.hpp
index a8289a4..bd9ffed 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -7693,771 +7693,420 @@
                 m_start = m_cursor;
                 assert(m_start != nullptr);
 
-
-                {
-                    lexer_char_t yych;
-                    unsigned int yyaccept = 0;
-                    static const unsigned char yybm[] =
-                    {
-                        0,   0,   0,   0,   0,   0,   0,   0,
-                        0,  32,  32,   0,   0,  32,   0,   0,
-                        0,   0,   0,   0,   0,   0,   0,   0,
-                        0,   0,   0,   0,   0,   0,   0,   0,
-                        160, 128,   0, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        192, 192, 192, 192, 192, 192, 192, 192,
-                        192, 192, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128,   0, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                        128, 128, 128, 128, 128, 128, 128, 128,
-                    };
-                    if ((m_limit - m_cursor) < 5)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yybm[0 + yych] & 32)
-                    {
-                        goto basic_json_parser_6;
-                    }
-                    if (yych <= '\\')
-                    {
-                        if (yych <= '-')
-                        {
-                            if (yych <= '"')
-                            {
-                                if (yych <= 0x00)
-                                {
-                                    goto basic_json_parser_2;
-                                }
-                                if (yych <= '!')
-                                {
-                                    goto basic_json_parser_4;
-                                }
-                                goto basic_json_parser_9;
-                            }
-                            else
-                            {
-                                if (yych <= '+')
-                                {
-                                    goto basic_json_parser_4;
-                                }
-                                if (yych <= ',')
-                                {
-                                    goto basic_json_parser_10;
-                                }
-                                goto basic_json_parser_12;
-                            }
-                        }
-                        else
-                        {
-                            if (yych <= '9')
-                            {
-                                if (yych <= '/')
-                                {
-                                    goto basic_json_parser_4;
-                                }
-                                if (yych <= '0')
-                                {
-                                    goto basic_json_parser_13;
-                                }
-                                goto basic_json_parser_15;
-                            }
-                            else
-                            {
-                                if (yych <= ':')
-                                {
-                                    goto basic_json_parser_17;
-                                }
-                                if (yych == '[')
-                                {
-                                    goto basic_json_parser_19;
-                                }
-                                goto basic_json_parser_4;
-                            }
-                        }
-                    }
-                    else
-                    {
-                        if (yych <= 't')
-                        {
-                            if (yych <= 'f')
-                            {
-                                if (yych <= ']')
-                                {
-                                    goto basic_json_parser_21;
-                                }
-                                if (yych <= 'e')
-                                {
-                                    goto basic_json_parser_4;
-                                }
-                                goto basic_json_parser_23;
-                            }
-                            else
-                            {
-                                if (yych == 'n')
-                                {
-                                    goto basic_json_parser_24;
-                                }
-                                if (yych <= 's')
-                                {
-                                    goto basic_json_parser_4;
-                                }
-                                goto basic_json_parser_25;
-                            }
-                        }
-                        else
-                        {
-                            if (yych <= '|')
-                            {
-                                if (yych == '{')
-                                {
-                                    goto basic_json_parser_26;
-                                }
-                                goto basic_json_parser_4;
-                            }
-                            else
-                            {
-                                if (yych <= '}')
-                                {
-                                    goto basic_json_parser_28;
-                                }
-                                if (yych == 0xEF)
-                                {
-                                    goto basic_json_parser_30;
-                                }
-                                goto basic_json_parser_4;
-                            }
-                        }
-                    }
-basic_json_parser_2:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::end_of_input;
-                        break;
-                    }
-basic_json_parser_4:
-                    ++m_cursor;
-basic_json_parser_5:
-                    {
-                        last_token_type = token_type::parse_error;
-                        break;
-                    }
-basic_json_parser_6:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yybm[0 + yych] & 32)
-                    {
-                        goto basic_json_parser_6;
-                    }
-                    {
-                        continue;
-                    }
-basic_json_parser_9:
-                    yyaccept = 0;
-                    yych = *(m_marker = ++m_cursor);
-                    if (yych <= 0x1F)
-                    {
-                        goto basic_json_parser_5;
-                    }
-                    goto basic_json_parser_32;
-basic_json_parser_10:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::value_separator;
-                        break;
-                    }
-basic_json_parser_12:
-                    yych = *++m_cursor;
-                    if (yych <= '/')
-                    {
-                        goto basic_json_parser_5;
-                    }
-                    if (yych <= '0')
-                    {
-                        goto basic_json_parser_13;
-                    }
-                    if (yych <= '9')
-                    {
-                        goto basic_json_parser_15;
-                    }
-                    goto basic_json_parser_5;
-basic_json_parser_13:
-                    yyaccept = 1;
-                    yych = *(m_marker = ++m_cursor);
-                    if (yych <= 'D')
-                    {
-                        if (yych == '.')
-                        {
-                            goto basic_json_parser_37;
-                        }
-                    }
-                    else
-                    {
-                        if (yych <= 'E')
-                        {
-                            goto basic_json_parser_38;
-                        }
-                        if (yych == 'e')
-                        {
-                            goto basic_json_parser_38;
-                        }
-                    }
-basic_json_parser_14:
-                    {
-                        last_token_type = token_type::value_number;
-                        break;
-                    }
-basic_json_parser_15:
-                    yyaccept = 1;
-                    m_marker = ++m_cursor;
-                    if ((m_limit - m_cursor) < 3)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yybm[0 + yych] & 64)
-                    {
-                        goto basic_json_parser_15;
-                    }
-                    if (yych <= 'D')
-                    {
-                        if (yych == '.')
-                        {
-                            goto basic_json_parser_37;
-                        }
-                        goto basic_json_parser_14;
-                    }
-                    else
-                    {
-                        if (yych <= 'E')
-                        {
-                            goto basic_json_parser_38;
-                        }
-                        if (yych == 'e')
-                        {
-                            goto basic_json_parser_38;
-                        }
-                        goto basic_json_parser_14;
-                    }
-basic_json_parser_17:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::name_separator;
-                        break;
-                    }
-basic_json_parser_19:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::begin_array;
-                        break;
-                    }
-basic_json_parser_21:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::end_array;
-                        break;
-                    }
-basic_json_parser_23:
-                    yyaccept = 0;
-                    yych = *(m_marker = ++m_cursor);
-                    if (yych == 'a')
-                    {
-                        goto basic_json_parser_39;
-                    }
-                    goto basic_json_parser_5;
-basic_json_parser_24:
-                    yyaccept = 0;
-                    yych = *(m_marker = ++m_cursor);
-                    if (yych == 'u')
-                    {
-                        goto basic_json_parser_40;
-                    }
-                    goto basic_json_parser_5;
-basic_json_parser_25:
-                    yyaccept = 0;
-                    yych = *(m_marker = ++m_cursor);
-                    if (yych == 'r')
-                    {
-                        goto basic_json_parser_41;
-                    }
-                    goto basic_json_parser_5;
-basic_json_parser_26:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::begin_object;
-                        break;
-                    }
-basic_json_parser_28:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::end_object;
-                        break;
-                    }
-basic_json_parser_30:
-                    yyaccept = 0;
-                    yych = *(m_marker = ++m_cursor);
-                    if (yych == 0xBB)
-                    {
-                        goto basic_json_parser_42;
-                    }
-                    goto basic_json_parser_5;
-basic_json_parser_31:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-basic_json_parser_32:
-                    if (yybm[0 + yych] & 128)
-                    {
+                
+    {
+        lexer_char_t yych;
+        unsigned int yyaccept = 0;
+        static const unsigned char yybm[] = {
+            192, 192, 192, 192, 192, 192, 192, 192, 
+            192, 200, 136, 192, 192, 200, 192, 192, 
+            192, 192, 192, 192, 192, 192, 192, 192, 
+            192, 192, 192, 192, 192, 192, 192, 192, 
+            216, 208, 192, 208, 208, 208, 208, 208, 
+            208, 208,  80, 208, 208, 208, 208, 208, 
+            240, 240, 240, 240, 240, 240, 240, 240, 
+            240, 240, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 192, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+            208, 208, 208, 208, 208, 208, 208, 208, 
+        };
+        if ((m_limit - m_cursor) < 5) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= '9') {
+            if (yych <= ' ') {
+                if (yych <= '\n') {
+                    if (yych <= 0x00) goto basic_json_parser_29;
+                    if (yych <= 0x08) goto basic_json_parser_31;
+                    if (yych >= '\n') goto basic_json_parser_4;
+                } else {
+                    if (yych == '\r') goto basic_json_parser_2;
+                    if (yych <= 0x1F) goto basic_json_parser_31;
+                }
+            } else {
+                if (yych <= ',') {
+                    if (yych == '"') goto basic_json_parser_28;
+                    if (yych <= '+') goto basic_json_parser_31;
+                    goto basic_json_parser_17;
+                } else {
+                    if (yych <= '.') {
+                        if (yych <= '-') goto basic_json_parser_24;
                         goto basic_json_parser_31;
-                    }
-                    if (yych <= 0x1F)
-                    {
-                        goto basic_json_parser_33;
-                    }
-                    if (yych <= '"')
-                    {
-                        goto basic_json_parser_34;
-                    }
-                    goto basic_json_parser_36;
-basic_json_parser_33:
-                    m_cursor = m_marker;
-                    if (yyaccept == 0)
-                    {
-                        goto basic_json_parser_5;
-                    }
-                    else
-                    {
-                        goto basic_json_parser_14;
-                    }
-basic_json_parser_34:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::value_string;
-                        break;
-                    }
-basic_json_parser_36:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= 'e')
-                    {
-                        if (yych <= '/')
-                        {
-                            if (yych == '"')
-                            {
-                                goto basic_json_parser_31;
-                            }
-                            if (yych <= '.')
-                            {
-                                goto basic_json_parser_33;
-                            }
-                            goto basic_json_parser_31;
-                        }
-                        else
-                        {
-                            if (yych <= '\\')
-                            {
-                                if (yych <= '[')
-                                {
-                                    goto basic_json_parser_33;
-                                }
-                                goto basic_json_parser_31;
-                            }
-                            else
-                            {
-                                if (yych == 'b')
-                                {
-                                    goto basic_json_parser_31;
-                                }
-                                goto basic_json_parser_33;
-                            }
-                        }
-                    }
-                    else
-                    {
-                        if (yych <= 'q')
-                        {
-                            if (yych <= 'f')
-                            {
-                                goto basic_json_parser_31;
-                            }
-                            if (yych == 'n')
-                            {
-                                goto basic_json_parser_31;
-                            }
-                            goto basic_json_parser_33;
-                        }
-                        else
-                        {
-                            if (yych <= 's')
-                            {
-                                if (yych <= 'r')
-                                {
-                                    goto basic_json_parser_31;
-                                }
-                                goto basic_json_parser_33;
-                            }
-                            else
-                            {
-                                if (yych <= 't')
-                                {
-                                    goto basic_json_parser_31;
-                                }
-                                if (yych <= 'u')
-                                {
-                                    goto basic_json_parser_43;
-                                }
-                                goto basic_json_parser_33;
-                            }
-                        }
-                    }
-basic_json_parser_37:
-                    yych = *++m_cursor;
-                    if (yych <= '/')
-                    {
-                        goto basic_json_parser_33;
-                    }
-                    if (yych <= '9')
-                    {
-                        goto basic_json_parser_44;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_38:
-                    yych = *++m_cursor;
-                    if (yych <= ',')
-                    {
-                        if (yych == '+')
-                        {
-                            goto basic_json_parser_46;
-                        }
-                        goto basic_json_parser_33;
-                    }
-                    else
-                    {
-                        if (yych <= '-')
-                        {
-                            goto basic_json_parser_46;
-                        }
-                        if (yych <= '/')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= '9')
-                        {
-                            goto basic_json_parser_47;
-                        }
-                        goto basic_json_parser_33;
-                    }
-basic_json_parser_39:
-                    yych = *++m_cursor;
-                    if (yych == 'l')
-                    {
-                        goto basic_json_parser_49;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_40:
-                    yych = *++m_cursor;
-                    if (yych == 'l')
-                    {
-                        goto basic_json_parser_50;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_41:
-                    yych = *++m_cursor;
-                    if (yych == 'u')
-                    {
-                        goto basic_json_parser_51;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_42:
-                    yych = *++m_cursor;
-                    if (yych == 0xBF)
-                    {
-                        goto basic_json_parser_52;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_43:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= '@')
-                    {
-                        if (yych <= '/')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= '9')
-                        {
-                            goto basic_json_parser_54;
-                        }
-                        goto basic_json_parser_33;
-                    }
-                    else
-                    {
-                        if (yych <= 'F')
-                        {
-                            goto basic_json_parser_54;
-                        }
-                        if (yych <= '`')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= 'f')
-                        {
-                            goto basic_json_parser_54;
-                        }
-                        goto basic_json_parser_33;
-                    }
-basic_json_parser_44:
-                    yyaccept = 1;
-                    m_marker = ++m_cursor;
-                    if ((m_limit - m_cursor) < 3)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= 'D')
-                    {
-                        if (yych <= '/')
-                        {
-                            goto basic_json_parser_14;
-                        }
-                        if (yych <= '9')
-                        {
-                            goto basic_json_parser_44;
-                        }
-                        goto basic_json_parser_14;
-                    }
-                    else
-                    {
-                        if (yych <= 'E')
-                        {
-                            goto basic_json_parser_38;
-                        }
-                        if (yych == 'e')
-                        {
-                            goto basic_json_parser_38;
-                        }
-                        goto basic_json_parser_14;
-                    }
-basic_json_parser_46:
-                    yych = *++m_cursor;
-                    if (yych <= '/')
-                    {
-                        goto basic_json_parser_33;
-                    }
-                    if (yych >= ':')
-                    {
-                        goto basic_json_parser_33;
-                    }
-basic_json_parser_47:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= '/')
-                    {
-                        goto basic_json_parser_14;
-                    }
-                    if (yych <= '9')
-                    {
-                        goto basic_json_parser_47;
-                    }
-                    goto basic_json_parser_14;
-basic_json_parser_49:
-                    yych = *++m_cursor;
-                    if (yych == 's')
-                    {
-                        goto basic_json_parser_55;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_50:
-                    yych = *++m_cursor;
-                    if (yych == 'l')
-                    {
-                        goto basic_json_parser_56;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_51:
-                    yych = *++m_cursor;
-                    if (yych == 'e')
-                    {
-                        goto basic_json_parser_58;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_52:
-                    ++m_cursor;
-                    {
-                        continue;
-                    }
-basic_json_parser_54:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= '@')
-                    {
-                        if (yych <= '/')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= '9')
-                        {
-                            goto basic_json_parser_60;
-                        }
-                        goto basic_json_parser_33;
-                    }
-                    else
-                    {
-                        if (yych <= 'F')
-                        {
-                            goto basic_json_parser_60;
-                        }
-                        if (yych <= '`')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= 'f')
-                        {
-                            goto basic_json_parser_60;
-                        }
-                        goto basic_json_parser_33;
-                    }
-basic_json_parser_55:
-                    yych = *++m_cursor;
-                    if (yych == 'e')
-                    {
-                        goto basic_json_parser_61;
-                    }
-                    goto basic_json_parser_33;
-basic_json_parser_56:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::literal_null;
-                        break;
-                    }
-basic_json_parser_58:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::literal_true;
-                        break;
-                    }
-basic_json_parser_60:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= '@')
-                    {
-                        if (yych <= '/')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= '9')
-                        {
-                            goto basic_json_parser_63;
-                        }
-                        goto basic_json_parser_33;
-                    }
-                    else
-                    {
-                        if (yych <= 'F')
-                        {
-                            goto basic_json_parser_63;
-                        }
-                        if (yych <= '`')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= 'f')
-                        {
-                            goto basic_json_parser_63;
-                        }
-                        goto basic_json_parser_33;
-                    }
-basic_json_parser_61:
-                    ++m_cursor;
-                    {
-                        last_token_type = token_type::literal_false;
-                        break;
-                    }
-basic_json_parser_63:
-                    ++m_cursor;
-                    if (m_limit <= m_cursor)
-                    {
-                        yyfill();    // LCOV_EXCL_LINE;
-                    }
-                    yych = *m_cursor;
-                    if (yych <= '@')
-                    {
-                        if (yych <= '/')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= '9')
-                        {
-                            goto basic_json_parser_31;
-                        }
-                        goto basic_json_parser_33;
-                    }
-                    else
-                    {
-                        if (yych <= 'F')
-                        {
-                            goto basic_json_parser_31;
-                        }
-                        if (yych <= '`')
-                        {
-                            goto basic_json_parser_33;
-                        }
-                        if (yych <= 'f')
-                        {
-                            goto basic_json_parser_31;
-                        }
-                        goto basic_json_parser_33;
+                    } else {
+                        if (yych <= '/') goto basic_json_parser_6;
+                        if (yych <= '0') goto basic_json_parser_25;
+                        goto basic_json_parser_27;
                     }
                 }
+            }
+        } else {
+            if (yych <= 'n') {
+                if (yych <= '\\') {
+                    if (yych <= ':') goto basic_json_parser_19;
+                    if (yych == '[') goto basic_json_parser_9;
+                    goto basic_json_parser_31;
+                } else {
+                    if (yych <= 'e') {
+                        if (yych <= ']') goto basic_json_parser_11;
+                        goto basic_json_parser_31;
+                    } else {
+                        if (yych <= 'f') goto basic_json_parser_23;
+                        if (yych <= 'm') goto basic_json_parser_31;
+                        goto basic_json_parser_21;
+                    }
+                }
+            } else {
+                if (yych <= '{') {
+                    if (yych == 't') goto basic_json_parser_22;
+                    if (yych <= 'z') goto basic_json_parser_31;
+                    goto basic_json_parser_13;
+                } else {
+                    if (yych <= '}') {
+                        if (yych <= '|') goto basic_json_parser_31;
+                        goto basic_json_parser_15;
+                    } else {
+                        if (yych == 0xEF) goto basic_json_parser_8;
+                        goto basic_json_parser_31;
+                    }
+                }
+            }
+        }
+basic_json_parser_2:
+        ++m_cursor;
+        yych = *m_cursor;
+        goto basic_json_parser_5;
+basic_json_parser_3:
+        { continue; }
+basic_json_parser_4:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+basic_json_parser_5:
+        if (yybm[0+yych] & 8) {
+            goto basic_json_parser_4;
+        }
+        goto basic_json_parser_3;
+basic_json_parser_6:
+        yyaccept = 0;
+        yych = *(m_marker = ++m_cursor);
+        if (yych == '*') goto basic_json_parser_70;
+        if (yych == '/') goto basic_json_parser_68;
+basic_json_parser_7:
+        { last_token_type = token_type::parse_error; break; }
+basic_json_parser_8:
+        yyaccept = 0;
+        yych = *(m_marker = ++m_cursor);
+        if (yych == 0xBB) goto basic_json_parser_65;
+        goto basic_json_parser_7;
+basic_json_parser_9:
+        ++m_cursor;
+        { last_token_type = token_type::begin_array; break; }
+basic_json_parser_11:
+        ++m_cursor;
+        { last_token_type = token_type::end_array; break; }
+basic_json_parser_13:
+        ++m_cursor;
+        { last_token_type = token_type::begin_object; break; }
+basic_json_parser_15:
+        ++m_cursor;
+        { last_token_type = token_type::end_object; break; }
+basic_json_parser_17:
+        ++m_cursor;
+        { last_token_type = token_type::value_separator; break; }
+basic_json_parser_19:
+        ++m_cursor;
+        { last_token_type = token_type::name_separator; break; }
+basic_json_parser_21:
+        yyaccept = 0;
+        yych = *(m_marker = ++m_cursor);
+        if (yych == 'u') goto basic_json_parser_61;
+        goto basic_json_parser_7;
+basic_json_parser_22:
+        yyaccept = 0;
+        yych = *(m_marker = ++m_cursor);
+        if (yych == 'r') goto basic_json_parser_57;
+        goto basic_json_parser_7;
+basic_json_parser_23:
+        yyaccept = 0;
+        yych = *(m_marker = ++m_cursor);
+        if (yych == 'a') goto basic_json_parser_52;
+        goto basic_json_parser_7;
+basic_json_parser_24:
+        yych = *++m_cursor;
+        if (yych <= '/') goto basic_json_parser_7;
+        if (yych <= '0') goto basic_json_parser_51;
+        if (yych <= '9') goto basic_json_parser_42;
+        goto basic_json_parser_7;
+basic_json_parser_25:
+        yyaccept = 1;
+        yych = *(m_marker = ++m_cursor);
+        if (yych <= 'D') {
+            if (yych == '.') goto basic_json_parser_44;
+        } else {
+            if (yych <= 'E') goto basic_json_parser_45;
+            if (yych == 'e') goto basic_json_parser_45;
+        }
+basic_json_parser_26:
+        { last_token_type = token_type::value_number; break; }
+basic_json_parser_27:
+        yyaccept = 1;
+        yych = *(m_marker = ++m_cursor);
+        goto basic_json_parser_43;
+basic_json_parser_28:
+        yyaccept = 0;
+        yych = *(m_marker = ++m_cursor);
+        if (yych <= 0x1F) goto basic_json_parser_7;
+        goto basic_json_parser_33;
+basic_json_parser_29:
+        ++m_cursor;
+        { last_token_type = token_type::end_of_input; break; }
+basic_json_parser_31:
+        yych = *++m_cursor;
+        goto basic_json_parser_7;
+basic_json_parser_32:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+basic_json_parser_33:
+        if (yybm[0+yych] & 16) {
+            goto basic_json_parser_32;
+        }
+        if (yych <= 0x1F) goto basic_json_parser_34;
+        if (yych <= '"') goto basic_json_parser_36;
+        goto basic_json_parser_35;
+basic_json_parser_34:
+        m_cursor = m_marker;
+        if (yyaccept == 0) {
+            goto basic_json_parser_7;
+        } else {
+            goto basic_json_parser_26;
+        }
+basic_json_parser_35:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= 'e') {
+            if (yych <= '/') {
+                if (yych == '"') goto basic_json_parser_32;
+                if (yych <= '.') goto basic_json_parser_34;
+                goto basic_json_parser_32;
+            } else {
+                if (yych <= '\\') {
+                    if (yych <= '[') goto basic_json_parser_34;
+                    goto basic_json_parser_32;
+                } else {
+                    if (yych == 'b') goto basic_json_parser_32;
+                    goto basic_json_parser_34;
+                }
+            }
+        } else {
+            if (yych <= 'q') {
+                if (yych <= 'f') goto basic_json_parser_32;
+                if (yych == 'n') goto basic_json_parser_32;
+                goto basic_json_parser_34;
+            } else {
+                if (yych <= 's') {
+                    if (yych <= 'r') goto basic_json_parser_32;
+                    goto basic_json_parser_34;
+                } else {
+                    if (yych <= 't') goto basic_json_parser_32;
+                    if (yych <= 'u') goto basic_json_parser_38;
+                    goto basic_json_parser_34;
+                }
+            }
+        }
+basic_json_parser_36:
+        ++m_cursor;
+        { last_token_type = token_type::value_string; break; }
+basic_json_parser_38:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= '@') {
+            if (yych <= '/') goto basic_json_parser_34;
+            if (yych >= ':') goto basic_json_parser_34;
+        } else {
+            if (yych <= 'F') goto basic_json_parser_39;
+            if (yych <= '`') goto basic_json_parser_34;
+            if (yych >= 'g') goto basic_json_parser_34;
+        }
+basic_json_parser_39:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= '@') {
+            if (yych <= '/') goto basic_json_parser_34;
+            if (yych >= ':') goto basic_json_parser_34;
+        } else {
+            if (yych <= 'F') goto basic_json_parser_40;
+            if (yych <= '`') goto basic_json_parser_34;
+            if (yych >= 'g') goto basic_json_parser_34;
+        }
+basic_json_parser_40:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= '@') {
+            if (yych <= '/') goto basic_json_parser_34;
+            if (yych >= ':') goto basic_json_parser_34;
+        } else {
+            if (yych <= 'F') goto basic_json_parser_41;
+            if (yych <= '`') goto basic_json_parser_34;
+            if (yych >= 'g') goto basic_json_parser_34;
+        }
+basic_json_parser_41:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= '@') {
+            if (yych <= '/') goto basic_json_parser_34;
+            if (yych <= '9') goto basic_json_parser_32;
+            goto basic_json_parser_34;
+        } else {
+            if (yych <= 'F') goto basic_json_parser_32;
+            if (yych <= '`') goto basic_json_parser_34;
+            if (yych <= 'f') goto basic_json_parser_32;
+            goto basic_json_parser_34;
+        }
+basic_json_parser_42:
+        yyaccept = 1;
+        m_marker = ++m_cursor;
+        if ((m_limit - m_cursor) < 3) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+basic_json_parser_43:
+        if (yybm[0+yych] & 32) {
+            goto basic_json_parser_42;
+        }
+        if (yych <= 'D') {
+            if (yych != '.') goto basic_json_parser_26;
+        } else {
+            if (yych <= 'E') goto basic_json_parser_45;
+            if (yych == 'e') goto basic_json_parser_45;
+            goto basic_json_parser_26;
+        }
+basic_json_parser_44:
+        yych = *++m_cursor;
+        if (yych <= '/') goto basic_json_parser_34;
+        if (yych <= '9') goto basic_json_parser_49;
+        goto basic_json_parser_34;
+basic_json_parser_45:
+        yych = *++m_cursor;
+        if (yych <= ',') {
+            if (yych != '+') goto basic_json_parser_34;
+        } else {
+            if (yych <= '-') goto basic_json_parser_46;
+            if (yych <= '/') goto basic_json_parser_34;
+            if (yych <= '9') goto basic_json_parser_47;
+            goto basic_json_parser_34;
+        }
+basic_json_parser_46:
+        yych = *++m_cursor;
+        if (yych <= '/') goto basic_json_parser_34;
+        if (yych >= ':') goto basic_json_parser_34;
+basic_json_parser_47:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= '/') goto basic_json_parser_26;
+        if (yych <= '9') goto basic_json_parser_47;
+        goto basic_json_parser_26;
+basic_json_parser_49:
+        yyaccept = 1;
+        m_marker = ++m_cursor;
+        if ((m_limit - m_cursor) < 3) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych <= 'D') {
+            if (yych <= '/') goto basic_json_parser_26;
+            if (yych <= '9') goto basic_json_parser_49;
+            goto basic_json_parser_26;
+        } else {
+            if (yych <= 'E') goto basic_json_parser_45;
+            if (yych == 'e') goto basic_json_parser_45;
+            goto basic_json_parser_26;
+        }
+basic_json_parser_51:
+        yyaccept = 1;
+        yych = *(m_marker = ++m_cursor);
+        if (yych <= 'D') {
+            if (yych == '.') goto basic_json_parser_44;
+            goto basic_json_parser_26;
+        } else {
+            if (yych <= 'E') goto basic_json_parser_45;
+            if (yych == 'e') goto basic_json_parser_45;
+            goto basic_json_parser_26;
+        }
+basic_json_parser_52:
+        yych = *++m_cursor;
+        if (yych != 'l') goto basic_json_parser_34;
+        yych = *++m_cursor;
+        if (yych != 's') goto basic_json_parser_34;
+        yych = *++m_cursor;
+        if (yych != 'e') goto basic_json_parser_34;
+        ++m_cursor;
+        { last_token_type = token_type::literal_false; break; }
+basic_json_parser_57:
+        yych = *++m_cursor;
+        if (yych != 'u') goto basic_json_parser_34;
+        yych = *++m_cursor;
+        if (yych != 'e') goto basic_json_parser_34;
+        ++m_cursor;
+        { last_token_type = token_type::literal_true; break; }
+basic_json_parser_61:
+        yych = *++m_cursor;
+        if (yych != 'l') goto basic_json_parser_34;
+        yych = *++m_cursor;
+        if (yych != 'l') goto basic_json_parser_34;
+        ++m_cursor;
+        { last_token_type = token_type::literal_null; break; }
+basic_json_parser_65:
+        yych = *++m_cursor;
+        if (yych != 0xBF) goto basic_json_parser_34;
+        ++m_cursor;
+        { continue; }
+basic_json_parser_68:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yybm[0+yych] & 64) {
+            goto basic_json_parser_68;
+        }
+        goto basic_json_parser_73;
+basic_json_parser_70:
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yybm[0+yych] & 128) {
+            goto basic_json_parser_70;
+        }
+        ++m_cursor;
+        if (m_limit <= m_cursor) yyfill(); // LCOV_EXCL_LINE;
+        yych = *m_cursor;
+        if (yych != '/') goto basic_json_parser_70;
+basic_json_parser_73:
+        ++m_cursor;
+        yych = *m_cursor;
+        goto basic_json_parser_3;
+    }
 
             }
 
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index ffa20f3..f5347d6 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -7703,9 +7703,13 @@
                     re2c:indent:string    = "    ";
                     re2c:indent:top       = 1;
                     re2c:labelprefix      = "basic_json_parser_";
+                    
+                    // ignore js comments as whitespace
+                    c_comment = "/*" ([^*] | ("*" [^/]))* "*""/";
+                    cxx_comment = "//" [^\n]* "\n";
 
                     // ignore whitespace
-                    ws = [ \t\n\r]+;
+                    ws = [ \t\n\r]+ | c_comment | cxx_comment;
                     ws   { continue; }
 
                     // ignore byte-order-mark
diff --git a/test/Makefile b/test/Makefile
index ead1f07..d4cdb74 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -14,6 +14,7 @@
           src/unit-class_iterator.cpp \
           src/unit-class_lexer.cpp \
           src/unit-class_parser.cpp \
+          src/unit-comments.cpp \
           src/unit-comparison.cpp \
           src/unit-concepts.cpp \
           src/unit-constructor1.cpp \
diff --git a/test/src/unit-comments.cpp b/test/src/unit-comments.cpp
new file mode 100644
index 0000000..990caf7
--- /dev/null
+++ b/test/src/unit-comments.cpp
@@ -0,0 +1,25 @@
+// Copyright 2016 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "catch.hpp"
+
+#define private public
+#include "json.hpp"
+
+using nlohmann::json;
+
+TEST_CASE("JS comments in JSON files")
+{
+    SECTION("single-line")
+    {
+      CHECK("{} // foo\n"_json == json({}));
+      CHECK("[1, 2, // 3, \n 4]"_json == json({1,2,4}));
+    }
+
+    SECTION("multi-line")
+    {
+      CHECK("{} /* foo */"_json == json({}));
+      CHECK("[1, 2, /* 3,  */ 4]"_json == json({1,2,4}));
+    }
+}