修改標記解析器

至今為止,我們處理的符號標記長度都為1,所以我們的程式碼也是依此假設寫成的。但是要處理像==這樣的比較演算子的話,就得把程式改得更為通用。為了可以在標記紀錄字串的長度,我們要在Token結構中加上len這個成員。新的資料結構如下:

struct Token {
  TokenKind kind; // 標記的型態
  Token *next;    // 下一個輸入標記
  int val;        // kind為TK_NUM時的數值
  char *str;      // 標記文字列
  int len;        // 標記長度
};

修改資料結構的同時,consumeexpect函式也要修改成不只可以處理單個文字,而是要可以處理字串。修改如下所示:

bool consume(char *op) {
  if (token->kind != TK_RESERVED ||
      strlen(op) != token->len ||
      memcmp(token->str, op, token->len))
    return false;
  token = token->next;
  return true;
}

對由複數文字組成的標記進行標記解析的時候,需要從長的標記開始解析。舉例來說,下一個文字是>的話,首先要先像 strncmp(p, ">=", 2)這樣先確認有沒有可能是>=,否則如果先判斷>的話>=就會被誤認為是>=兩個標記。

Last updated