mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-09-05 04:57:21 +02:00
Eval
- Updated Eval runtime diagnostics, so that all stack I/O is shown during evaluation.
This commit is contained in:
parent
1ccbb3b43a
commit
f72aa7b02c
1 changed files with 32 additions and 5 deletions
35
src/Eval.cpp
35
src/Eval.cpp
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue