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); } }
下次提问前,请先自己多尝试一下,提供更多的信息。如果你能说明你是如何理解这两个函数的,为什么会看不懂的话,那么我的回答就会更加精确,更加有用一些。
- 1 回答
- 0 关注
- 150 浏览
添加回答
举报
0/150
提交
取消