开发者社区> 问答> 正文

求解释函数

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

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

展开
收起
a123456678 2016-06-03 19:39:46 1947 0
1 条回答
写回答
取消 提交回答
  • 这是个很简单的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);
      }
    }

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

    2019-07-17 19:27:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多