亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有兩個函數看不懂,求解釋?。?!

有兩個函數看不懂,求解釋?。。?/h1>
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 關注
  • 226 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號