2013-10-26 30 views
0

我正在嘗試構建一個類似於語言的C的編譯器的掃描器,並且正陷入一種有效的方式來生成令牌......我有一個掃描功能:在編譯器中提高std :: string的效率

vector<Token> scan(string &input); 

而且還是一個主函數,它讀入詞法正確的文件並刪除註釋。 (該語言不支持/* , */評論)我正在使用最大蒙克的DFA來生成令牌......並且我非常確定掃描程序的一部分效率相當高。但是掃描器不能很好地處理大文件,因爲它們都以一個字符串結尾......並且所有與行1001相連的1000行文件都會破壞掃描器。不幸的是,我的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

一對夫婦的事情,你可能想考慮:

in += " " + build; 

是非常低效的,可能不希望你在這個循環想要的,但似乎並沒有被在那裏你在一些問題上運行。 (起碼,得到一些想法有關您輸入的大小和之前做in.reserve(size)

您掃描儀的更好的設計可能是作爲一個包裝輸入文件作爲istream_iterator<Token>類和實施適當的operator>>令牌。如果你真的希望它在一個載體,然後你可以做這樣的事情vector<Token> v(istream_iterator<Token>(cin), istream_iterator<Token>());並用它做。然後你operator>>將剛嚥下的意見並在返回之前填充令牌。

+0

這似乎是一個很好的解決方案,但是它給了我一個使用字符串流而不是+運算符的想法,你知道如何與使用istream_iterator相比嗎? –