C ++ Math Tokenizer / Parser Error

时间:2013-12-17 17:04:57

标签: c++ math infinite-loop tokenize

我正在尝试在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;
}

2 个答案:

答案 0 :(得分:2)

即使在读取整个输入之后,指向std::istringstream的指针也将评估为true,只要它不为空即可。

答案 1 :(得分:1)

tokenizer::getTokens()中的循环条件将始终在代码中评估为true。您可以尝试将while(input)更改为while(input->good())