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

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);
  }
}


侃侃尔雅
浏览 151回答 1
1回答

扬帆大鱼

这是个很简单的recursive descent LL(1)解析器。//&nbsp;从*begin里读取第一个不是空格的字符,如果其值为n,则返回1。如果其值不为n,//&nbsp;则将这个字符放回*begin里,返回0。如果读到底都没发现不是空格的字符,则//&nbsp;返回-1.//&nbsp;总之就是忽略空格然后读一个给定的字符的意思int&nbsp;Sexp::next_token(char&nbsp;**begin,&nbsp;const&nbsp;char&nbsp;*end,&nbsp;const&nbsp;char&nbsp;n)&nbsp;{&nbsp;&nbsp;char&nbsp;c&nbsp;=&nbsp;0;&nbsp;&nbsp;do&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;一个一个字符地读,读到直到不是空格为止。 &nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;**begin; &nbsp;&nbsp;&nbsp;&nbsp;++(*begin); &nbsp;&nbsp;}&nbsp;while&nbsp;(isspace(c));&nbsp;&nbsp;if&nbsp;(*begin&nbsp;>=&nbsp;end)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果读到底都没发现不是空格的字符,就返回负一 &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1; &nbsp;&nbsp;}&nbsp;&nbsp;if&nbsp;(c&nbsp;==&nbsp;n)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果第一个非空格的字符正好是所我们期待的这个n,那么就返回1 &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1; &nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;否则就把这个字符放回去再返回0 &nbsp;&nbsp;&nbsp;&nbsp;--(*begin);&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;} }//&nbsp;忽略注释直到遇到第一个不是注释的字符void&nbsp;Sexp::comment(char&nbsp;**begin,&nbsp;const&nbsp;char&nbsp;*end)&nbsp;{&nbsp;&nbsp;//&nbsp;读一个分号 &nbsp;&nbsp;const&nbsp;int&nbsp;r&nbsp;=&nbsp;next_token(begin,&nbsp;end,&nbsp;';');&nbsp;&nbsp;//&nbsp;如果的确是分号 &nbsp;&nbsp;if&nbsp;(r&nbsp;==&nbsp;1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(*begin&nbsp;<&nbsp;end)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;那就继续读下去 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;c&nbsp;=&nbsp;**begin; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++(*begin);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(c&nbsp;==&nbsp;'\r'&nbsp;||&nbsp;c&nbsp;==&nbsp;'\n')&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;直到遇到了换行符为止 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;然后继续忽略下一行的注释 &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;comment(begin,&nbsp;end); &nbsp;&nbsp;} }下次提问前,请先自己多尝试一下,提供更多的信息。如果你能说明你是如何理解这两个函数的,为什么会看不懂的话,那么我的回答就会更加精确,更加有用一些。
打开App,查看更多内容
随时随地看视频慕课网APP