diff --git a/grammars/tree-sitter-c.cson b/grammars/tree-sitter-c.cson
index 455747b..0e60c06 100644
--- a/grammars/tree-sitter-c.cson
+++ b/grammars/tree-sitter-c.cson
@@ -59,12 +59,8 @@ comments:
 
 scopes:
   'translation_unit': 'source.c'
-  'comment': 'comment.block'
-
-  'identifier': [
-    {match: '^[A-Z\\d_]+$', scopes: 'constant.other'}
-  ]
 
+  # Keyword
   '"#if"': 'keyword.control.directive'
   '"#ifdef"': 'keyword.control.directive'
   '"#ifndef"': 'keyword.control.directive'
@@ -74,112 +70,212 @@ scopes:
   '"#define"': 'keyword.control.directive'
   '"#include"': 'keyword.control.directive'
   'preproc_directive': 'keyword.control.directive'
+  '"__attribute__"': 'keyword.control.directive'
 
-  '"if"': 'keyword.control'
-  '"else"': 'keyword.control'
-  '"do"': 'keyword.control'
-  '"for"': 'keyword.control'
-  '"while"': 'keyword.control'
-  '"break"': 'keyword.control'
-  '"continue"': 'keyword.control'
-  '"return"': 'keyword.control'
-  '"switch"': 'keyword.control'
-  '"case"': 'keyword.control'
-  '"default"': 'keyword.control'
-  '"goto"': 'keyword.control'
-
-  '"struct"': 'keyword.control'
-  '"enum"': 'keyword.control'
-  '"union"': 'keyword.control'
-  '"typedef"': 'keyword.control'
-
-  'preproc_function_def > identifier:nth-child(1)': 'entity.name.function.preprocessor'
-  'preproc_arg': 'meta.preprocessor.macro'
+  '"if"': 'keyword.control.condition'
+  '"else"': 'keyword.control.condition'
+  '"switch"': 'keyword.control.condition'
+  '"case"': 'keyword.control.condition'
+  '"default"': 'keyword.control.condition'
+  '"do"': 'keyword.control.loop'
+  '"for"': 'keyword.control.loop'
+  '"while"': 'keyword.control.loop'
+  '"break"': 'keyword.control.jump'
+  '"continue"': 'keyword.control.jump'
+  '"return"': 'keyword.control.jump'
+  '"goto"': 'keyword.control.jump'
 
-  '''
-  call_expression > identifier,
-  call_expression > field_expression > field_identifier,
-  function_declarator > identifier
-  ''': 'entity.name.function'
+  '"sizeof"': 'keyword.operator.sizeof'
 
-  'statement_identifier': 'constant.variable'
+  '"+"': 'keyword.operator.arithmetic.symbol'
+  '"-"': 'keyword.operator.arithmetic.symbol'
+  'binary_expression > "*"': 'keyword.operator.arithmetic.symbol'
+  '"/"': 'keyword.operator.arithmetic.symbol'
+  '"%"': 'keyword.operator.arithmetic.symbol'
+  '"++"': 'keyword.operator.arithmetic.symbol'
+  '"--"': 'keyword.operator.arithmetic.symbol'
 
-  'field_identifier': 'variable.other.member'
+  'binary_expression > "&"': 'keyword.operator.bitwise.symbol'
+  '"|"': 'keyword.operator.bitwise.symbol'
+  '"^"': 'keyword.operator.bitwise.symbol'
+  '"~"': 'keyword.operator.bitwise.symbol'
+  '"<<"': 'keyword.operator.bitwise.shift.symbol'
+  '">>"': 'keyword.operator.bitwise.shift.symbol'
 
-  'type_identifier': 'support.storage.type'
-  'primitive_type': 'support.storage.type'
-  '"signed"': 'support.storage.type'
-  '"unsigned"': 'support.storage.type'
-  '"short"': 'support.storage.type'
-  '"long"': 'support.storage.type'
+  '"="': 'keyword.operator.assignment.symbol'
+  '"+="': 'keyword.operator.assignment.compound.symbol'
+  '"-="': 'keyword.operator.assignment.compound.symbol'
+  '"*="': 'keyword.operator.assignment.compound.symbol'
+  '"/="': 'keyword.operator.assignment.compound.symbol'
+  '"%="': 'keyword.operator.assignment.compound.symbol'
+  '"<<="': 'keyword.operator.assignment.compound.symbol'
+  '">>="': 'keyword.operator.assignment.compound.symbol'
+  '"&="': 'keyword.operator.assignment.compound.symbol'
+  '"|="': 'keyword.operator.assignment.compound.symbol'
+  '"^="': 'keyword.operator.assignment.compound.symbol'
 
