stage2 大量优化代码使其自举编译时间大幅缩短
This commit is contained in:
1 parent
e02b0c633a
commit
846f441e3a
38 files changed
+2418
-835
No files matched your search
+58
-30
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user