提高编译器中std :: string的效率

时间:2013-10-26 20:09:08

标签: c++ performance stdin tokenize lexical-analysis

我正在尝试为 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);
  ...
  ...

1 个答案:

答案 0 :(得分:1)

您可能想要考虑的几件事情:

in += " " + build;

非常低效,可能不希望你想要在那个循环中,但这似乎不是你遇到问题的地方。 (至少,要了解输入的大小,然后再in.reserve(size)

更好的扫描仪设计可能是将输入文件包装为istream_iterator<Token>的类,并为令牌实现适当的operator>>。如果你真的想要它在矢量中,你可以做vector<Token> v(istream_iterator<Token>(cin), istream_iterator<Token>());之类的事情并完成它。然后,您的operator>>会在返回之前吞下注释并填充令牌。