Код был использован для создания функционирующей программы калькулятора. Все это немного долго, так что я не буду вдаваться во все это, но вот одна порция:Зачем вам нужно что-то возвращать во входной поток?
Token Token_stream::get()
{
if (full) { // do we already have a Token ready?
full = false; // remove Token from buffer
return buffer;
}
char ch;
cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
case ';': // for “print”
case 'q': // for “quit”
case '(': case ')': case '+': case '–': case '*': case '/':
return Token{ch}; // let each character represent itself
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
cin.putback(ch); // put digit back into the input stream
double val;
cin >> val; // read a floating-point number
return Token{'8',val}; // let ‘8’ represent “a number”
}
default:
error("Bad token");
}
}
Почему бы вам нужно поместить ч назад во входной поток? Не могли бы вы просто использовать ch-вход вместо использования целой новой переменной val?
Ужасно, я все еще немного смущен. Когда вы вводите 123, только «1» будет считаться в ch? Или он будет действовать так же, как 1, вернет его, прочитает 2, вернет его обратно и т. Д. В этом случае, почему я не могу просто полностью удалить дела 0-9 и полагаться на cin >> val? – blueyfooey
@blueyfooey 'Когда вы вводите 123, только« 1 »будет считаться в ch?' Да. С этого момента он знает, что следующий токен - это число, поэтому он читается в '123'. После этого вход пропустил «123», прочитав номер. Затем он обработает все, что будет дальше. – Obicere
Хорошо, это имеет смысл. Но не будет ли еще проще использовать cin >> val в этот момент? – blueyfooey