你知道C语言是怎么Read一整个文件吗?如果你知道了,那么请忽略本文,如果你不知道,你可以花五分钟来阅读本文。在我开始阅读Lua代码之前,我好像从来没有用C语言写过一次性Read整个文件的字符的代码,以往都是一句句的读取。以至于我对这样的代码失去了敏感性。在开始阅读Lua代码的时候,花了两个小时来寻找Lua解析器如何读取脚本的内容,一直当我看到getc的时候才豁然开朗,以前几乎没有用过getc,开篇就定式的写下了fscanf。下面是一段C语言的代码:
#include <stdio.h>
int main()
{
FILE * file = fopen("fordebug.lua", "r");
int c = getc(file);
file->_base[file->_cnt] = 0;
printf(file->_base);
return 0;
}
So easy. 相信你能很快的看懂这段代码,如果我没有猜错,lua正是这样读取脚本文件的。大家可以根据call stack进去看看。
main -> load -> luaL_loadfilex -> skipcomment -> skipBOM。在lparser.c文件中,skipBOM的内容是这样的:
static int skipBOM (LoadF *lf) {
const char *p = "\xEF\xBB\xBF"; /* Utf8 BOM mark */
int c;
lf->n = 0;
do {
c = getc(lf->f);
if (c == EOF || c != *(const unsigned char *)p++) return c;
lf->buff[lf->n++] = c; /* to be read by the parser */
} while (*p != '\0');
lf->n = 0; /* prefix matched; discard it */
return getc(lf->f); /* return next character */
}
看到getc了吗?今天发现的getc,是明天阅读词法分析的开始。
写于学习Lua的第六天(始于2013年11月8日)