format T_
diff --git a/crates/parser/src/syntax_kind/generated.rs b/crates/parser/src/syntax_kind/generated.rs
index 93e02a9..6a38044 100644
--- a/crates/parser/src/syntax_kind/generated.rs
+++ b/crates/parser/src/syntax_kind/generated.rs
@@ -1006,7 +1006,149 @@
     }
 }
 #[macro_export]
-macro_rules ! T_ { [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW } ; [abstract] => { $ crate :: SyntaxKind :: ABSTRACT_KW } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [become] => { $ crate :: SyntaxKind :: BECOME_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [do] => { $ crate :: SyntaxKind :: DO_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [final] => { $ crate :: SyntaxKind :: FINAL_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [override] => { $ crate :: SyntaxKind :: OVERRIDE_KW } ; [priv] => { $ crate :: SyntaxKind :: PRIV_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [typeof] => { $ crate :: SyntaxKind :: TYPEOF_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [unsized] => { $ crate :: SyntaxKind :: UNSIZED_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [virtual] => { $ crate :: SyntaxKind :: VIRTUAL_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [yield] => { $ crate :: SyntaxKind :: YIELD_KW } ; [asm] => { $ crate :: SyntaxKind :: ASM_KW } ; [att_syntax] => { $ crate :: SyntaxKind :: ATT_SYNTAX_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [builtin] => { $ crate :: SyntaxKind :: BUILTIN_KW } ; [clobber_abi] => { $ crate :: SyntaxKind :: CLOBBER_ABI_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [format_args] => { $ crate :: SyntaxKind :: FORMAT_ARGS_KW } ; [global_asm] => { $ crate :: SyntaxKind :: GLOBAL_ASM_KW } ; [inlateout] => { $ crate :: SyntaxKind :: INLATEOUT_KW } ; [inout] => { $ crate :: SyntaxKind :: INOUT_KW } ; [label] => { $ crate :: SyntaxKind :: LABEL_KW } ; [lateout] => { $ crate :: SyntaxKind :: LATEOUT_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [may_unwind] => { $ crate :: SyntaxKind :: MAY_UNWIND_KW } ; [naked_asm] => { $ crate :: SyntaxKind :: NAKED_ASM_KW } ; [nomem] => { $ crate :: SyntaxKind :: NOMEM_KW } ; [noreturn] => { $ crate :: SyntaxKind :: NORETURN_KW } ; [nostack] => { $ crate :: SyntaxKind :: NOSTACK_KW } ; [offset_of] => { $ crate :: SyntaxKind :: OFFSET_OF_KW } ; [options] => { $ crate :: SyntaxKind :: OPTIONS_KW } ; [out] => { $ crate :: SyntaxKind :: OUT_KW } ; [preserves_flags] => { $ crate :: SyntaxKind :: PRESERVES_FLAGS_KW } ; [pure] => { $ crate :: SyntaxKind :: PURE_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [readonly] => { $ crate :: SyntaxKind :: READONLY_KW } ; [safe] => { $ crate :: SyntaxKind :: SAFE_KW } ; [sym] => { $ crate :: SyntaxKind :: SYM_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [yeet] => { $ crate :: SyntaxKind :: YEET_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [gen] => { $ crate :: SyntaxKind :: GEN_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [int_number] => { $ crate :: SyntaxKind :: INT_NUMBER } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [string] => { $ crate :: SyntaxKind :: STRING } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; [frontmatter] => { $ crate :: SyntaxKind :: FRONTMATTER } ; }
+macro_rules ! T_ {
+    [$] => { $ crate :: SyntaxKind :: DOLLAR };
+    [;] => { $ crate :: SyntaxKind :: SEMICOLON };
+    [,] => { $ crate :: SyntaxKind :: COMMA };
+    ['('] => { $ crate :: SyntaxKind :: L_PAREN };
+    [')'] => { $ crate :: SyntaxKind :: R_PAREN };
+    ['{'] => { $ crate :: SyntaxKind :: L_CURLY };
+    ['}'] => { $ crate :: SyntaxKind :: R_CURLY };
+    ['['] => { $ crate :: SyntaxKind :: L_BRACK };
+    [']'] => { $ crate :: SyntaxKind :: R_BRACK };
+    [<] => { $ crate :: SyntaxKind :: L_ANGLE };
+    [>] => { $ crate :: SyntaxKind :: R_ANGLE };
+    [@] => { $ crate :: SyntaxKind :: AT };
+    [#] => { $ crate :: SyntaxKind :: POUND };
+    [~] => { $ crate :: SyntaxKind :: TILDE };
+    [?] => { $ crate :: SyntaxKind :: QUESTION };
+    [&] => { $ crate :: SyntaxKind :: AMP };
+    [|] => { $ crate :: SyntaxKind :: PIPE };
+    [+] => { $ crate :: SyntaxKind :: PLUS };
+    [*] => { $ crate :: SyntaxKind :: STAR };
+    [/] => { $ crate :: SyntaxKind :: SLASH };
+    [^] => { $ crate :: SyntaxKind :: CARET };
+    [%] => { $ crate :: SyntaxKind :: PERCENT };
+    [_] => { $ crate :: SyntaxKind :: UNDERSCORE };
+    [.] => { $ crate :: SyntaxKind :: DOT };
+    [..] => { $ crate :: SyntaxKind :: DOT2 };
+    [...] => { $ crate :: SyntaxKind :: DOT3 };
+    [..=] => { $ crate :: SyntaxKind :: DOT2EQ };
+    [:] => { $ crate :: SyntaxKind :: COLON };
+    [::] => { $ crate :: SyntaxKind :: COLON2 };
+    [=] => { $ crate :: SyntaxKind :: EQ };
+    [==] => { $ crate :: SyntaxKind :: EQ2 };
+    [=>] => { $ crate :: SyntaxKind :: FAT_ARROW };
+    [!] => { $ crate :: SyntaxKind :: BANG };
+    [!=] => { $ crate :: SyntaxKind :: NEQ };
+    [-] => { $ crate :: SyntaxKind :: MINUS };
+    [->] => { $ crate :: SyntaxKind :: THIN_ARROW };
+    [<=] => { $ crate :: SyntaxKind :: LTEQ };
+    [>=] => { $ crate :: SyntaxKind :: GTEQ };
+    [+=] => { $ crate :: SyntaxKind :: PLUSEQ };
+    [-=] => { $ crate :: SyntaxKind :: MINUSEQ };
+    [|=] => { $ crate :: SyntaxKind :: PIPEEQ };
+    [&=] => { $ crate :: SyntaxKind :: AMPEQ };
+    [^=] => { $ crate :: SyntaxKind :: CARETEQ };
+    [/=] => { $ crate :: SyntaxKind :: SLASHEQ };
+    [*=] => { $ crate :: SyntaxKind :: STAREQ };
+    [%=] => { $ crate :: SyntaxKind :: PERCENTEQ };
+    [&&] => { $ crate :: SyntaxKind :: AMP2 };
+    [||] => { $ crate :: SyntaxKind :: PIPE2 };
+    [<<] => { $ crate :: SyntaxKind :: SHL };
+    [>>] => { $ crate :: SyntaxKind :: SHR };
+    [<<=] => { $ crate :: SyntaxKind :: SHLEQ };
+    [>>=] => { $ crate :: SyntaxKind :: SHREQ };
+    [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW };
+    [abstract] => { $ crate :: SyntaxKind :: ABSTRACT_KW };
+    [as] => { $ crate :: SyntaxKind :: AS_KW };
+    [become] => { $ crate :: SyntaxKind :: BECOME_KW };
+    [box] => { $ crate :: SyntaxKind :: BOX_KW };
+    [break] => { $ crate :: SyntaxKind :: BREAK_KW };
+    [const] => { $ crate :: SyntaxKind :: CONST_KW };
+    [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW };
+    [crate] => { $ crate :: SyntaxKind :: CRATE_KW };
+    [do] => { $ crate :: SyntaxKind :: DO_KW };
+    [else] => { $ crate :: SyntaxKind :: ELSE_KW };
+    [enum] => { $ crate :: SyntaxKind :: ENUM_KW };
+    [extern] => { $ crate :: SyntaxKind :: EXTERN_KW };
+    [false] => { $ crate :: SyntaxKind :: FALSE_KW };
+    [final] => { $ crate :: SyntaxKind :: FINAL_KW };
+    [fn] => { $ crate :: SyntaxKind :: FN_KW };
+    [for] => { $ crate :: SyntaxKind :: FOR_KW };
+    [if] => { $ crate :: SyntaxKind :: IF_KW };
+    [impl] => { $ crate :: SyntaxKind :: IMPL_KW };
+    [in] => { $ crate :: SyntaxKind :: IN_KW };
+    [let] => { $ crate :: SyntaxKind :: LET_KW };
+    [loop] => { $ crate :: SyntaxKind :: LOOP_KW };
+    [macro] => { $ crate :: SyntaxKind :: MACRO_KW };
+    [match] => { $ crate :: SyntaxKind :: MATCH_KW };
+    [mod] => { $ crate :: SyntaxKind :: MOD_KW };
+    [move] => { $ crate :: SyntaxKind :: MOVE_KW };
+    [mut] => { $ crate :: SyntaxKind :: MUT_KW };
+    [override] => { $ crate :: SyntaxKind :: OVERRIDE_KW };
+    [priv] => { $ crate :: SyntaxKind :: PRIV_KW };
+    [pub] => { $ crate :: SyntaxKind :: PUB_KW };
+    [ref] => { $ crate :: SyntaxKind :: REF_KW };
+    [return] => { $ crate :: SyntaxKind :: RETURN_KW };
+    [self] => { $ crate :: SyntaxKind :: SELF_KW };
+    [static] => { $ crate :: SyntaxKind :: STATIC_KW };
+    [struct] => { $ crate :: SyntaxKind :: STRUCT_KW };
+    [super] => { $ crate :: SyntaxKind :: SUPER_KW };
+    [trait] => { $ crate :: SyntaxKind :: TRAIT_KW };
+    [true] => { $ crate :: SyntaxKind :: TRUE_KW };
+    [type] => { $ crate :: SyntaxKind :: TYPE_KW };
+    [typeof] => { $ crate :: SyntaxKind :: TYPEOF_KW };
+    [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW };
+    [unsized] => { $ crate :: SyntaxKind :: UNSIZED_KW };
+    [use] => { $ crate :: SyntaxKind :: USE_KW };
+    [virtual] => { $ crate :: SyntaxKind :: VIRTUAL_KW };
+    [where] => { $ crate :: SyntaxKind :: WHERE_KW };
+    [while] => { $ crate :: SyntaxKind :: WHILE_KW };
+    [yield] => { $ crate :: SyntaxKind :: YIELD_KW };
+    [asm] => { $ crate :: SyntaxKind :: ASM_KW };
+    [att_syntax] => { $ crate :: SyntaxKind :: ATT_SYNTAX_KW };
+    [auto] => { $ crate :: SyntaxKind :: AUTO_KW };
+    [builtin] => { $ crate :: SyntaxKind :: BUILTIN_KW };
+    [clobber_abi] => { $ crate :: SyntaxKind :: CLOBBER_ABI_KW };
+    [default] => { $ crate :: SyntaxKind :: DEFAULT_KW };
+    [dyn] => { $ crate :: SyntaxKind :: DYN_KW };
+    [format_args] => { $ crate :: SyntaxKind :: FORMAT_ARGS_KW };
+    [global_asm] => { $ crate :: SyntaxKind :: GLOBAL_ASM_KW };
+    [inlateout] => { $ crate :: SyntaxKind :: INLATEOUT_KW };
+    [inout] => { $ crate :: SyntaxKind :: INOUT_KW };
+    [label] => { $ crate :: SyntaxKind :: LABEL_KW };
+    [lateout] => { $ crate :: SyntaxKind :: LATEOUT_KW };
+    [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW };
+    [may_unwind] => { $ crate :: SyntaxKind :: MAY_UNWIND_KW };
+    [naked_asm] => { $ crate :: SyntaxKind :: NAKED_ASM_KW };
+    [nomem] => { $ crate :: SyntaxKind :: NOMEM_KW };
+    [noreturn] => { $ crate :: SyntaxKind :: NORETURN_KW };
+    [nostack] => { $ crate :: SyntaxKind :: NOSTACK_KW };
+    [offset_of] => { $ crate :: SyntaxKind :: OFFSET_OF_KW };
+    [options] => { $ crate :: SyntaxKind :: OPTIONS_KW };
+    [out] => { $ crate :: SyntaxKind :: OUT_KW };
+    [preserves_flags] => { $ crate :: SyntaxKind :: PRESERVES_FLAGS_KW };
+    [pure] => { $ crate :: SyntaxKind :: PURE_KW };
+    [raw] => { $ crate :: SyntaxKind :: RAW_KW };
+    [readonly] => { $ crate :: SyntaxKind :: READONLY_KW };
+    [safe] => { $ crate :: SyntaxKind :: SAFE_KW };
+    [sym] => { $ crate :: SyntaxKind :: SYM_KW };
+    [union] => { $ crate :: SyntaxKind :: UNION_KW };
+    [yeet] => { $ crate :: SyntaxKind :: YEET_KW };
+    [async] => { $ crate :: SyntaxKind :: ASYNC_KW };
+    [await] => { $ crate :: SyntaxKind :: AWAIT_KW };
+    [dyn] => { $ crate :: SyntaxKind :: DYN_KW };
+    [gen] => { $ crate :: SyntaxKind :: GEN_KW };
+    [try] => { $ crate :: SyntaxKind :: TRY_KW };
+    [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT };
+    [int_number] => { $ crate :: SyntaxKind :: INT_NUMBER };
+    [ident] => { $ crate :: SyntaxKind :: IDENT };
+    [string] => { $ crate :: SyntaxKind :: STRING };
+    [shebang] => { $ crate :: SyntaxKind :: SHEBANG };
+    [frontmatter] => { $ crate :: SyntaxKind :: FRONTMATTER };
+}
+
 impl ::core::marker::Copy for SyntaxKind {}
 impl ::core::clone::Clone for SyntaxKind {
     #[inline]
diff --git a/xtask/src/codegen/grammar.rs b/xtask/src/codegen/grammar.rs
index 9bd87a7..18f6c1f 100644
--- a/xtask/src/codegen/grammar.rs
+++ b/xtask/src/codegen/grammar.rs
@@ -706,7 +706,23 @@
         }
     };
 
-    add_preamble(crate::flags::CodegenType::Grammar, reformat(ast.to_string()))
+    let result = add_preamble(crate::flags::CodegenType::Grammar, reformat(ast.to_string()));
+
+    if let Some(start) = result.find("macro_rules ! T_")
+        && let Some(macro_end) = result[start..].find("\nimpl ::core::marker::Copy")
+    {
+        let macro_section = &result[start..start + macro_end];
+        let formatted_macro = macro_section
+            .replace("T_ { [", "T_ {\n    [")
+            .replace(" ; [", ";\n    [")
+            .replace(" ; }", ";\n}")
+            .trim_end()
+            .to_owned()
+            + "\n";
+        return result.replace(macro_section, &formatted_macro);
+    }
+
+    result
 }
 
 fn to_upper_snake_case(s: &str) -> String {