我正在尝试在C ++中创建一个基本的数学标记器/解析器,它从控制台获取输入然后对其进行标记(最后继续解析它)。但是,当我尝试5 * 5
时,我遇到了一些问题:
我会将所需的标记化值53 -1 53
打印到控制台,但之后,我也获得了无限量的-1
s(它保持打印)。有什么问题?
的main.cpp
#include <iostream>
#include <sstream>
#include "tokenizer.h"
int main(void){
std::cout << "Please enter a mathematical expression" << std::endl;
std::string line;
std::getline(std::cin, line);
std::istringstream input(line);
tokenizer t;
std::vector<token> tokens(t.getTokens(&input));
}
tokenizer.h
#include <vector>
#include <sstream>
#include "tokens.h"
class tokenizer{
public:
std::vector<token> getTokens(std::istringstream* input);
};
tokens.h
typedef const signed int token;
enum tokens{
mul = -1,
mDiv = -2,
add = -3,
sub = -4,
mPow = -5,
lparen = -6,
rparen = -7,
decpoint = -8
};
tokenizer.cpp
#include "tokenizer.h"
#include <iostream>
token getToken(int tok);
std::vector<token> tokenizer::getTokens(std::istringstream* input){
std::vector<token> tokens;
while(input){
int t = input->get();
if(!isspace(t)){
std::cout << getToken(t) << " "; // I added this line to see the values being added
tokens.push_back(getToken(t));
}
}
return tokens;
}
token getToken(int tok){
switch((char)tok){
case '*':
return tokens::mul;
case '/':
return tokens::mDiv;
case '+':
return tokens::add;
case '-':
return tokens::sub;
case '^':
return tokens::mPow;
case '(':
return tokens::lparen;
case ')':
return tokens::rparen;
case '.':
return tokens::decpoint;
}
return tok;
}
答案 0 :(得分:2)
即使在读取整个输入之后,指向std::istringstream
的指针也将评估为true,只要它不为空即可。
答案 1 :(得分:1)
tokenizer::getTokens()
中的循环条件将始终在代码中评估为true。您可以尝试将while(input)
更改为while(input->good())
。