首页 > 开发 > C++ > 正文

求解释函数

2017-09-11 21:35:43  来源: 网友分享

有两个函数看不懂,求解释

int Sexp::next_token(char **begin, const char *end, const char n) {
  char c = 0;
  do {
    c = **begin;
    ++(*begin);
  } while (isspace(c));

  if (*begin >= end) {
    return -1;
  }

  if (c == n) {
    return 1;
  } else {
    --(*begin);
    return 0;
  }
}
void Sexp::comment(char **begin, const char *end) {
  const int r = next_token(begin, end, ';');
  if (r == 1) {
    while (*begin < end) {
      const char c = **begin;
      ++(*begin);
      if (c == '\r' || c == '\n') {
        break;
      }
    }
    return comment(begin, end);
  }
}

解决方案

这是个很简单的recursive descent LL(1)解析器。

// 从*begin里读取第一个不是空格的字符,如果其值为n,则返回1。如果其值不为n,
// 则将这个字符放回*begin里,返回0。如果读到底都没发现不是空格的字符,则
// 返回-1.
// 总之就是忽略空格然后读一个给定的字符的意思
int Sexp::next_token(char **begin, const char *end, const char n) {
  char c = 0;
  do {
    // 一个一个字符地读,读到直到不是空格为止。
    c = **begin;
    ++(*begin);
  } while (isspace(c));

  if (*begin >= end) {
    // 如果读到底都没发现不是空格的字符,就返回负一
    return -1;
  }

  if (c == n) {
    // 如果第一个非空格的字符正好是所我们期待的这个n,那么就返回1
    return 1;
  } else {
    // 否则就把这个字符放回去再返回0
    --(*begin);
    return 0;
  }
}

// 忽略注释直到遇到第一个不是注释的字符
void Sexp::comment(char **begin, const char *end) {
  // 读一个分号
  const int r = next_token(begin, end, ';');
  // 如果的确是分号
  if (r == 1) {
    while (*begin < end) {
      // 那就继续读下去
      const char c = **begin;
      ++(*begin);
      if (c == '\r' || c == '\n') {
        // 直到遇到了换行符为止
        break;
      }
    }
    // 然后继续忽略下一行的注释
    return comment(begin, end);
  }
}

下次提问前,请先自己多尝试一下,提供更多的信息。如果你能说明你是如何理解这两个函数的,为什么会看不懂的话,那么我的回答就会更加精确,更加有用一些。