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);
}
}
有兩個函數看不懂,求解釋?。。?/h1>
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); } }
下次提問前,請先自己多嘗試一下,提供更多的信息。如果你能說明你是如何理解這兩個函數的,為什么會看不懂的話,那么我的回答就會更加精確,更加有用一些。
- 1 回答
- 0 關注
- 226 瀏覽
添加回答
舉報
0/150
提交
取消