-  'char_literal': 'string.quoted.single'
-  'string_literal': 'string.quoted.double'
-  'system_lib_string': 'string.quoted.other'
-  'escape_sequence': 'constant.character.escape'
+  '"=="': 'keyword.operator.comparison.symbol'
+  '"!="': 'keyword.operator.comparison.symbol'
+  '"<"': 'keyword.operator.comparison.symbol'
+  '">"': 'keyword.operator.comparison.symbol'
+  '"<="': 'keyword.operator.comparison.symbol'
+  '">="': 'keyword.operator.comparison.symbol'
 
-  'number_literal': 'constant.numeric.decimal'
-  'null': 'constant.language.null'
-  'true': 'constant.language.boolean'
-  'false': 'constant.language.boolean'
+  '"!"': 'keyword.operator.logical.symbol'
+  '"&&"': 'keyword.operator.logical.symbol'
+  '"||"': 'keyword.operator.logical.symbol'
+
+  '"&"': 'keyword.operator.pointer.reference.symbol'
+  '"*"': 'keyword.operator.pointer.dereference.symbol'
+
+  '"?"': 'keyword.operator.ternary.symbol'
+  'conditional_expression > ":"': 'keyword.operator.ternary.symbol'
+
+  '"..."': 'keyword.operator.variadic.symbol'
+
+  # Storage
+  '"typedef"': 'storage.declaration.datatype'
+  '"struct"': 'storage.declaration.structure'
+  '"enum"': 'storage.declaration.enumeration'
+  '"union"': 'storage.declaration.union'
 
-  'auto': 'storage.modifier'
   '"extern"': 'storage.modifier'
-  '"register"': 'storage.modifier'
   '"static"': 'storage.modifier'
+  '"register"': 'storage.modifier'
   '"inline"': 'storage.modifier'
   '"const"': 'storage.modifier'
   '"volatile"': 'storage.modifier'
   '"restrict"': 'storage.modifier'
   '"_Atomic"': 'storage.modifier'
+  'auto': 'storage.modifier'
   'function_specifier': 'storage.modifier'
 
-  '";"': 'punctuation.terminator.statement'
-  '"["': 'punctuation.definition.begin.bracket.square'
-  '"]"': 'punctuation.definition.end.bracket.square'
-  '","': 'punctuation.separator.delimiter'
-  'char_literal > "\'"': 'punctuation.definition.string'
+  '"unsigned"': 'storage.type.language'
+  '"signed"': 'storage.type.language'
+  '"short"': 'storage.type.language'
+  '"long"': 'storage.type.language'
+  'primitive_type': 'storage.type.language'
+  'type_identifier': 'storage.type.entity'
+
+  # Entity
+  'identifier': [
+    {
+      match: '^[A-Z\\d_]+$',
+      scopes: 'entity.variable.immutable'
+    },
+    'entity.variable'
+  ]
+
+  'field_identifier': 'entity.variable.member'
+
+  'statement_identifier': 'entity.label'
+
+  '''
+  preproc_function_def > identifier:nth-child(1),
+  function_declarator > identifier
+  ''': 'entity.function'
+
+  '''
+  call_expression > identifier,
+  call_expression > field_expression > field_identifier
+  ''': 'entity.function.call'
+
+  # String
+  'string_literal': 'string.quoted'
+  'system_lib_string': 'string.quoted'
+
+  # Constant
+  'char_literal': 'constant.character'
+  'escape_sequence': 'constant.character.escape'
+  'preproc_include > string_literal > escape_sequence': '' # No escape characters in include directive
+
+  'number_literal': 'constant.numeric.decimal'
+
+  'null': 'constant.language.null'
+  'true': 'constant.language.boolean.true'
+  'false': 'constant.language.boolean.false'
+
+  # Comment
+  'comment': 'comment.block'
+
+  # Punctuation
+  '":"': 'punctuation.definition'
+  '"["': 'punctuation.definition'
+  '"]"': 'punctuation.definition'
+  '"{"': 'punctuation.definition'
+  '"}"': 'punctuation.definition'
+  '"("': 'punctuation.definition'
+  '")"': 'punctuation.definition'
+  '","': 'punctuation.separator'
+  '";"': 'punctuation.terminator'
+  '"."': 'punctuation.accessor.member'
+  '"->"': 'punctuation.accessor.member'
+  'char_literal > "\'"': 'punctuation.definition.constant.character'
   'string_literal > "\\""': 'punctuation.definition.string'
