gpt4 book ai didi

C++ 数学分词器/解析器错误

转载 作者:行者123 更新时间:2023-11-28 00:36:37 26 4
gpt4 key购买 nike

我正在尝试用 C++ 制作一个基本的数学分词器/解析器,它从控制台获取输入然后对其进行分词(最终继续解析它)。然而,当我尝试 5 * 5 时,我遇到了一点问题:

我会得到所需的标记化值 53 -1 53 打印到控制台,但之后,我也得到了无限量的 -1(它保持打印)。有什么问题?

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;
}

最佳答案

即使在读取整个输入后,指向 std::istringstream 的指针也会计算为 true,只要它不为 null。

关于C++ 数学分词器/解析器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com