NSing9
asked on
How do I check for a missing character and throw an exception if the character is not in the string?
How do I check for a missing character and throw an exception if the character is not in the string? I have a program where i enter an expression and I want it to display and error if the end of the expression is missing a ';'
ex. (x+2), x=2
This should throw an exception when I click enter because it is missing the ';' at the end of the expression. ie. (x+2), x=2;
I have tried to account for the missing ';' in a for loop, such as:
if (cin.peek() != ';')
{
throw SyntaxException();
}
but, my exception is thrown even on valid expressions that have a ';' at the end. I assume that it is because even on valid expressions that end with ';', once enter is clicked, the next character will never be ';' which is what peek() is looking for.
ex. (x+2), x=2
This should throw an exception when I click enter because it is missing the ';' at the end of the expression. ie. (x+2), x=2;
I have tried to account for the missing ';' in a for loop, such as:
if (cin.peek() != ';')
{
throw SyntaxException();
}
but, my exception is thrown even on valid expressions that have a ';' at the end. I assume that it is because even on valid expressions that end with ';', once enter is clicked, the next character will never be ';' which is what peek() is looking for.
ASKER
I think this might work. I am entering the input from the console and it is being stored as an expression. I have to try to figure out how to convert the expression to a string?
How are you reading the epresson?
ASKER
cout << "Enter expression: ";
The expression is entered from the keyboard when this statement is run. Below is the main function that I have:
int main()
{
Expression* expression;
char paren, comma;
cout << "Enter expression: ";
cin >> paren;
try
{
if (cin.peek() == '(') //mistmatch left paren exception
{
throw SyntaxException();
}
expression = SubExpression::parse();
if (cin.peek() == ')') //mistmatch right paren exception
{
throw SyntaxException();
}
if (cin.peek() != ',') //missing comma exception
{
throw SyntaxException();
}
cin >> comma;
parseAssignments();
double result = expression->evaluate();
cout << "Value = " << result << endl;
}
catch (DivideByZeroException ÷ByZeroException)
{
cout << "Error: " << divideByZeroException.what () << endl;
}
catch (UninitializedException &uninitializedException)
{
cout << "Error: " << uninitializedException.wha t() << endl;
}
catch (SyntaxException &syntaxException)
{
cout << "Error: " << syntaxException.what() << endl;
}
return 0;
}
The expression is entered from the keyboard when this statement is run. Below is the main function that I have:
int main()
{
Expression* expression;
char paren, comma;
cout << "Enter expression: ";
cin >> paren;
try
{
if (cin.peek() == '(') //mistmatch left paren exception
{
throw SyntaxException();
}
expression = SubExpression::parse();
if (cin.peek() == ')') //mistmatch right paren exception
{
throw SyntaxException();
}
if (cin.peek() != ',') //missing comma exception
{
throw SyntaxException();
}
cin >> comma;
parseAssignments();
double result = expression->evaluate();
cout << "Value = " << result << endl;
}
catch (DivideByZeroException ÷ByZeroException)
{
cout << "Error: " << divideByZeroException.what
}
catch (UninitializedException &uninitializedException)
{
cout << "Error: " << uninitializedException.wha
}
catch (SyntaxException &syntaxException)
{
cout << "Error: " << syntaxException.what() << endl;
}
return 0;
}
You could then just read a complete line and replace 'cin' by a stringstream, e.g.
#include <sstream>
using namepace std;
// ...
int main()
{
Expression* expression;
stringstream ss;
string sLine;
char paren, comma;
cout << "Enter expression: ";
ss >> paren;
try
{
getline(cin,sLine);
for (string::reverse_iterator ri = sLine.rbegin(); ri != sLine.rend(); ++ri)
{
if (*ri == ' ') continue; // skip whitespace
if (*ri != ';') throw SyntaxException();
else break; // found semicolon, all is fine
}
ss.str(sLine.c_str());
if (ss.peek() == '(') //mistmatch left paren exception
{
throw SyntaxException();
}
expression = SubExpression::parse();
if (ss.peek() == ')') //mistmatch right paren exception
{
throw SyntaxException();
}
if (ss.peek() != ',') //missing comma exception
{
throw SyntaxException();
}
ss >> comma;
parseAssignments();
double result = expression->evaluate();
cout << "Value = " << result << endl;
}
catch (DivideByZeroException ÷ByZeroException)
{
cout << "Error: " << divideByZeroException.what() << endl;
}
catch (UninitializedException &uninitializedException)
{
cout << "Error: " << uninitializedException.what() << endl;
}
catch (SyntaxException &syntaxException)
{
cout << "Error: " << syntaxException.what() << endl;
}
return 0;
}
ASKER
I get a fatal error when I try to modfy it this way:
fatal error LNK1104: cannot open file 'C:\Documents and Settings......
fatal error LNK1104: cannot open file 'C:\Documents and Settings......
ASKER
My apologies. I fixed the fatal error, but it appears that it throws the exception now when ';' is missing from the end of the expression, but it's not evaluating the expression and displaying the value as it did before when there is a correctly placed ';' at the end of the expression.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I'm still having the same problem. Does the fact that after I enter an expression such as:
(x+2), x=2;
I am immediately clicking <enter> after keying in the ';' at the end of the expression. This is a valid expression and should display results but it does nothing after clicking <enter>. It works correctly without making the modifications but then it doesn't throw the exception for the missing semicolon.
(x+2), x=2;
I am immediately clicking <enter> after keying in the ';' at the end of the expression. This is a valid expression and should display results but it does nothing after clicking <enter>. It works correctly without making the modifications but then it doesn't throw the exception for the missing semicolon.
That's weird, when I strip down the code to have a test, it seems to work. Can you step through the modified code to see where it stops working?
ASKER
There is another method that follows the main class that I didn't provide initially. It is as follows:
void parseAssignments()
{
char assignop, delimiter;
string variable;
double value;
do
{
variable = parseName();
cin >> ws >> assignop >> value >> delimiter;
symbolTable.insert(variabl e, value);
}
while (delimiter == ',');
}
I'm not sure if or where this would affect the modifications, but I have tired it changed cin to ss and just leaving it as is, but I still get the same result.
void parseAssignments()
{
char assignop, delimiter;
string variable;
double value;
do
{
variable = parseName();
cin >> ws >> assignop >> value >> delimiter;
symbolTable.insert(variabl
}
while (delimiter == ',');
}
I'm not sure if or where this would affect the modifications, but I have tired it changed cin to ss and just leaving it as is, but I still get the same result.
ASKER
Still couldn't get it to work.
Open in new window