-  '"{"': 'punctuation.section.block.begin.bracket.curly'
-  '"}"': 'punctuation.section.block.end.bracket.curly'
-  '"("': 'punctuation.section.parens.begin.bracket.round'
-  '")"': 'punctuation.section.parens.end.bracket.round'
 
-  '"sizeof"': 'keyword.operator.sizeof'
-  '"."': 'keyword.operator.member'
-  '"->"': 'keyword.operator.member'
-  '"*"': 'keyword.operator'
-  '"-"': 'keyword.operator'
-  '"+"': 'keyword.operator'
-  '"/"': 'keyword.operator'
-  '"%"': 'keyword.operator'
-  '"++"': 'keyword.operator'
-  '"--"': 'keyword.operator'
-  '"=="': 'keyword.operator'
-  '"!"': 'keyword.operator'
-  '"!="': 'keyword.operator'
-  '"<"': 'keyword.operator'
-  '">"': 'keyword.operator'
-  '">="': 'keyword.operator'
-  '"<="': 'keyword.operator'
-  '"&&"': 'keyword.operator'
-  '"||"': 'keyword.operator'
-  '"&"': 'keyword.operator'
-  '"|"': 'keyword.operator'
-  '"^"': 'keyword.operator'
-  '"~"': 'keyword.operator'
-  '"<<"': 'keyword.operator'
-  '">>"': 'keyword.operator'
-  '"="': 'keyword.operator'
-  '"+="': 'keyword.operator'
-  '"-="': 'keyword.operator'
-  '"*="': 'keyword.operator'
-  '"/="': 'keyword.operator'
-  '"%="': 'keyword.operator'
-  '"<<="': 'keyword.operator'
-  '">>="': 'keyword.operator'
-  '"&="': 'keyword.operator'
-  '"^="': 'keyword.operator'
-  '"|="': 'keyword.operator'
-  '"?"': 'keyword.operator'
-  '":"': 'keyword.operator'
+  'array_declarator > "["': 'punctuation.definition.collection.array'
+  'array_declarator > "]"': 'punctuation.definition.collection.array'
+  'abstract_array_declarator > "["': 'punctuation.definition.collection.array'
+  'abstract_array_declarator > "]"': 'punctuation.definition.collection.array'
+
+  'subscript_expression > "["': 'punctuation.accessor.subscript'
+  'subscript_expression > "]"': 'punctuation.accessor.subscript'
+  'subscript_designator > "["': 'punctuation.accessor.subscript'
+  'subscript_designator > "]"': 'punctuation.accessor.subscript'
+
+  'compound_statement > "{"': 'punctuation.definition.statement'
+  'compound_statement > "}"': 'punctuation.definition.statement'
+
+  'function_definition > compound_statement > "{"': 'punctuation.definition.body.function'
+  'function_definition > compound_statement > "}"': 'punctuation.definition.body.function'
+
+  'enumerator_list > "{"': 'punctuation.definition.body.enumeration'
+  'enumerator_list > "}"': 'punctuation.definition.body.enumeration'
+
+  'union_specifier > field_declaration_list > "{"': 'punctuation.definition.body.union'
+  'union_specifier > field_declaration_list > "}"': 'punctuation.definition.body.union'
+
+  'struct_specifier > field_declaration_list > "{"': 'punctuation.definition.body.structure'
+  'struct_specifier > field_declaration_list > "}"': 'punctuation.definition.body.structure'
+
+  'preproc_params > "("': 'punctuation.definition.parameters'
+  'preproc_params > ")"': 'punctuation.definition.parameters'
+
+  'parameter_list > "("': 'punctuation.definition.parameters'
+  'parameter_list > ")"': 'punctuation.definition.parameters'
+  'argument_list > "("': 'punctuation.definition.arguments'
+  'argument_list > ")"': 'punctuation.definition.arguments'
+
+  'sizeof_expression > "("': 'punctuation.definition.arguments'
+  'sizeof_expression > ")"': 'punctuation.definition.arguments'
+  'sizeof_expression > parenthesized_expression > "("': 'punctuation.definition.arguments'
+  'sizeof_expression > parenthesized_expression > ")"': 'punctuation.definition.arguments'
+
+  'attribute_specifier > "("': 'punctuation.definition.arguments'
+  'attribute_specifier > ")"': 'punctuation.definition.arguments'
+
+  'cast_expression > "("': 'punctuation.definition.cast'
+  'cast_expression > ")"': 'punctuation.definition.cast'
+
+  'compound_literal_expression > "("': 'punctuation.definition.expression'
+  'compound_literal_expression > ")"': 'punctuation.definition.expression'
+
+  'parenthesized_expression > "("': 'punctuation.definition.expression'
+  'parenthesized_expression > ")"': 'punctuation.definition.expression'
+
+  'for_statement > "("': 'punctuation.definition.expression'
+  'for_statement > ")"': 'punctuation.definition.expression'
+
+  'ERROR > ":"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "["': 'punctuation.definition.invalid.illegal'
+  'ERROR > "]"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "{"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "}"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "("': 'punctuation.definition.invalid.illegal'
+  'ERROR > ")"': 'punctuation.definition.invalid.illegal'
+  'ERROR > ","': 'punctuation.separator.invalid.illegal'
+  'ERROR > ";"': 'punctuation.terminator.invalid.illegal'
+  'ERROR > "."': 'punctuation.accessor.member.invalid.illegal'
+  'ERROR > "->"': 'punctuation.accessor.member.invalid.illegal'
+  'ERROR > "\'"': 'punctuation.definition.constant.character.invalid.illegal'
+  'ERROR > "\\""': 'punctuation.definition.string.invalid.illegal'
diff --git a/grammars/tree-sitter-cpp.cson b/grammars/tree-sitter-cpp.cson
index d8fb0e4..b126953 100644
--- a/grammars/tree-sitter-cpp.cson
+++ b/grammars/tree-sitter-cpp.cson
@@ -75,12 +75,8 @@ comments:
 
 scopes:
   'translation_unit': 'source.cpp'
