http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Chapter 7 // Exercise 5
5. Modify Token_stream::get() to return Token(print) when it sees a new line. This implies looking for whitespace characters and treating newline ('\n') specifically.You might find the standard library function isspace(ch), which returns true is ch is a whitespace character useful.
This stumped me a little until I did some research and found that cin >> skips whitespace. I know it was already in the comments but my brain clearly wasn't working properly. A quick search showed that cin.get() doesn't skip whitespace allowing you to check for special characters such as '\n'.
I simply changed the char print to '\n' and then added a while loop in get() which checks to see if there is any whitespace in the buffer. If there is it checks to see if that whitespace is a newline, if it is it returns the command to print, if not it gets the next char in the buffer as we still need to check for spaces inbetween naming.
I simply changed the char print to '\n' and then added a while loop in get() which checks to see if there is any whitespace in the buffer. If there is it checks to see if that whitespace is a newline, if it is it returns the command to print, if not it gets the next char in the buffer as we still need to check for spaces inbetween naming.
//evaluate each char in the stream and determine what it is
Token Token_stream::get()
{
if (full) //check if we have already have a token ready
{
full = false;
return buffer;
}
char ch;
cin.get(ch); //does not skip whitespace
while (isspace(ch)) //if ch is whitespace
{
if(ch == '\n') //if ch == newline
return Token(print); //print result
cin.get(ch); //if not newline get next ch in stream
}
switch (ch)
{
case '(': case ')': case '+': case '-':
case '*': case '/': case '%':
case '=': case ',':
return Token(ch); //let each char represent itself
case '.':
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
cin.unget(); //put digit back into the input stream
double val;
cin >> val; //read a floating-point number
return Token{ number, val }; //return number or . with a value, put back into buffer
}
//allo user defined variables if user types #
case '#':
return Token(let);
default:
//do this if ch is a letter
if (isalpha(ch) || ch == '_')
{
string s;
s += ch;
//while there are still chars in cin, read them into s
while (cin.get(ch) && (isalpha(ch) || isdigit(ch) || ch == '_'))
s += ch;
cin.unget();
//if string is equal to other commands defined below, return them
if (s == declKey)
return Token(let);
if(s == constKey)
return Token(isConst);
if (s == quitKey)
return Token(quit);
if (s == sqrtKey)
return Token(squareR);
if (s == powKey)
return Token(findPow);
return Token(name, s);
}
//if the char does not fit any of these paramenters return an error message
error("Bad token");
}
}
No comments:
Post a Comment