stage2 大量优化代码使其自举编译时间大幅缩短
This commit is contained in:
1 parent
e02b0c633a
commit
846f441e3a
38 files changed
+2418
-835
No files matched your search
+7
-9
@@ -42,11 +42,8 @@ fn new(ast: *Ast, toks: Vec, diag: *Diag): Parser {
|
||||
// ---- token 访问 ----
|
||||
|
||||
fn token_ptr(self: *Parser, index: usize): *Token {
|
||||
match Vec.get(&self.toks, index) {
|
||||
.Ok(ptr) => { ret ptr as *Token; },
|
||||
.Err(error) => { ret null; },
|
||||
}
|
||||
ret null;
|
||||
if index >= self.toks.len { ret null; }
|
||||
ret (self.toks.data as *Token) + index;
|
||||
}
|
||||
|
||||
fn is_trivia(kind: TokenKind): bool {
|
||||
@@ -61,16 +58,17 @@ fn is_trivia(kind: TokenKind): bool {
|
||||
// 跳过 trivia;返回当前 token(含 EOF)。越界返回 null。
|
||||
fn peek(self: *Parser): *Token {
|
||||
var n = self.toks.len;
|
||||
var base = self.toks.data as *Token;
|
||||
var i = self.pos;
|
||||
while i < n {
|
||||
var t = token_ptr(self, i);
|
||||
if t == null { break; }
|
||||
if base == null { break; }
|
||||
var t = base + i;
|
||||
if !is_trivia(t.kind) { break; }
|
||||
i = i + 1;
|
||||
}
|
||||
self.pos = i;
|
||||
if i >= n { ret null; }
|
||||
ret token_ptr(self, i);
|
||||
if i >= n || base == null { ret null; }
|
||||
ret base + i;
|
||||
}
|
||||
|
||||
fn advance(self: *Parser): *Token {
|
||||
|
||||
Reference in new issue
Block a user