stage2 大量优化代码使其自举编译时间大幅缩短

This commit is contained in:
zzy committed 2026-09-20 09:33:20 +08:00
1 parent e02b0c633a
commit 846f441e3a
38 files changed
+2418 -835

No files matched your search

+58 -30
View File
@@ -66,37 +66,65 @@ fn is_trivia(kind: TokenKind): bool {
}
}
// 先按长度与首字节分派,再做完整比较,避免对每个标识符做全表串比较。
fn keyword_of(text: ByteView): KeywordResult {
if is(text, "any") { ret .Yes(.Any); }
if is(text, "as") { ret .Yes(.As); }
if is(text, "bool") { ret .Yes(.Bool); }
if is(text, "break") { ret .Yes(.Break); }
if is(text, "catch") { ret .Yes(.Catch); }
if is(text, "comptime") { ret .Yes(.Comptime); }
if is(text, "const") { ret .Yes(.Const); }
if is(text, "continue") { ret .Yes(.Continue); }
if is(text, "defer") { ret .Yes(.Defer); }
if is(text, "else") { ret .Yes(.Else); }
if is(text, "enum") { ret .Yes(.Enum); }
if is(text, "errdefer") { ret .Yes(.Errdefer); }
if is(text, "false") { ret .Yes(.False); }
if is(text, "fn") { ret .Yes(.Fn); }
if is(text, "for") { ret .Yes(.For); }
if is(text, "if") { ret .Yes(.If); }
if is(text, "loop") { ret .Yes(.Loop); }
if is(text, "match") { ret .Yes(.Match); }
if is(text, "null") { ret .Yes(.Null); }
if is(text, "ret") { ret .Yes(.Ret); }
if is(text, "shape") { ret .Yes(.Shape); }
if is(text, "struct") { ret .Yes(.Struct); }
if is(text, "true") { ret .Yes(.True); }
if is(text, "try") { ret .Yes(.Try); }
if is(text, "type") { ret .Yes(.Type); }
if is(text, "undefined") { ret .Yes(.Undefined); }
if is(text, "union") { ret .Yes(.Union); }
if is(text, "var") { ret .Yes(.Var); }
if is(text, "while") { ret .Yes(.While); }
if is(text, "_") { ret .Yes(.Underscore); }
var n = text.len;
if n == 0 { ret .No; }
var c0 = text.ptr[0];
if n == 2 {
if c0 == 'a' && is(text, "as") { ret .Yes(.As); }
if c0 == 'f' && is(text, "fn") { ret .Yes(.Fn); }
if c0 == 'i' && is(text, "if") { ret .Yes(.If); }
ret .No;
}
if n == 3 {
if c0 == 'a' && is(text, "any") { ret .Yes(.Any); }
if c0 == 'f' && is(text, "for") { ret .Yes(.For); }
if c0 == 'r' && is(text, "ret") { ret .Yes(.Ret); }
if c0 == 't' && is(text, "try") { ret .Yes(.Try); }
if c0 == 'v' && is(text, "var") { ret .Yes(.Var); }
ret .No;
}
if n == 4 {
if c0 == 'b' && is(text, "bool") { ret .Yes(.Bool); }
if c0 == 'e' && is(text, "else") { ret .Yes(.Else); }
if c0 == 'e' && is(text, "enum") { ret .Yes(.Enum); }
if c0 == 'l' && is(text, "loop") { ret .Yes(.Loop); }
if c0 == 'n' && is(text, "null") { ret .Yes(.Null); }
if c0 == 't' && is(text, "true") { ret .Yes(.True); }
if c0 == 't' && is(text, "type") { ret .Yes(.Type); }
ret .No;
}
if n == 5 {
if c0 == 'b' && is(text, "break") { ret .Yes(.Break); }
if c0 == 'c' && is(text, "catch") { ret .Yes(.Catch); }
if c0 == 'c' && is(text, "const") { ret .Yes(.Const); }
if c0 == 'd' && is(text, "defer") { ret .Yes(.Defer); }
if c0 == 'f' && is(text, "false") { ret .Yes(.False); }
if c0 == 'm' && is(text, "match") { ret .Yes(.Match); }
if c0 == 's' && is(text, "shape") { ret .Yes(.Shape); }
if c0 == 'u' && is(text, "union") { ret .Yes(.Union); }
if c0 == 'w' && is(text, "while") { ret .Yes(.While); }
ret .No;
}
if n == 6 {
if c0 == 's' && is(text, "struct") { ret .Yes(.Struct); }
ret .No;
}
if n == 8 {
if c0 == 'c' && is(text, "comptime") { ret .Yes(.Comptime); }
if c0 == 'c' && is(text, "continue") { ret .Yes(.Continue); }
if c0 == 'e' && is(text, "errdefer") { ret .Yes(.Errdefer); }
ret .No;
}
if n == 9 {
if c0 == 'u' && is(text, "undefined") { ret .Yes(.Undefined); }
ret .No;
}
if n == 1 {
if c0 == '_' && is(text, "_") { ret .Yes(.Underscore); }
ret .No;
}
ret .No;
}