首页 > 开发 > 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);  }}

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