为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
侃侃尔雅 2023-05-02 17:13:05
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);   } }
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这是个很简单的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);
  }
}

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


查看完整回答
反对 回复 2023-05-04
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信