我正在为类似lisp的语言编写翻译。输入文件是逐个令牌读取的。我在顶级std::fstream
控制它,如下所示:
...
std::fstream fin(path, std::fstream::in);
symtable table; // aliased map<>
while (!fin.eof()) {
try {
std::cout << "file still has contents!" << std::endl;
parse(fin, symbol_table);
} catch (LexException le) {
std::cout << le.what() << std::endl;
} catch (ParseException pe) {
std::cout << le.what() << std::endl;
}
}
在我的词法分析器中,我处理前导空格并计算这样的行:
char ch;
while (fin >> std::noskipws >> ch) {
if (ch == '\n') {
line++;
continue;
} else if (isspace(ch)) {
continue;
}
break;
}
if (ch <= 32) {
// return the "empty" token, as there's nothing grab from the file anymore
return std::make_tuple("", -500);
}
// The rest is code which builds a token
这也是事情变得奇怪的地方。
当我将此作为输入传递:()
时,它很好,并且正好产生我想要的东西。
当我传入此作为输入:(
时,我得到一个无限循环。
当我调试时,我发现(
确实是作为令牌读入的。然后我的代码通过,读取Vim插入的换行符,然后进入无限循环,因为永远不会读取EOF
。此外,我的std::cout
声明从未打印过。
为什么会这样?为什么()
可以正常使用,但(
失败?
修改:对于一个帖子but is available on my github,完整来源太大。