0

我正在尝试为类C语言的编译器构建扫描仪,并且正在寻找一种生成令牌的有效方法......我有一个扫描功能:

vector<Token> scan(string &input);

还有一个 main 函数,它读入一个词法正确的文件并删除注释。(语言不支持/* , */评论)我正在使用具有最大咀嚼能力的 DFA 来生成令牌......而且我很确定扫描仪的一部分是相当有效的。然而,扫描仪不能很好地处理大文件,因为它们都以一个字符串结尾......并且文件的 1000 行与第 1001 行的所有连接都破坏了扫描仪。不幸的是,我的 FSM 无法处理注释,因为它们被允许包含任何 Unicode 和其他奇数字符。我想知道......有没有更好的方法从标准输入中的文件到标记向量,请记住函数扫描必须采用单个字符串并返回单个向量,并且所有标记都必须在扫描结束时的单个向量...无论如何,这是“扫描”的代码:请不要太嘲笑我的坏主意:)

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);
  ...
  ...
4

1 回答 1

1

您可能需要考虑的几件事:

in += " " + build;

效率非常低,可能不希望你在那个循环中,但这似乎不是你遇到问题的地方。(至少,对输入的大小有所了解,并in.reserve(size)在此之前做。

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

于 2013-10-26T20:40:15.817 回答