)我的問題是我正在嘗試爲ascii文本文件編寫一個非常基本的詞法分析器,到目前爲止,它讀取和比較到我的令牌列表正確,但是我無法抓住沒有空格或按下輸入的最後一個令牌。我已經嘗試使用分隔符^ Z ASCII 26作爲另一個選擇之前,比較字符串與我的令牌列表,這失敗了。我也嘗試將f-> eof()檢查移動到比較位置下面,看看它是否會阻止它然後檢查eof標誌。我沒有運氣。是否有人可能啓發我?代碼是低於讀取方法m_TokenList只是一個字符串類型的向量當使用C++ get讀取文件時,行尾字符是什麼(char & c);?
void CelestialAnalyzer::ReadInTokens(ifstream *f){
vector<string> statement;
vector<string> tokens;
string token;
char c;
do{
f->get(c); // Read in each character
if(f->eof())
break;
if(c == '\n' || c == ' ' || c == '^Z' || c == '\r'){ // 26 ASCII ^Z (end of file marker)
for(unsigned int i=0; i<m_TokenList.size(); i++){
if(!token.compare(m_TokenList[i])){
tokens.push_back(token);
token.clear();
}
}
} else {
token.push_back(c); // Add it to the token array
}
} while (true);
f->close();
for(unsigned int i=0; i<tokens.size(); i++){
cout << "Found Token: " << tokens[i].c_str() << endl;
}
}
的m_TokenList被初始化爲
CelestialAnalyzer::CelestialAnalyzer(){
m_TokenList.push_back("KEY"); // Prints data
m_TokenList.push_back("GETINPUT"); // Grabs user data
m_TokenList.push_back("+"); // Addition/Concation
m_TokenList.push_back("-"); // Subtraction
m_TokenList.push_back("=="); // Equator
m_TokenList.push_back("="); // Assignment
m_TokenList.push_back(";"); // End statement
m_TokenList.push_back(" "); // Blank
m_TokenList.push_back("{"); // Open Grouping
m_TokenList.push_back("}"); // Close Grouping
m_TokenList.push_back("("); // Parameter opening
m_TokenList.push_back(")"); // Parameter closing
for(unsigned int i=48; i<=57; i++){
string s; s.push_back((char)i);
m_TokenList.push_back(s); s.clear();
}
}
一種用於讀取測試文件這個簡單的例子。 1 + 2 = KEY
它將註冊除'KEY'之外的所有內容,除非後面有空格或換行符。
對「^ Z是文件結尾」的評論完全錯誤。這是Windows用來表示終端輸入結束的混亂,程序將不會看到「字符標記輸入結束」(實際上,^ Z是完全有效的字符)。無論數據來自何處,操作系統都會將其結尾標記給調用者,因爲文件的長度已達到或用戶這麼說。 – vonbrand 2013-01-30 12:06:05