tokenscanner.h接口
界面中的许多方法用于启用更改扫描仪默认行为的选项。例如,我们可以通过初始化像这样的token扫描器忽略输入流中的所有空格:
TokenScanner scanner
scanner
.ignoreWhitespace()
接下来我们的目的是实现下面的一些功能:
方法作用
构造函数TokenScanner() TokenScanner(str) TokenScanner(infile)初始化扫描仪对象。 token的源码从指定的字符串或输入文件初始化。如果没有提供token源,则必须在从扫描仪读取令牌之前调用setInput读取token的方法hasMoreTokens()返回true,如果还有其他更多的token未被读取nextToken()从扫描仪返回下一个token。 如果在没有token可用的情况下调用nextToken,则返回空字符串。saveToken(token)将指定的token保存为扫描仪内部状态的一部分,以便在下次调用nextToken时返回。控制扫描器的方法ignoreWhitespace()告诉扫描仪扫描的时候忽略空格字符
实现简单的token扫描器
TokenScanner.h
#ifndef _TokenScanner_h
#define _TokenScanner_h
#include <string>
class TokenScanner{
public:
TokenScanner();
TokenScanner(std::
string str);
void setInput(std::
string str);
bool hasMoreTokens();
std::
string nextToken();
void ignoreWhitespace();
#include
"tokenscannerpriv.h"
};
#endif
TokenScannerpriv.h
private:
std::
string buffer;
int cp;
bool ignoreWhitespaceFlag;
void skipWhitespace();
TokenScanner.cpp
#include <cctype>
#include <string>
#include "TokenScanner.h"
using namespace std;
TokenScanner::TokenScanner(){
}
TokenScanner::TokenScanner(
string str){
setInput(str);
}
void TokenScanner::setInput(
string str){
buffer = str;
cp =
0;
}
bool TokenScanner::hasMoreTokens() {
if (ignoreWhitespaceFlag) skipWhitespace();
return cp < buffer.length();
}
string TokenScanner::nextToken() {
if (ignoreWhitespaceFlag) skipWhitespace();
if (cp >= buffer.length()) {
return "";
}
else if (
isalnum(buffer[cp])) {
int start = cp;
while (cp < buffer.length() &&
isalnum(buffer[cp])) {
cp++;
}
return buffer.substr(start, cp - start);
}
else {
return string(
1, buffer[cp++]);
}
}
void TokenScanner::ignoreWhitespace() {
ignoreWhitespaceFlag =
true;
}
void TokenScanner::skipWhitespace() {
while (cp < buffer.length() &&
isspace(buffer[cp])) {
cp++;
}
}
测试文件
#include <iostream>
#include <string>
#include "TokenScanner.h"
using namespace std;
int main(){
string line;
getline(
cin,line);
TokenScanner scanner(line);
for(
int i =
0;i <= line.length();i++){
string str = scanner.nextToken();
cout << str << endl;
}
return 0;
}
测试结果
自此,面向对象暂时告一段落,以后会提到虚函数之类的