-  'comment': 'comment.block'
-
-  'identifier': [
-    {match: '^[A-Z\\d_]+$', scopes: 'constant.other'}
-  ]
 
+  # Keyword
   '"#if"': 'keyword.control.directive'
   '"#ifdef"': 'keyword.control.directive'
   '"#ifndef"': 'keyword.control.directive'
@@ -89,83 +85,91 @@ scopes:
   '"#endif"': 'keyword.control.directive'
   '"#define"': 'keyword.control.directive'
   '"#include"': 'keyword.control.directive'
+  '"using"': 'keyword.control.directive'
   'preproc_directive': 'keyword.control.directive'
+  '"__attribute__"': 'keyword.control.directive'
 
-  '"if"': 'keyword.control'
-  '"else"': 'keyword.control'
-  '"do"': 'keyword.control'
-  '"for"': 'keyword.control'
-  '"while"': 'keyword.control'
-  '"break"': 'keyword.control'
-  '"continue"': 'keyword.control'
-  '"return"': 'keyword.control'
-  '"switch"': 'keyword.control'
-  '"case"': 'keyword.control'
-  '"default"': 'keyword.control'
-  '"goto"': 'keyword.control'
-
-  '"struct"': 'keyword.control'
-  '"enum"': 'keyword.control'
-  '"union"': 'keyword.control'
-  '"typedef"': 'keyword.control'
-  '"class"': 'keyword.control'
-  '"using"': 'keyword.control'
-  '"namespace"': 'keyword.control'
-  '"template"': 'keyword.control'
-  '"typename"': 'keyword.control'
-  '"try"': 'keyword.control'
-  '"catch"': 'keyword.control'
-  '"throw"': 'keyword.control'
-  '"__attribute__"': 'keyword.attribute'
-
-  'preproc_function_def > identifier:nth-child(1)': 'entity.name.function.preprocessor'
-  'preproc_arg': 'meta.preprocessor.macro'
-  'preproc_directive': 'keyword.control.directive'
+  '"if"': 'keyword.control.condition'
+  '"else"': 'keyword.control.condition'
+  '"switch"': 'keyword.control.condition'
+  '"case"': 'keyword.control.condition'
+  '"default"': 'keyword.control.condition'
+  '"do"': 'keyword.control.loop'
+  '"for"': 'keyword.control.loop'
+  '"while"': 'keyword.control.loop'
+  '"break"': 'keyword.control.jump'
+  '"continue"': 'keyword.control.jump'
+  '"return"': 'keyword.control.jump'
+  '"goto"': 'keyword.control.jump'
+  '"try"': 'keyword.control.exception'
+  '"catch"': 'keyword.control.exception'
+  '"throw"': 'keyword.control.exception'
 
