我的问题是我正在尝试为ascii文本文件编写一个非常基本的词法分析器。到目前为止,它正确地读取和比较我的令牌列表,但是我无法在没有空格或按回车的情况下抓取最终令牌。在将字符串与我的令牌列表进行比较之前,我尝试使用分隔符^ Z ASCII 26作为另一个选择。这无效。我还尝试将f-> eof()检查移动到比较位置下方以查看它是否会阻止它然后检查eof标志。我没有运气。有谁可能开导我?下面的代码用于读取方法。 m_TokenList只是一个string类型的向量。
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”以外的所有内容。答案 0 :(得分:2)
你为什么不删除:
if(f->eof())
break;
并使用
if(f->eof() || c == '\n' || c == ' ' || c == '^Z' || c == '\r'){
或者,您可以在中断循环后检查令牌是否为非空,并在这种情况下添加它。
答案 1 :(得分:0)
双重'新线'怎么样?据我所知,在几个信使协议中,\ n \ n \ n \ r \ n与消息的结尾有关。我觉得这很合理。 :)