- Updated Eval runtime diagnostics, so that all stack I/O is shown during
  evaluation.
This commit is contained in:
Paul Beckingham 2014-06-24 22:15:59 -04:00
parent 1ccbb3b43a
commit f72aa7b02c

View file

@ -175,7 +175,11 @@ void Eval::compileExpression (const std::string& e)
std::string token; std::string token;
Lexer::Type type; Lexer::Type type;
while (l.token (token, type)) while (l.token (token, type))
{
if (_debug)
std::cout << "# evaluateInfixExpression token '" << token << "' " << Lexer::type_name (type) << "\n";
_compiled.push_back (std::pair <std::string, Lexer::Type> (token, type)); _compiled.push_back (std::pair <std::string, Lexer::Type> (token, type));
}
// Parse for syntax checking and operator replacement. // Parse for syntax checking and operator replacement.
if (_debug) if (_debug)
@ -242,6 +246,12 @@ void Eval::evaluatePostfixStack (
{ {
Variant right = values.back (); Variant right = values.back ();
values.pop_back (); values.pop_back ();
if (_debug)
{
std::cout << "# [" << values.size () << "] eval pop '" << (std::string) right << "' " << Lexer::type_name (token->second) << "\n";
std::cout << "# [" << values.size () << "] eval operator '" << token->first << "'\n";
std::cout << "# [" << values.size () << "] eval result push '" << (bool) !right << "' " << Lexer::type_name (token->second) << "\n";
}
values.push_back (! right); values.push_back (! right);
} }
else if (token->second == Lexer::typeOperator && else if (token->second == Lexer::typeOperator &&
@ -249,26 +259,40 @@ void Eval::evaluatePostfixStack (
{ {
Variant right = values.back (); Variant right = values.back ();
values.pop_back (); values.pop_back ();
if (_debug)
{
std::cout << "# [" << values.size () << "] eval pop '" << (std::string) right << "' " << Lexer::type_name (token->second) << "\n";
std::cout << "# [" << values.size () << "] eval operator '" << token->first << "'\n";
std::cout << "# [" << values.size () << "] eval result push '" << (bool) !right << "' " << Lexer::type_name (token->second) << "\n";
}
values.push_back (Variant (0) - right); values.push_back (Variant (0) - right);
} }
else if (token->second == Lexer::typeOperator && else if (token->second == Lexer::typeOperator &&
token->first == "_pos_") token->first == "_pos_")
{ {
// NOP? // NOP?
if (_debug)
{
std::cout << "# [" << values.size () << "] eval operator '" << token->first << "'\n";
}
} }
// Binary operators. // Binary operators.
else if (token->second == Lexer::typeOperator) else if (token->second == Lexer::typeOperator)
{ {
if (_debug)
std::cout << "# [" << values.size () << "] eval operator '" << token->first << "'\n";
Variant right = values.back (); Variant right = values.back ();
values.pop_back (); values.pop_back ();
Variant left = values.back (); Variant left = values.back ();
values.pop_back (); values.pop_back ();
if (_debug)
{
std::cout << "# [" << values.size () << "] eval pop '" << (std::string) right << "' " << Lexer::type_name (token->second) << "\n";
std::cout << "# [" << values.size () << "] eval pop '" << (std::string) left << "' " << Lexer::type_name (token->second) << "\n";
std::cout << "# [" << values.size () << "] eval operator '" << token->first << "'\n";
}
// Ordering these by anticipation frequency of use is a good idea. // Ordering these by anticipation frequency of use is a good idea.
if (token->first == "and") left = left && right; if (token->first == "and") left = left && right;
else if (token->first == "or") left = left || right; else if (token->first == "or") left = left || right;
@ -296,6 +320,8 @@ void Eval::evaluatePostfixStack (
else else
std::cout << "# Unrecognized operator '" << token->first << "'\n"; std::cout << "# Unrecognized operator '" << token->first << "'\n";
if (_debug)
std::cout << "# [" << values.size () << "] eval result push '" << (std::string) left << "' " << Lexer::type_name (token->second) << "\n";
values.push_back (left); values.push_back (left);
} }
@ -315,6 +341,7 @@ void Eval::evaluatePostfixStack (
break; break;
case Lexer::typeOperator: case Lexer::typeOperator:
if (_debug)
std::cout << "# Error: operator unexpected.\n"; std::cout << "# Error: operator unexpected.\n";
break; break;
@ -357,9 +384,9 @@ void Eval::evaluatePostfixStack (
break; break;
} }
values.push_back (v);
if (_debug) if (_debug)
std::cout << "# [" << values.size () << "] eval push '" << (std::string) v << "' " << Lexer::type_name (token->second) << "\n"; std::cout << "# [" << values.size () << "] eval push '" << (std::string) v << "' " << Lexer::type_name (token->second) << "\n";
values.push_back (v);
} }
} }