-  'template_function > identifier': [
-    {
-      match: '^(static|const|dynamic|reinterpret)_cast$'
-      scopes: 'keyword.operator'
-    }
-  ]
+  '"sizeof"': 'keyword.operator.sizeof'
+  '"new"': 'keyword.operator.new'
+  '"delete"': 'keyword.operator.delete'
 
-  '''
-  call_expression > identifier,
-  call_expression > field_expression > field_identifier,
-  call_expression > scoped_identifier > identifier,
-  template_function > identifier,
-  template_function > scoped_identifier > identifier,
-  template_method > field_identifier,
-  function_declarator > identifier,
-  function_declarator > field_identifier,
-  function_declarator > scoped_identifier > identifier,
-  destructor_name > identifier
-  ''': 'entity.name.function'
+  'template_function > identifier': {
+    match: '^(static|const|dynamic|reinterpret)_cast$',
+    scopes: 'keyword.operator.cast'
+  }
 
-  'statement_identifier': 'constant.variable'
+  '"+"': 'keyword.operator.arithmetic.symbol'
+  '"-"': 'keyword.operator.arithmetic.symbol'
+  'binary_expression > "*"': 'keyword.operator.arithmetic.symbol'
+  '"/"': 'keyword.operator.arithmetic.symbol'
+  '"%"': 'keyword.operator.arithmetic.symbol'
+  '"++"': 'keyword.operator.arithmetic.symbol'
+  '"--"': 'keyword.operator.arithmetic.symbol'
 
-  'field_identifier': 'variable.other.member'
+  'binary_expression > "&"': 'keyword.operator.bitwise.symbol'
+  '"|"': 'keyword.operator.bitwise.symbol'
+  '"^"': 'keyword.operator.bitwise.symbol'
+  '"~"': 'keyword.operator.bitwise.symbol'
+  '"<<"': 'keyword.operator.bitwise.shift.symbol'
+  '">>"': 'keyword.operator.bitwise.shift.symbol'
 
-  'type_identifier': 'support.storage.type'
-  'primitive_type': 'support.storage.type'
-  '"unsigned"': 'support.storage.type'
-  '"signed"': 'support.storage.type'
-  '"short"': 'support.storage.type'
-  '"long"': 'support.storage.type'
-  'auto': 'support.storage.type'
+  '"="': 'keyword.operator.assignment.symbol'
+  '"+="': 'keyword.operator.assignment.compound.symbol'
+  '"-="': 'keyword.operator.assignment.compound.symbol'
+  '"*="': 'keyword.operator.assignment.compound.symbol'
+  '"/="': 'keyword.operator.assignment.compound.symbol'
+  '"%="': 'keyword.operator.assignment.compound.symbol'
+  '"<<="': 'keyword.operator.assignment.compound.symbol'
+  '">>="': 'keyword.operator.assignment.compound.symbol'
+  '"&="': 'keyword.operator.assignment.compound.symbol'
+  '"|="': 'keyword.operator.assignment.compound.symbol'
+  '"^="': 'keyword.operator.assignment.compound.symbol'
 
-  'char_literal': 'string.quoted.single'
-  'string_literal': 'string.quoted.double'
-  'system_lib_string': 'string.quoted.other'
-  'raw_string_literal': 'string.quoted.other'
-  'escape_sequence': 'constant.character.escape'
-  'preproc_include > string_literal > escape_sequence': 'string.quoted.double'
+  '"=="': 'keyword.operator.comparison.symbol'
+  '"!="': 'keyword.operator.comparison.symbol'
+  'relational_expression > "<"': 'keyword.operator.comparison.symbol'
+  'relational_expression > ">"': 'keyword.operator.comparison.symbol'
+  '"<="': 'keyword.operator.comparison.symbol'
+  '">="': 'keyword.operator.comparison.symbol'
 
