diff --git a/nemu/src/monitor/sdb/expr.c b/nemu/src/monitor/sdb/expr.c
deleted file mode 100644
index 45d6483..0000000
--- a/nemu/src/monitor/sdb/expr.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/***************************************************************************************
-* Copyright (c) 2014-2022 Zihao Yu, Nanjing University
-*
-* NEMU is licensed under Mulan PSL v2.
-* You can use this software according to the terms and conditions of the Mulan PSL v2.
-* You may obtain a copy of Mulan PSL v2 at:
-*          http://license.coscl.org.cn/MulanPSL2
-*
-* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
-* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
-* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
-*
-* See the Mulan PSL v2 for more details.
-***************************************************************************************/
-
-#include <isa.h>
-
-/* We use the POSIX regex functions to process regular expressions.
- * Type 'man regex' for more information about POSIX regex functions.
- */
-#include <regex.h>
-
-enum {
-  TK_NOTYPE = 256, TK_EQ, TK_NUMBER,
-  LEX_GROUP_OPERATOR, LEX_GROUP_DIGIT
-};
-
-static struct rule {
-  const char *regex;
-  int token_type;
-} rules[] = {
-  {"[ \t]+", TK_NOTYPE},
-  {"==", TK_EQ},
-  {"[0-9]+", LEX_GROUP_DIGIT},
-  {"[\\+-*/()", LEX_GROUP_OPERATOR},
-};
-
-#define NR_REGEX ARRLEN(rules)
-
-static regex_t re[NR_REGEX] = {};
-
-/* Rules are used for many times.
- * Therefore we compile them only once before any usage.
- */
-void init_regex() {
-  int i;
-  char error_msg[128];
-  int ret;
-
-  for (i = 0; i < NR_REGEX; i ++) {
-    ret = regcomp(&re[i], rules[i].regex, REG_EXTENDED);
-    if (ret != 0) {
-      regerror(ret, &re[i], error_msg, 128);
-      panic("regex compilation failed: %s\n%s", error_msg, rules[i].regex);
-    }
-  }
-}
-
-typedef struct token {
-  int type;
-  char str[32];
-} Token;
-
-static Token tokens[32] __attribute__((used)) = {};
-static int nr_token __attribute__((used))  = 0;
-
-static bool make_token(char *e) {
-  int position = 0;
-  int i;
-  regmatch_t pmatch;
-
-  nr_token = 0;
-
-  while (e[position] != '\0') {
-    /* Try all rules one by one. */
-    for (i = 0; i < NR_REGEX; i ++) {
-      if (regexec(&re[i], e + position, 1, &pmatch, 0) == 0 && pmatch.rm_so == 0) {
-        char *substr_start = e + position;
-        int substr_len = pmatch.rm_eo;
-
-        Log("match rules[%d] = \"%s\" at position %d with len %d: %.*s",
-            i, rules[i].regex, position, substr_len, substr_len, substr_start);
-
-        position += substr_len;
-
-        /* TODO: Now a new token is recognized with rules[i]. Add codes
-         * to record the token in the array `tokens'. For certain types
-         * of tokens, some extra actions should be performed.
-         */
-
-        switch (rules[i].token_type) {
-          case LEX_GROUP_OPERATOR:
-            tokens[nr_token].type = *substr_start;
-            tokens[nr_token].str[0] = '\0';
-            nr_token++;
-            break;
-          case LEX_GROUP_DIGIT:
-            tokens[nr_token].type = TK_NUMBER;
-            nr_token++;
-            break;
-          case TK_NOTYPE: break;
-          default: TODO();
-        }
-
-        break;
-      }
-    }
-
-    if (i == NR_REGEX) {
-      printf("no match at position %d\n%s\n%*.s^\n", position, e, position, "");
-      return false;
-    }
-  }
-
-  return true;
-}
-
-
-word_t expr(char *e, bool *success) {
-  if (!make_token(e)) {
-    *success = false;
-    return 0;
-  }
-
-  /* TODO: Insert codes to evaluate the expression. */
-  TODO();
-
-  return 0;
-}
diff --git a/nemu/src/monitor/sdb/sdb.h b/nemu/src/monitor/sdb/sdb.h
index d2800d1..e94846c 100644
--- a/nemu/src/monitor/sdb/sdb.h
+++ b/nemu/src/monitor/sdb/sdb.h
@@ -18,6 +18,4 @@
 
 #include <common.h>
 
-word_t expr(char *e, bool *success);
-
 #endif