{
  "displayName": "C3",
  "fileTypes": [
    "c3",
    "c3i",
    "c3t"
  ],
  "name": "c3",
  "patterns": [
    {
      "include": "#top_level"
    },
    {
      "include": "#statements"
    }
  ],
  "repository": {
    "assign_right_expression": {
      "begin": "=",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.assignment.c3"
        }
      },
      "end": "(?=;)",
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "attribute": {
      "patterns": [
        {
          "begin": "@(?:(?:align|allow_deprecated|benchmark|bigendian|builtin|callconv|cname|compact|const|deprecated|dynamic|export|extern|finalizer|format|if|inline|init|jump|link|littleendian|local|maydiscard|naked|noalias|nodiscard|noinit|noinline|nopadding|norecurse|noreturn|nosanitize|nostrip|obfuscate|operator|operator_r|operator_s|optional|overlap|packed|private|public|pure|reflect|safeinfer|safemacro|simd|section|structlike|tag|test|unused|used|wasm|weak|winmain)|\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*)\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.annotation.c3"
            }
          },
          "end": "(?=[^\\t (])|(?<=\\))",
          "name": "meta.annotation.c3",
          "patterns": [
            {
              "include": "#parens"
            }
          ]
        }
      ]
    },
    "block": {
      "patterns": [
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.block.begin.c3"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.block.end.c3"
            }
          },
          "name": "meta.block.c3",
          "patterns": [
            {
              "include": "#statements"
            }
          ]
        }
      ]
    },
    "block_comment": {
      "begin": "/\\*",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.comment.begin.c3"
        }
      },
      "end": "\\*/",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.comment.end.c3"
        }
      },
      "name": "comment.block.c3",
      "patterns": [
        {
          "include": "#block_comment_body"
        }
      ]
    },
    "block_comment_body": {
      "patterns": [
        {
          "begin": "/\\*",
          "end": "\\*/",
          "patterns": [
            {
              "include": "#block_comment_body"
            }
          ]
        }
      ]
    },
    "brackets": {
      "patterns": [
        {
          "begin": "\\[<?",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.brackets.begin.c3"
            }
          },
          "end": ">?]",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.brackets.end.c3"
            }
          },
          "name": "meta.brackets.c3",
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        }
      ]
    },
    "builtin": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "constant.language.c3"
            },
            "2": {
              "name": "entity.name.function.builtin.c3"
            }
          },
          "match": "(?:(\\$\\$\\b_*[A-Z][0-9A-Z_]*)|(\\$\\$\\b_*[a-z][0-9A-Z_a-z]*))\\b"
        }
      ]
    },
    "bytes_literal": {
      "patterns": [
        {
          "begin": "(x)([\"'`])",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.c3"
            },
            "2": {
              "name": "punctuation.definition.string.begin.c3"
            }
          },
          "end": "\\2",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.c3"
            }
          },
          "name": "string.quoted.other.c3",
          "patterns": [
            {
              "match": "[f\\s\\h]+",
              "name": "constant.numeric.integer.c3"
            }
          ]
        },
        {
          "begin": "(b64)([\"'`])",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.c3"
            },
            "2": {
              "name": "punctuation.definition.string.begin.c3"
            }
          },
          "end": "\\2",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.c3"
            }
          },
          "name": "string.quoted.other.c3",
          "patterns": [
            {
              "match": "[+/-9=A-Za-z\\s]+",
              "name": "constant.numeric.integer.c3"
            }
          ]
        }
      ]
    },
    "char_literal": {
      "begin": "'",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.c3"
        }
      },
      "end": "'",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.c3"
        }
      },
      "name": "string.quoted.single.c3",
      "patterns": [
        {
          "include": "#escape_sequence"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "include": "#line_comment"
        },
        {
          "include": "#block_comment"
        },
        {
          "include": "#doc_comment"
        }
      ]
    },
    "constants": {
      "patterns": [
        {
          "match": "\\b(true|false|null)\\b",
          "name": "constant.language.c3"
        },
        {
          "begin": "\\b_*[A-Z][0-9A-Z_]*\\b",
          "beginCaptures": {
            "0": {
              "name": "variable.other.constant.c3"
            }
          },
          "end": "(?=[^\\t {])|(?<=})",
          "patterns": [
            {
              "include": "#generic_args"
            }
          ]
        }
      ]
    },
    "contract_expression": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#function"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#builtin"
        },
        {
          "include": "#real_literal"
        },
        {
          "include": "#integer_literal"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#type"
        },
        {
          "include": "#path"
        },
        {
          "include": "#function_call"
        },
        {
          "include": "#variable"
        },
        {
          "include": "#parens"
        },
        {
          "include": "#brackets"
        },
        {
          "include": "#block"
        },
        {
          "include": "#punctuation"
        },
        {
          "include": "#leftover_at_ident"
        }
      ]
    },
    "control_statements": {
      "patterns": [
        {
          "begin": "\\$for\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.ct.c3"
            }
          },
          "end": ":",
          "endCaptures": {
            "0": {
              "name": "punctuation.separator.c3"
            }
          },
          "patterns": [
            {
              "include": "#statements"
            }
          ]
        },
        {
          "begin": "\\$foreach\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.ct.c3"
            }
          },
          "end": "(?<=:)",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "\\$\\b_*[a-z][0-9A-Z_a-z]*\\b",
              "name": "variable.other.c3"
            },
            {
              "match": ",",
              "name": "punctuation.separator.c3"
            },
            {
              "begin": ":",
              "beginCaptures": {
                "0": {
                  "name": "keyword.operator.c3"
                }
              },
              "end": ":",
              "endCaptures": {
                "0": {
                  "name": "punctuation.separator.c3"
                }
              },
              "patterns": [
                {
                  "include": "#expression"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\bfor\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.c3"
            }
          },
          "end": "(?<=\\))",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "begin": "\\(",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.section.group.begin.c3"
                }
              },
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.section.group.end.c3"
                }
              },
              "patterns": [
                {
                  "include": "#statements"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\$(?:switch|case|default|if)\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.ct.c3"
            }
          },
          "end": ":",
          "endCaptures": {
            "0": {
              "name": "punctuation.separator.c3"
            }
          },
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        },
        {
          "begin": "\\b(?:case|default)\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.c3"
            }
          },
          "end": ":",
          "endCaptures": {
            "0": {
              "name": "punctuation.separator.c3"
            }
          },
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        }
      ]
    },
    "doc_comment": {
      "begin": "(?=<\\*)",
      "end": "(\\*>)",
      "endCaptures": {
        "0": {
          "name": "comment.block.documentation.c3"
        },
        "1": {
          "name": "punctuation.definition.comment.end.c3"
        }
      },
      "patterns": [
        {
          "include": "#doc_comment_body"
        }
      ]
    },
    "doc_comment_body": {
      "patterns": [
        {
          "begin": "(<\\*)\\s*(?=@)",
          "beginCaptures": {
            "0": {
              "name": "comment.block.documentation.c3"
            },
            "1": {
              "name": "punctuation.definition.comment.begin.c3"
            }
          },
          "end": "(?=\\*>)",
          "patterns": [
            {
              "captures": {
                "0": {
                  "name": "comment.block.documentation.c3"
                },
                "1": {
                  "name": "variable.parameter.c3"
                },
                "2": {
                  "name": "support.type.c3"
                },
                "3": {
                  "name": "keyword.operator.variadic.c3"
                }
              },
              "match": "@param(?:\\s*\\[&?(?:in|out|inout)])?\\s*(?:([#$]?\\b_*[a-z][0-9A-Z_a-z]*)\\b|(\\$\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*)\\b|(\\.\\.\\.))"
            },
            {
              "begin": "@(?:require\\b|ensure\\b|return\\?)",
              "beginCaptures": {
                "0": {
                  "name": "comment.block.documentation.c3"
                }
              },
              "end": "(?=:|\\*>|$)",
              "patterns": [
                {
                  "include": "#contract_expression"
                }
              ]
            },
            {
              "match": "@\\b_*[a-z][0-9A-Z_a-z]*\\b",
              "name": "comment.block.documentation.c3"
            },
            {
              "match": ":",
              "name": "comment.block.documentation.c3"
            },
            {
              "match": "`[^`]*`|\"[^\"]*\"",
              "name": "comment.block.documentation.c3"
            }
          ]
        },
        {
          "begin": "(<\\*)",
          "beginCaptures": {
            "0": {
              "name": "comment.block.documentation.c3"
            },
            "1": {
              "name": "punctuation.definition.comment.begin.c3"
            }
          },
          "end": "(?=^\\s*@|\\*>)",
          "name": "comment.block.documentation.c3"
        },
        {
          "begin": "",
          "end": "(?=\\*>)",
          "patterns": [
            {
              "captures": {
                "0": {
                  "name": "comment.block.documentation.c3"
                },
                "1": {
                  "name": "variable.parameter.c3"
                },
                "2": {
                  "name": "support.type.c3"
                },
                "3": {
                  "name": "keyword.operator.variadic.c3"
                }
              },
              "match": "^\\s*@param(?:\\s*\\[&?(?:in|out|inout)])?\\s*(?:([#$]?\\b_*[a-z][0-9A-Z_a-z]*)\\b|(\\$\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*)\\b|(\\.\\.\\.))"
            },
            {
              "begin": "^\\s*@(?:require\\b|ensure\\b|return\\?)",
              "beginCaptures": {
                "0": {
                  "name": "comment.block.documentation.c3"
                }
              },
              "end": "(?=:|\\*>|$)",
              "patterns": [
                {
                  "include": "#contract_expression"
                }
              ]
            },
            {
              "match": "^\\s*@\\b_*[a-z][0-9A-Z_a-z]*\\b",
              "name": "comment.block.documentation.c3"
            },
            {
              "match": ":",
              "name": "comment.block.documentation.c3"
            },
            {
              "match": "`[^`]*`|\"[^\"]*\"",
              "name": "comment.block.documentation.c3"
            }
          ]
        }
      ]
    },
    "escape_sequence": {
      "match": "\\\\([\"'0\\\\abefnrtv]|x\\h{2}|u\\h{4}|U\\h{8})",
      "name": "constant.character.escape.c3"
    },
    "expression": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#function"
        },
        {
          "include": "#constants"
        },
        {
          "include": "#builtin"
        },
        {
          "include": "#literals"
        },
        {
          "include": "#operators"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#type"
        },
        {
          "include": "#path"
        },
        {
          "include": "#function_call"
        },
        {
          "include": "#variable"
        },
        {
          "include": "#parens"
        },
        {
          "include": "#brackets"
        },
        {
          "include": "#block"
        },
        {
          "include": "#punctuation"
        },
        {
          "include": "#leftover_at_ident"
        }
      ]
    },
    "function": {
      "begin": "(?=\\b(fn|macro)\\b)",
      "end": "(?=[;={])",
      "patterns": [
        {
          "begin": "\\b(fn|macro)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.declaration.function.c3"
            }
          },
          "end": "(?=\\()",
          "name": "meta.function.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#function_header"
            }
          ]
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.group.begin.c3"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.group.end.c3"
            }
          },
          "name": "meta.function.parameters.c3",
          "patterns": [
            {
              "include": "#parameters"
            }
          ]
        },
        {
          "begin": "(?<=\\))",
          "contentName": "meta.function.c3",
          "end": "(?=[;={])",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#generic_params"
            },
            {
              "include": "#attribute"
            }
          ]
        }
      ]
    },
    "function_call": {
      "begin": "([#@]?\\b_*[a-z][0-9A-Z_a-z]*)\\b(?=\\s*(\\{.*})?\\s*\\()",
      "beginCaptures": {
        "1": {
          "name": "entity.name.function.c3"
        }
      },
      "end": "(?<=\\))",
      "name": "meta.function_call.c3",
      "patterns": [
        {
          "include": "#generic_args"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.group.begin.c3"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.group.end.c3"
            }
          },
          "name": "meta.group.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "begin": "([#$]?\\b_*[a-z][0-9A-Z_a-z]*|\\$\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*)\\b\\s*(:)(?!:)",
              "beginCaptures": {
                "1": {
                  "name": "variable.parameter.c3"
                },
                "2": {
                  "name": "punctuation.separator.c3"
                }
              },
              "end": "(?=\\))|([,;])",
              "endCaptures": {
                "1": {
                  "name": "punctuation.separator.c3"
                }
              },
              "patterns": [
                {
                  "include": "#expression"
                }
              ]
            },
            {
              "begin": "(?=\\S)",
              "end": "(?=\\))|([,;])",
              "endCaptures": {
                "1": {
                  "name": "punctuation.separator.c3"
                }
              },
              "patterns": [
                {
                  "include": "#expression"
                }
              ]
            },
            {
              "match": ";",
              "name": "punctuation.separator.c3"
            }
          ]
        }
      ]
    },
    "function_header": {
      "patterns": [
        {
          "include": "#type"
        },
        {
          "match": "\\.",
          "name": "punctuation.accessor.c3"
        },
        {
          "match": "@?\\b_*[a-z][0-9A-Z_a-z]*\\b",
          "name": "entity.name.function.c3"
        }
      ]
    },
    "generic_args": {
      "patterns": [
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.generic.begin.c3"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.generic.end.c3"
            }
          },
          "name": "meta.generic.c3",
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        }
      ]
    },
    "generic_params": {
      "patterns": [
        {
          "begin": "<",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.generic.begin.c3"
            }
          },
          "end": ">",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.generic.end.c3"
            }
          },
          "name": "meta.generic.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
              "name": "support.type.c3"
            },
            {
              "match": "\\b_*[A-Z][0-9A-Z_]*\\b",
              "name": "variable.other.constant.c3"
            },
            {
              "match": ",",
              "name": "punctuation.separator.c3"
            }
          ]
        }
      ]
    },
    "integer_literal": {
      "match": "\\b(?:0[Xx]\\h(?:_?\\h)*|0[Oo][0-7](_?[0-7])*|0[Bb][01](_?[01])*|[0-9](?:_?[0-9])*)(?:[IUiu](?:8|16|32|64|128)|[Uu][Ll]{0,2}|[Ll]{1,2})?",
      "name": "constant.numeric.integer.c3"
    },
    "keywords": {
      "patterns": [
        {
          "match": "\\$(?:alignof|assert|assignable|default|defined|echo|embed|eval|error|exec|extnameof|feature|include|is_const|kindof|nameof|offsetof|qnameof|sizeof|stringify|vacount|vaconst|vaarg|vaexpr|vasplat)\\b",
          "name": "keyword.other.ct.c3"
        },
        {
          "match": "\\$(?:case|else|endfor|endforeach|endif|endswitch|for|foreach|if|switch)\\b",
          "name": "keyword.control.ct.c3"
        },
        {
          "match": "\\b(?:assert|asm|catch|inline|import|module|interface|try|var)\\b",
          "name": "keyword.other.c3"
        },
        {
          "match": "\\b(?:break|case|continue|default|defer|do|else|for|foreach|foreach_r|if|nextcase|return|switch|while)\\b",
          "name": "keyword.control.c3"
        }
      ]
    },
    "leftover_at_ident": {
      "patterns": [
        {
          "captures": {
            "0": {
              "name": "keyword.annotation.c3"
            }
          },
          "match": "@(?:pure|inline|noinline)",
          "name": "meta.annotation.c3"
        },
        {
          "begin": "@\\b_*[a-z][0-9A-Z_a-z]*\\b",
          "beginCaptures": {
            "0": {
              "name": "entity.name.function.c3"
            }
          },
          "end": "(?=[^\\t {])|(?<=})",
          "patterns": [
            {
              "include": "#generic_args"
            }
          ]
        }
      ]
    },
    "line_comment": {
      "match": "//.*$",
      "name": "comment.line.double-slash.c3"
    },
    "literals": {
      "patterns": [
        {
          "include": "#string_literal"
        },
        {
          "include": "#char_literal"
        },
        {
          "include": "#raw_string_literal"
        },
        {
          "include": "#real_literal"
        },
        {
          "include": "#integer_literal"
        },
        {
          "include": "#bytes_literal"
        }
      ]
    },
    "modifier_keywords": {
      "patterns": [
        {
          "match": "\\b(?:const|extern|static|tlocal|inline)\\b",
          "name": "storage.modifier.c3"
        }
      ]
    },
    "module_path": {
      "patterns": [
        {
          "include": "#path"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.scope-resolution.c3"
            }
          },
          "match": "\\b(_*[a-z][0-9A-Z_a-z]*)\\b",
          "name": "meta.path.c3"
        }
      ]
    },
    "operators": {
      "patterns": [
        {
          "match": "=>",
          "name": "keyword.declaration.function.arrow.c3"
        },
        {
          "match": "(?:[-%\\&*+/^|]|>>|<<|\\+\\+\\+)=",
          "name": "keyword.operator.assignment.augmented.c3"
        },
        {
          "match": "<=|>=|==|[<>]|!=",
          "name": "keyword.operator.comparison.c3"
        },
        {
          "match": "\\.\\.\\.",
          "name": "keyword.operator.variadic.c3"
        },
        {
          "match": "\\.\\.",
          "name": "keyword.operator.range.c3"
        },
        {
          "match": "\\+\\+\\+?|--",
          "name": "keyword.operator.arithmetic.c3"
        },
        {
          "match": "<<|>>|&&&?|\\|\\|\\|?",
          "name": "keyword.operator.arithmetic.c3"
        },
        {
          "match": "[-%+/^|~]",
          "name": "keyword.operator.arithmetic.c3"
        },
        {
          "match": "=",
          "name": "keyword.operator.assignment.c3"
        },
        {
          "match": "\\?\\?\\??|\\?:|[!\\&*:?]",
          "name": "keyword.operator.c3"
        }
      ]
    },
    "parameters": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "begin": "\\$\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
          "beginCaptures": {
            "0": {
              "name": "support.type.c3"
            }
          },
          "end": "(?=[),;])",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#attribute"
            },
            {
              "begin": "=",
              "beginCaptures": {
                "0": {
                  "name": "keyword.operator.assignment.c3"
                }
              },
              "end": "(?=[),;])",
              "patterns": [
                {
                  "include": "#expression"
                }
              ]
            }
          ]
        },
        {
          "include": "#type"
        },
        {
          "include": "#punctuation"
        },
        {
          "match": "\\.\\.\\.",
          "name": "keyword.operator.variadic.c3"
        },
        {
          "match": "&",
          "name": "keyword.operator.address.c3"
        },
        {
          "begin": ";",
          "beginCaptures": {
            "0": {
              "name": "punctuation.separator.c3"
            }
          },
          "end": "(?=\\))",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "@\\b_*[a-z][0-9A-Z_a-z]*\\b",
              "name": "entity.name.function.c3"
            },
            {
              "include": "#parameters"
            }
          ]
        },
        {
          "begin": "[#$]?\\b_*[a-z][0-9A-Z_a-z]*\\b",
          "beginCaptures": {
            "0": {
              "name": "variable.parameter.c3"
            }
          },
          "end": "(?=[),;])",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#attribute"
            },
            {
              "match": "\\.\\.\\.",
              "name": "keyword.operator.variadic.c3"
            },
            {
              "begin": "=",
              "beginCaptures": {
                "0": {
                  "name": "keyword.operator.assignment.c3"
                }
              },
              "end": "(?=[),;])",
              "patterns": [
                {
                  "include": "#expression"
                }
              ]
            }
          ]
        }
      ]
    },
    "parens": {
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.group.begin.c3"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.group.end.c3"
            }
          },
          "name": "meta.group.c3",
          "patterns": [
            {
              "include": "#expression"
            }
          ]
        }
      ]
    },
    "path": {
      "captures": {
        "1": {
          "name": "entity.name.scope-resolution.c3"
        },
        "2": {
          "name": "punctuation.separator.scope-resolution.c3"
        }
      },
      "match": "\\b(_*[a-z][0-9A-Z_a-z]*)\\b\\s*(::)",
      "name": "meta.path.c3"
    },
    "punctuation": {
      "patterns": [
        {
          "match": ",",
          "name": "punctuation.separator.c3"
        },
        {
          "match": ":",
          "name": "punctuation.separator.c3"
        },
        {
          "match": "\\.(?!\\.\\.)",
          "name": "punctuation.accessor.c3"
        }
      ]
    },
    "raw_string_literal": {
      "begin": "`",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.c3"
        }
      },
      "end": "`(?!`)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.c3"
        }
      },
      "name": "string.quoted.other.c3",
      "patterns": [
        {
          "match": "``",
          "name": "constant.character.escape.c3"
        }
      ]
    },
    "real_literal": {
      "patterns": [
        {
          "match": "\\b[0-9](?:_?[0-9])*(?:[Ff](?:16|32|64|128)?|[Dd])",
          "name": "constant.numeric.float.c3"
        },
        {
          "match": "\\b(?:[0-9](?:_?[0-9])*[Ee][-+]?[0-9]+|[0-9](?:_?[0-9])*\\.(?!\\.)(?:[0-9](?:_?[0-9])*)?(?:[Ee][-+]?[0-9]+)?)(?:[Ff](?:16|32|64|128)?|[Dd])?",
          "name": "constant.numeric.float.c3"
        },
        {
          "match": "\\b0[Xx]\\h(?:_?\\h)*(?:\\.(?:\\h(?:_?\\h)*)?)?[Pp][-+]?[0-9]+(?:[Ff](?:16|32|64|128)?|[Dd])?",
          "name": "constant.numeric.float.c3"
        }
      ]
    },
    "statements": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#modifier_keywords"
        },
        {
          "match": ";",
          "name": "punctuation.terminator.c3"
        },
        {
          "include": "#control_statements"
        },
        {
          "include": "#attribute"
        },
        {
          "include": "#block"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "string_literal": {
      "begin": "\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.c3"
        }
      },
      "end": "\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.c3"
        }
      },
      "name": "string.quoted.double.c3",
      "patterns": [
        {
          "include": "#escape_sequence"
        }
      ]
    },
    "structlike": {
      "begin": "(?=\\b(?:((?:|bit)struct)|(union))\\b)",
      "end": "(?<=})",
      "patterns": [
        {
          "begin": "\\b(?:((?:|bit)struct)|(union))\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.declaration.struct.c3"
            },
            "2": {
              "name": "keyword.declaration.union.c3"
            }
          },
          "end": "(?=\\{)",
          "name": "meta.struct.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "match": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
              "name": "entity.name.type.struct.c3"
            },
            {
              "match": "\\b_*[a-z][0-9A-Z_a-z]*\\b",
              "name": "variable.other.member.c3"
            },
            {
              "include": "#generic_params"
            },
            {
              "include": "#attribute"
            },
            {
              "begin": ":",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.separator.c3"
                }
              },
              "end": "(?=\\{)",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#type_no_generics"
                },
                {
                  "include": "#generic_params"
                },
                {
                  "include": "#attribute"
                }
              ]
            },
            {
              "begin": "\\(",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.section.group.begin.c3"
                }
              },
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.section.group.end.c3"
                }
              },
              "name": "meta.group.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#path"
                },
                {
                  "include": "#type"
                },
                {
                  "include": "#punctuation"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\{",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.block.begin.c3"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.block.end.c3"
            }
          },
          "name": "meta.struct.body.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#structlike"
            },
            {
              "include": "#modifier_keywords"
            },
            {
              "include": "#type"
            },
            {
              "match": "\\b_*[a-z][0-9A-Z_a-z]*\\b",
              "name": "variable.other.member.c3"
            },
            {
              "include": "#attribute"
            },
            {
              "match": ";",
              "name": "punctuation.terminator.c3"
            },
            {
              "begin": ":",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.separator.c3"
                }
              },
              "end": "(?=;)",
              "patterns": [
                {
                  "include": "#attribute"
                },
                {
                  "include": "#expression"
                }
              ]
            }
          ]
        }
      ]
    },
    "top_level": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#modifier_keywords"
        },
        {
          "begin": "\\$(?:assert|include|echo|exec)\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.other.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#expression"
            }
          ]
        },
        {
          "begin": "\\bmodule\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.declaration.module.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "name": "meta.module.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#attribute"
            },
            {
              "include": "#module_path"
            },
            {
              "include": "#generic_args"
            },
            {
              "include": "#generic_params"
            }
          ]
        },
        {
          "begin": "\\bimport\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.declaration.import.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "name": "meta.import.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#attribute"
            },
            {
              "include": "#module_path"
            },
            {
              "match": ",",
              "name": "punctuation.separator.c3"
            }
          ]
        },
        {
          "include": "#function"
        },
        {
          "begin": "\\balias\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.declaration.alias.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "name": "meta.alias.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "begin": "(?=\\b(_*[a-z][0-9A-Z_a-z]*)\\b\\s*=\\s*module)",
              "end": "(?=;)",
              "patterns": [
                {
                  "begin": "\\b(_*[a-z][0-9A-Z_a-z]*)\\b",
                  "end": "(?=;)",
                  "patterns": [
                    {
                      "include": "#comments"
                    },
                    {
                      "include": "#attribute"
                    },
                    {
                      "begin": "=",
                      "beginCaptures": {
                        "0": {
                          "name": "keyword.operator.assignment.c3"
                        }
                      },
                      "end": "(?=;)",
                      "patterns": [
                        {
                          "include": "#comments"
                        },
                        {
                          "begin": "module",
                          "beginCaptures": {
                            "0": {
                              "name": "keyword.declaration.module.c3"
                            }
                          },
                          "end": "(?=;)",
                          "patterns": [
                            {
                              "include": "#comments"
                            },
                            {
                              "include": "#module_path"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "begin": "(?:(@\\b_*[a-z][0-9A-Z_a-z]*)|\\b(_*[a-z][0-9A-Z_a-z]*)|\\b(_*[A-Z][0-9A-Z_]*))\\b",
              "beginCaptures": {
                "1": {
                  "name": "entity.name.function.c3"
                },
                "2": {
                  "name": "variable.global.c3"
                },
                "3": {
                  "name": "variable.other.constant.c3"
                }
              },
              "end": "(?=;)",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#generic_params"
                },
                {
                  "include": "#attribute"
                },
                {
                  "include": "#assign_right_expression"
                }
              ]
            },
            {
              "begin": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
              "beginCaptures": {
                "0": {
                  "name": "entity.name.type.c3"
                }
              },
              "end": "(?=;)",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#generic_params"
                },
                {
                  "include": "#attribute"
                },
                {
                  "include": "#assign_right_expression"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\btypedef\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.declaration.typedef.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "name": "meta.typedef.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "begin": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
              "beginCaptures": {
                "0": {
                  "name": "entity.name.type.c3"
                }
              },
              "end": "(?=;)",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#parens"
                },
                {
                  "include": "#generic_params"
                },
                {
                  "include": "#attribute"
                },
                {
                  "include": "#assign_right_expression"
                }
              ]
            }
          ]
        },
        {
          "begin": "\\bfaultdef\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.declaration.faultdef.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "name": "meta.faultdef.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#attribute"
            },
            {
              "match": "\\b_*[A-Z][0-9A-Z_]*\\b",
              "name": "variable.other.constant.c3"
            },
            {
              "match": ",",
              "name": "punctuation.separator.c3"
            }
          ]
        },
        {
          "begin": "\\battrdef\\b",
          "beginCaptures": {
            "0": {
              "name": "keyword.declaration.attrdef.c3"
            }
          },
          "end": ";",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.c3"
            }
          },
          "name": "meta.attrdef.c3",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "begin": "@\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
              "beginCaptures": {
                "0": {
                  "name": "keyword.annotation.c3"
                }
              },
              "end": "(?=;)",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "include": "#attribute"
                },
                {
                  "begin": "\\(",
                  "beginCaptures": {
                    "0": {
                      "name": "punctuation.section.group.begin.c3"
                    }
                  },
                  "end": "\\)",
                  "endCaptures": {
                    "0": {
                      "name": "punctuation.section.group.end.c3"
                    }
                  },
                  "name": "meta.group.c3",
                  "patterns": [
                    {
                      "include": "#parameters"
                    }
                  ]
                },
                {
                  "begin": "=",
                  "beginCaptures": {
                    "0": {
                      "name": "keyword.operator.assignment.c3"
                    }
                  },
                  "end": "(?=;)",
                  "patterns": [
                    {
                      "include": "#comments"
                    },
                    {
                      "include": "#attribute"
                    },
                    {
                      "match": ",",
                      "name": "punctuation.separator.c3"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "include": "#structlike"
        },
        {
          "begin": "(?=\\benum\\b)",
          "end": "(?<=})",
          "patterns": [
            {
              "begin": "\\benum\\b",
              "beginCaptures": {
                "0": {
                  "name": "keyword.declaration.enum.c3"
                }
              },
              "end": "(?=\\{)",
              "name": "meta.enum.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "match": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
                  "name": "entity.name.type.enum.c3"
                },
                {
                  "include": "#generic_params"
                },
                {
                  "include": "#attribute"
                },
                {
                  "begin": ":",
                  "beginCaptures": {
                    "0": {
                      "name": "punctuation.separator.c3"
                    }
                  },
                  "end": "(?=\\{)",
                  "patterns": [
                    {
                      "include": "#comments"
                    },
                    {
                      "match": "\\b(?:inline|const)\\b",
                      "name": "storage.modifier.c3"
                    },
                    {
                      "include": "#type_no_generics"
                    },
                    {
                      "begin": "\\(",
                      "beginCaptures": {
                        "0": {
                          "name": "punctuation.section.group.begin.c3"
                        }
                      },
                      "contentName": "meta.group.c3",
                      "end": "\\)",
                      "endCaptures": {
                        "0": {
                          "name": "punctuation.section.group.end.c3"
                        }
                      },
                      "patterns": [
                        {
                          "include": "#comments"
                        },
                        {
                          "match": "\\b(?:inline|const)\\b",
                          "name": "storage.modifier.c3"
                        },
                        {
                          "include": "#parameters"
                        }
                      ]
                    },
                    {
                      "include": "#generic_params"
                    },
                    {
                      "include": "#attribute"
                    }
                  ]
                }
              ]
            },
            {
              "begin": "\\{",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.section.block.begin.c3"
                }
              },
              "end": "}",
              "endCaptures": {
                "0": {
                  "name": "punctuation.section.block.end.c3"
                }
              },
              "name": "meta.enum.body.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "begin": "=",
                  "beginCaptures": {
                    "0": {
                      "name": "keyword.operator.assignment.c3"
                    }
                  },
                  "end": "(?=,)",
                  "patterns": [
                    {
                      "include": "#expression"
                    }
                  ]
                },
                {
                  "include": "#attribute"
                },
                {
                  "match": "\\b_*[A-Z][0-9A-Z_]*\\b",
                  "name": "variable.other.constant.c3"
                },
                {
                  "match": ",",
                  "name": "punctuation.separator.c3"
                }
              ]
            }
          ]
        },
        {
          "begin": "(?=\\bconstdef\\b)",
          "end": "(?<=})",
          "patterns": [
            {
              "begin": "\\bconstdef\\b",
              "beginCaptures": {
                "0": {
                  "name": "keyword.declaration.constdef.c3"
                }
              },
              "end": "(?=\\{)",
              "name": "meta.constdef.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "match": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
                  "name": "entity.name.type.enum.c3"
                },
                {
                  "include": "#attribute"
                }
              ]
            },
            {
              "begin": "\\{",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.section.block.begin.c3"
                }
              },
              "end": "}",
              "endCaptures": {
                "0": {
                  "name": "punctuation.section.block.end.c3"
                }
              },
              "name": "meta.constdef.body.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "begin": "=",
                  "beginCaptures": {
                    "0": {
                      "name": "keyword.operator.assignment.c3"
                    }
                  },
                  "end": "(?=[,}])",
                  "patterns": [
                    {
                      "include": "#expression"
                    }
                  ]
                },
                {
                  "include": "#attribute"
                },
                {
                  "match": "\\b_*[A-Z][0-9A-Z_]*\\b",
                  "name": "variable.other.constant.c3"
                },
                {
                  "match": ",",
                  "name": "punctuation.separator.c3"
                }
              ]
            }
          ]
        },
        {
          "begin": "(?=\\binterface\\b)",
          "end": "(?<=})",
          "patterns": [
            {
              "begin": "\\binterface\\b",
              "beginCaptures": {
                "0": {
                  "name": "keyword.declaration.interface.c3"
                }
              },
              "end": "(?=\\{)",
              "name": "meta.interface.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "match": "\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*\\b",
                  "name": "entity.name.type.interface.c3"
                },
                {
                  "include": "#generic_params"
                },
                {
                  "include": "#attribute"
                },
                {
                  "begin": ":",
                  "beginCaptures": {
                    "0": {
                      "name": "punctuation.separator.c3"
                    }
                  },
                  "end": "(?=\\{)",
                  "patterns": [
                    {
                      "include": "#comments"
                    },
                    {
                      "include": "#punctuation"
                    },
                    {
                      "include": "#type_no_generics"
                    }
                  ]
                }
              ]
            },
            {
              "begin": "\\{",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.section.block.begin.c3"
                }
              },
              "end": "}",
              "endCaptures": {
                "0": {
                  "name": "punctuation.section.block.end.c3"
                }
              },
              "name": "meta.interface.body.c3",
              "patterns": [
                {
                  "include": "#comments"
                },
                {
                  "match": ";",
                  "name": "punctuation.terminator.c3"
                },
                {
                  "include": "#function"
                }
              ]
            }
          ]
        }
      ]
    },
    "type": {
      "patterns": [
        {
          "include": "#path"
        },
        {
          "begin": "(?:\\b(void|bool|char|double|float|float16|bfloat|int128|ichar|int|iptr|isz|long|short|uint128|uint|ulong|uptr|ushort|usz|float128|any|fault|typeid)|(\\$?\\b\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*)\\b)\\b",
          "beginCaptures": {
            "1": {
              "name": "storage.type.built-in.primitive.c3"
            },
            "2": {
              "name": "support.type.c3"
            }
          },
          "end": "(?=\\*>|[^\\t *?\\[{])",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#generic_args"
            },
            {
              "include": "#type_suffix"
            }
          ]
        },
        {
          "include": "#type_expr"
        }
      ]
    },
    "type_expr": {
      "patterns": [
        {
          "begin": "\\$(?:typeof|typefrom|evaltype)\\b",
          "beginCaptures": {
            "0": {
              "name": "storage.type.c3"
            }
          },
          "end": "(?<=\\))",
          "patterns": [
            {
              "include": "#parens"
            }
          ]
        },
        {
          "begin": "\\$vatype\\b",
          "beginCaptures": {
            "0": {
              "name": "storage.type.c3"
            }
          },
          "end": "(?<=])",
          "patterns": [
            {
              "include": "#brackets"
            }
          ]
        },
        {
          "include": "#type_suffix"
        }
      ]
    },
    "type_no_generics": {
      "patterns": [
        {
          "include": "#path"
        },
        {
          "begin": "(?:\\b(void|bool|char|double|float|float16|bfloat|int128|ichar|int|iptr|isz|long|short|uint128|uint|ulong|uptr|ushort|usz|float128|any|fault|typeid)|(\\$?\\b\\b_*[A-Z][0-9A-Z_]*[a-z][0-9A-Z_a-z]*)\\b)\\b",
          "beginCaptures": {
            "1": {
              "name": "storage.type.built-in.primitive.c3"
            },
            "2": {
              "name": "support.type.c3"
            }
          },
          "end": "(?=[^\\t *?@\\[])",
          "patterns": [
            {
              "include": "#comments"
            },
            {
              "include": "#type_suffix"
            }
          ]
        },
        {
          "include": "#type_expr"
        }
      ]
    },
    "type_suffix": {
      "patterns": [
        {
          "include": "#brackets"
        },
        {
          "match": "\\*",
          "name": "keyword.operator.address.c3"
        },
        {
          "match": "\\?",
          "name": "keyword.operator.c3"
        }
      ]
    },
    "variable": {
      "begin": "(?<!#)\\$?\\b_*[a-z][0-9A-Z_a-z]*\\b",
      "beginCaptures": {
        "0": {
          "name": "variable.other.c3"
        }
      },
      "end": "(?=[^\\t {])|(?<=})",
      "patterns": [
        {
          "include": "#generic_args"
        }
      ]
    }
  },
  "scopeName": "source.c3"
}
