{
    "patterns": [
        {
            "regex": "#include (<.+?>)",
            "is": { "default": "keyword1", "captures": ["string"] }
        },
        { "regex": "#[a-zA-Z0-9_]+", "is": "keyword1" },
        { "regex": "\\/\\/.*", "is": "comment" },
        {
            "regex": "\\/\\*((?::|->).*?)\\s*\\*\\/",
            "flags": ["dotMatchesNewline"],
            "is": {
                "default": "hidden",
                "captures": ["type-hint"]
            }
        },
        {
            "regex": "\\/\\*.*?\\*\\/",
            "flags": ["dotMatchesNewline"],
            "is": "comment"
        },
        {
            "regex": "[a-zA-Z_][a-zA-Z0-9_]*(\\()",
            "is": { "default": "function", "captures": ["default"] }
        },
        {
            "regex": "(struct|enum|union)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
            "is": {
                "default": "default",
                "captures": ["identifier", "keyword2"]
            }
        },
        { "regex": "(u8|u|U|L)'(\\\\'|[^'])'", "is": "string" },
        { "regex": "(u8|u|U|L)\"(\\\\\"|[^\"])*\"", "is": "string" },
        { "regex": "[a-zA-Z_][a-zA-Z0-9_]*", "is": "identifier" },
        { "regex": "0[bB][01']+[uUlLfFlLdDwWbB]*", "is": "literal" },
        {
            "regex": "0[xX][0-9a-fA-F']+(\\.[0-9a-fA-F']*([pP][-+]?[0-9a-fA-F']+)?)?+[uUlLwWbB]*",
            "is": "literal"
        },
        {
            "regex": "[0-9']+(\\.[0-9']*([eE][-+]?[0-9']+)?)?[uUlLfFlLdDwWbB]*",
            "is": "literal"
        },
        { "regex": "[+=/*^%<>!~|&\\.?:#-]+", "is": "operator" },
        { "regex": "[,;]", "is": "punct" }
    ],
    "keywords": {
        "alignas": { "into": "keyword1" },
        "alignof": { "into": "keyword1" },
        "auto": { "into": "keyword1" },
        "break": { "into": "keyword1" },
        "case": { "into": "keyword1" },
        "const": { "into": "keyword1" },
        "constexpr": { "into": "keyword1" },
        "continue": { "into": "keyword1" },
        "default": { "into": "keyword1" },
        "do": { "into": "keyword1" },
        "else": { "into": "keyword1" },
        "extern": { "into": "keyword1" },
        "for": { "into": "keyword1" },
        "goto": { "into": "keyword1" },
        "if": { "into": "keyword1" },
        "inline": { "into": "keyword1" },
        "register": { "into": "keyword1" },
        "restrict": { "into": "keyword1" },
        "return": { "into": "keyword1" },
        "sizeof": { "into": "keyword1" },
        "static": { "into": "keyword1" },
        "static_assert": { "into": "keyword1" },
        "switch": { "into": "keyword1" },
        "thread_local": { "into": "keyword1" },
        "typedef": { "into": "keyword1" },
        "typeof": { "into": "keyword1" },
        "typeof_unqual": { "into": "keyword1" },
        "volatile": { "into": "keyword1" },
        "while": { "into": "keyword1" },
        "_Generic": { "into": "keyword1" },
        "_Noreturn": { "into": "keyword1" },

        "bool": { "into": "keyword2" },
        "char": { "into": "keyword2" },
        "double": { "into": "keyword2" },
        "enum": { "into": "keyword2" },
        "float": { "into": "keyword2" },
        "int": { "into": "keyword2" },
        "long": { "into": "keyword2" },
        "short": { "into": "keyword2" },
        "signed": { "into": "keyword2" },
        "struct": { "into": "keyword2" },
        "unsigned": { "into": "keyword2" },
        "union": { "into": "keyword2" },
        "void": { "into": "keyword2" },
        "_Atomic": { "into": "keyword2" },
        "_BitInt": { "into": "keyword2" },
        "_Complex": { "into": "keyword2" },
        "_Decimal128": { "into": "keyword2" },
        "_Decimal32": { "into": "keyword2" },
        "_Decimal64": { "into": "keyword2" },
        "_Imaginary": { "into": "keyword2" },

        "nullptr": { "into": "literal" },
        "false": { "into": "literal" },
        "true": { "into": "literal" }
    }
}