c++ - 求解释函数
怪我咯
怪我咯 2017-04-17 11:05:37
[C++讨论组]

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

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)
ringa_lee

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号