修改標記解析器

在了解變數該如何實作之後,我們緊接著來實作吧。但是突然就要實作任意長的變數有點太難了,所以在這步我們把變數限定在小寫1個字,變數a為 RBP-8、變數b為 RBP-16、變數c為 RBP-24,讓所有的變數以常駐方式存在。因為英文字母有26個字,函式被呼叫時我們把 RSP 往下推26×8也就是208個 bytes,保留所有1個字的變數空間。

馬上來實作看看吧。首先從標記解析器著手,在至今為止文法的元素以外,讓其可以對1個字的變數作標記解析。為此,我們得追加新的標記型態。變數名稱可以從str讀入,所以不需要在Token型中增加新的成員。最終,Token型如下所示:

enum {
  TK_RESERVED, // 符號
  TK_IDENT,    // 識別符號
  TK_NUM,      // 整數標記
  TK_EOF,      // 代表輸入結束的標記
} TokenKind;

修改標記解析器,讓其可以對小寫英文字母建立TK_IDENT型的標記。只要對標記解析器加上如下的if敘述即可:

if ('a' <= *p && *p <= 'z') {
  cur = new_token(TK_IDENT, cur, p++);
  cur->len = 1;
  continue;
}

Last updated