有两个函数看不懂,求解释
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);
}
}
这是个很简单的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);
}
}
下次提问前,请先自己多尝试一下,提供更多的信息。如果你能说明你是如何理解这两个函数的,为什么会看不懂的话,那么我的回答就会更加精确,更加有用一些。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。