-  'number_literal': 'constant.numeric.decimal'
-  'null': 'constant.language.null'
-  'nullptr': 'constant.language.null'
-  'true': 'constant.language.boolean'
-  'false': 'constant.language.boolean'
+  '"!"': 'keyword.operator.logical.symbol'
+  '"&&"': 'keyword.operator.logical.symbol'
+  '"||"': 'keyword.operator.logical.symbol'
+
+  '"&"': 'keyword.operator.pointer.reference.symbol'
+  '"*"': 'keyword.operator.pointer.dereference.symbol'
+
+  '"?"': 'keyword.operator.ternary.symbol'
+  'conditional_expression > ":"': 'keyword.operator.ternary.symbol'
+
+  '"..."': 'keyword.operator.variadic.symbol'
+
+  # Storage
+  '"typedef"': 'storage.declaration.datatype'
+  '"struct"': 'storage.declaration.structure'
+  '"enum"': 'storage.declaration.enumeration'
+  '"union"': 'storage.declaration.union'
+  '"class"': 'storage.declaration.class'
+  '"template"': 'storage.declaration.template'
+  '"typename"': 'storage.declaration.typename'
+  '"namespace"': 'storage.declaration.namespace'
+  'auto': 'storage.declaration.auto'
 
   '"extern"': 'storage.modifier'
   '"static"': 'storage.modifier'
@@ -177,7 +181,6 @@ scopes:
   '"constexpr"': 'storage.modifier'
   '"volatile"': 'storage.modifier'
   '"restrict"': 'storage.modifier'
-  'function_specifier': 'storage.modifier'
   '"public"': 'storage.modifier'
   '"private"': 'storage.modifier'
   '"protected"': 'storage.modifier'
@@ -187,65 +190,194 @@ scopes:
   '"noexcept"': 'storage.modifier'
   '"mutable"': 'storage.modifier'
 
-  '";"': 'punctuation.terminator.statement'
-  '"["': 'punctuation.definition.begin.bracket.square'
-  '"]"': 'punctuation.definition.end.bracket.square'
-  'access_specifier > ":"': 'punctuation.definition.visibility.colon'
-  'base_class_clause > ":"': 'punctuation.definition.inheritance.colon'
-  'base_class_clause > ","': 'punctuation.definition.separator.class.comma'
-  'field_declaration > ","': 'punctuation.separator.delimiter'
-  'parameter_list > ","': 'punctuation.separator.delimiter'
-  'field_initializer_list > ":"': 'punctuation.definition.initialization.colon'
-  'field_initializer_list > ","': 'punctuation.separator.delimiter'
-  '"::"': 'punctuation.separator.method.double-colon'
-  'template_parameter_list > "<"': 'punctuation.definition.template.bracket.angle'
-  'template_parameter_list > ">"': 'punctuation.definition.template.bracket.angle'
-  'template_argument_list > ">"': 'punctuation.definition.template.bracket.angle'
-  'template_argument_list > "<"': 'punctuation.definition.template.bracket.angle'
-  'char_literal > "\'"': 'punctuation.definition.string'
+  '"unsigned"': 'storage.type.language'
+  '"signed"': 'storage.type.language'
+  '"short"': 'storage.type.language'
+  '"long"': 'storage.type.language'
+  'primitive_type': 'storage.type.language.primitive'
+  'type_identifier': 'storage.type.entity'
+
+  # Entity
+  'identifier': [
+    {
+      match: '^[A-Z\\d_]+$',
+      scopes: 'entity.variable.immutable'
+    },
+    {
+      exact: 'this',
+      scopes: 'entity.variable.language.this'
+    },
+    'entity.variable'
+  ]
+
+  'field_identifier': 'entity.variable.member'
+
+  'namespace_identifier': 'entity.namespace'
+
+  'statement_identifier': 'entity.label'
+
+  '''
+  preproc_function_def > identifier:nth-child(1),
+  template_function > identifier,
+  template_function > scoped_identifier > identifier,
+  function_declarator > identifier,
+  function_declarator > scoped_identifier > identifier,
+  destructor_name > identifier
+  ''': 'entity.function'
+
+  '''
+  template_method > field_identifier,
+  function_declarator > field_identifier,
+  ''': 'entity.function.method'
+
+  '''
+  call_expression > identifier,
+  call_expression > scoped_identifier > identifier
+  ''': 'entity.function.call'
+
+  'call_expression > field_expression > field_identifier': 'entity.function.method.call'
+
+  # String
+  'string_literal': 'string.quoted'
+  'system_lib_string': 'string.quoted'
+  'raw_string_literal': 'string.quoted'
+
+  # Constant
+  'char_literal': 'constant.character'
+  'escape_sequence': 'constant.character.escape'
+  'preproc_include > string_literal > escape_sequence': '' # No escape characters in include directive
+
+  'number_literal': 'constant.numeric.decimal'
+
+  'null': 'constant.language.null'
+  'nullptr': 'constant.language.null'
+  'true': 'constant.language.boolean.true'
+  'false': 'constant.language.boolean.false'
+
+  # Comment
+  'comment': 'comment.block'
+
+  # Punctuation
+  '":"': 'punctuation.definition'
+  '"["': 'punctuation.definition'
+  '"]"': 'punctuation.definition'
+  '"{"': 'punctuation.definition'
+  '"}"': 'punctuation.definition'
+  '"("': 'punctuation.definition'
+  '")"': 'punctuation.definition'
+  '","': 'punctuation.separator'
+  '";"': 'punctuation.terminator'
+  '"."': 'punctuation.accessor.member'
+  '"->"': 'punctuation.accessor.member'
+  '"::"': 'punctuation.accessor.scope'
+  'char_literal > "\'"': 'punctuation.definition.constant.character'
   'string_literal > "\\""': 'punctuation.definition.string'
