我正在尝试为 C 类似语言的编译器构建一个扫描程序,并且我正在抓住一个有效的方法来生成令牌......我有一个扫描功能:
vector<Token> scan(string &input);
还有一个main函数,它读入一个词法正确的文件并删除注释。 (该语言不支持/* , */
条评论)我正在使用带有最大咀嚼的DFA来生成令牌......我非常确定扫描仪的一部分是合理有效的。然而,扫描程序不能很好地处理大文件,因为它们都以一个字符串结尾......并且所有1000行文件与行1001的串联都会破坏扫描程序。不幸的是,我的FSM无法处理注释,因为它们可以包含任何Unicode和其他奇数字符。我想知道...有没有更好的方法从stdin中的文件转到标记向量,请记住函数扫描必须采用单个字符串,并返回单个向量,并且所有标记必须在扫描结束时的单个向量...无论如何,这里是“扫描”的代码:请不要嘲笑我的坏主意:)
string in = "";
string build;
while(true)
{
getline(cin, build);
if( cin.eof() )
break;
if(build.find ("//") != string::npos)
build = build.substr(0, build.find("//",0));
in += " " + build;
}
try {
vector<Token> wlpp = scan(in);
...
...
答案 0 :(得分:1)
您可能想要考虑的几件事情:
in += " " + build;
非常低效,可能不希望你想要在那个循环中,但这似乎不是你遇到问题的地方。 (至少,要了解输入的大小,然后再in.reserve(size)
。
更好的扫描仪设计可能是将输入文件包装为istream_iterator<Token>
的类,并为令牌实现适当的operator>>
。如果你真的想要它在矢量中,你可以做vector<Token> v(istream_iterator<Token>(cin), istream_iterator<Token>());
之类的事情并完成它。然后,您的operator>>
会在返回之前吞下注释并填充令牌。