-  '"{"': 'punctuation.section.block.begin.bracket.curly'
-  '"}"': 'punctuation.section.block.end.bracket.curly'
-  '"("': 'punctuation.section.parens.begin.bracket.round'
-  '")"': 'punctuation.section.parens.end.bracket.round'
 
-  '"sizeof"': 'keyword.operator.sizeof'
-  '"new"': 'keyword.operator'
-  '"delete"': 'keyword.operator'
-  '"."': 'keyword.operator.member'
-  '"->"': 'keyword.operator.member'
-  '"*"': 'keyword.operator'
-  '"-"': 'keyword.operator'
-  '"+"': 'keyword.operator'
-  '"/"': 'keyword.operator'
-  '"%"': 'keyword.operator'
-  '"++"': 'keyword.operator'
-  '"--"': 'keyword.operator'
-  '"=="': 'keyword.operator'
-  '"!"': 'keyword.operator'
-  '"!="': 'keyword.operator'
-  'relational_expression > "<"': 'keyword.operator'
-  'relational_expression > ">"': 'keyword.operator'
-  '">="': 'keyword.operator'
-  '"<="': 'keyword.operator'
-  '"&&"': 'keyword.operator'
-  '"||"': 'keyword.operator'
-  '"&"': 'keyword.operator'
-  '"|"': 'keyword.operator'
-  '"^"': 'keyword.operator'
-  '"~"': 'keyword.operator'
-  '"<<"': 'keyword.operator'
-  '">>"': 'keyword.operator'
-  '"="': 'keyword.operator'
-  '"+="': 'keyword.operator'
-  '"-="': 'keyword.operator'
-  '"*="': 'keyword.operator'
-  '"/="': 'keyword.operator'
-  '"%="': 'keyword.operator'
-  '"<<="': 'keyword.operator'
-  '">>="': 'keyword.operator'
-  '"&="': 'keyword.operator'
-  '"^="': 'keyword.operator'
-  '"|="': 'keyword.operator'
-  '"?"': 'keyword.operator'
-  'conditional_expression > ":"': 'keyword.operator'
+  'base_class_clause > ":"': 'punctuation.definition.type'
+  'enum_specifier > ":"': 'punctuation.definition.type'
+
+  'structured_binding_declarator > "["': 'punctuation.definition.binding'
+  'structured_binding_declarator > "["': 'punctuation.definition.binding'
+
+  'lambda_capture_specifier > "["': 'punctuation.definition.function.lambda'
+  'lambda_capture_specifier > "]"': 'punctuation.definition.function.lambda'
+
+  'new_declarator > "["': 'punctuation.definition.collection.array'
+  'new_declarator > "]"': 'punctuation.definition.collection.array'
+  'delete_expression > "["': 'punctuation.definition.collection.array'
+  'delete_expression > "]"': 'punctuation.definition.collection.array'
+
+  'array_declarator > "["': 'punctuation.definition.collection.array'
+  'array_declarator > "]"': 'punctuation.definition.collection.array'
+  'abstract_array_declarator > "["': 'punctuation.definition.collection.array'
+  'abstract_array_declarator > "]"': 'punctuation.definition.collection.array'
+
+  'subscript_expression > "["': 'punctuation.accessor.subscript'
+  'subscript_expression > "]"': 'punctuation.accessor.subscript'
+  'subscript_designator > "["': 'punctuation.accessor.subscript'
+  'subscript_designator > "]"': 'punctuation.accessor.subscript'
+
+  'compound_statement > "{"': 'punctuation.definition.statement'
+  'compound_statement > "}"': 'punctuation.definition.statement'
+
+  'function_definition > compound_statement > "{"': 'punctuation.definition.body.function'
+  'function_definition > compound_statement > "}"': 'punctuation.definition.body.function'
+  'lambda_expression > compound_statement > "{"': 'punctuation.definition.body.function.lambda'
+  'lambda_expression > compound_statement > "}"': 'punctuation.definition.body.function.lambda'
+
+  'enumerator_list > "{"': 'punctuation.definition.body.enumeration'
+  'enumerator_list > "}"': 'punctuation.definition.body.enumeration'
+
+  'union_specifier > field_declaration_list > "{"': 'punctuation.definition.body.union'
+  'union_specifier > field_declaration_list > "}"': 'punctuation.definition.body.union'
+
+  'struct_specifier > field_declaration_list > "{"': 'punctuation.definition.body.structure'
+  'struct_specifier > field_declaration_list > "}"': 'punctuation.definition.body.structure'
+
+  'class_specifier > field_declaration_list > "{"': 'punctuation.definition.body.class'
+  'class_specifier > field_declaration_list > "}"': 'punctuation.definition.body.class'
+
+  'template_parameter_list > "<"': 'punctuation.definition.parameters.template'
+  'template_parameter_list > ">"': 'punctuation.definition.parameters.template'
+  'template_argument_list > ">"': 'punctuation.definition.arguments.template'
+  'template_argument_list > "<"': 'punctuation.definition.arguments.template'
+
+  'preproc_params > "("': 'punctuation.definition.parameters'
+  'preproc_params > ")"': 'punctuation.definition.parameters'
+
+  'parameter_list > "("': 'punctuation.definition.parameters'
+  'parameter_list > ")"': 'punctuation.definition.parameters'
+  'argument_list > "("': 'punctuation.definition.arguments'
+  'argument_list > ")"': 'punctuation.definition.arguments'
+
+  'sizeof_expression > "("': 'punctuation.definition.arguments'
+  'sizeof_expression > ")"': 'punctuation.definition.arguments'
+  'sizeof_expression > parenthesized_expression > "("': 'punctuation.definition.arguments'
+  'sizeof_expression > parenthesized_expression > ")"': 'punctuation.definition.arguments'
+
+  'throw_specifier > "("': 'punctuation.definition.arguments'
+  'throw_specifier > ")"': 'punctuation.definition.arguments'
+
+  'attribute_specifier > "("': 'punctuation.definition.arguments'
+  'attribute_specifier > ")"': 'punctuation.definition.arguments'
+
+  'static_assert_declaration > "("': 'punctuation.definition.arguments'
+  'static_assert_declaration > ")"': 'punctuation.definition.arguments'
+
+  'cast_expression > "("': 'punctuation.definition.cast'
+  'cast_expression > ")"': 'punctuation.definition.cast'
+
+  'compound_literal_expression > "("': 'punctuation.definition.expression'
+  'compound_literal_expression > ")"': 'punctuation.definition.expression'
+
+  'parenthesized_expression > "("': 'punctuation.definition.expression'
+  'parenthesized_expression > ")"': 'punctuation.definition.expression'
+
+  'for_statement > "("': 'punctuation.definition.expression'
+  'for_statement > ")"': 'punctuation.definition.expression'
+
+  'for_range_loop > "("': 'punctuation.definition.expression'
+  'for_range_loop > ")"': 'punctuation.definition.expression'
+
+  'noexcept > "("': 'punctuation.definition.expression'
+  'noexcept > ")"': 'punctuation.definition.expression'
+
+  'condition_clause > "("': 'punctuation.definition.expression'
+  'condition_clause > ")"': 'punctuation.definition.expression'
+
+  'ERROR > ":"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "["': 'punctuation.definition.invalid.illegal'
+  'ERROR > "]"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "{"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "}"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "("': 'punctuation.definition.invalid.illegal'
+  'ERROR > ")"': 'punctuation.definition.invalid.illegal'
+  'ERROR > "<"': 'punctuation.definition.invalid.illegal'
+  'ERROR > ">"': 'punctuation.definition.invalid.illegal'
+  'ERROR > ","': 'punctuation.separator.invalid.illegal'
+  'ERROR > ";"': 'punctuation.terminator.invalid.illegal'
+  'ERROR > "."': 'punctuation.accessor.member.invalid.illegal'
+  'ERROR > "->"': 'punctuation.accessor.member.invalid.illegal'
+  'ERROR > "::"': 'punctuation.accessor.scope.invalid.illegal'
+  'ERROR > "\'"': 'punctuation.definition.constant.character.invalid.illegal'
+  'ERROR > "\\""': 'punctuation.definition.string.invalid.illegal'