- Implemented the shell of E9::eval.
- Stubbed out operator_xxx helper methods.
This commit is contained in:
Paul Beckingham 2011-07-25 22:59:47 -04:00
parent b1048ddfa3
commit 83c0ea6ab2
5 changed files with 298 additions and 20 deletions

View file

@ -27,6 +27,7 @@
#include <iostream> // TODO Remove.
#include <Context.h>
#include <A3.h>
#include <E9.h>
extern Context context;
@ -49,15 +50,277 @@ bool E9::evalFilter (const Task& task)
if (_args.size () == 0)
return true;
std::vector <Arg> value_stack;
eval (task, value_stack);
// TODO Coerce result to Boolean.
return true;
}
////////////////////////////////////////////////////////////////////////////////
std::string evalExpression (const Task& task)
std::string E9::evalExpression (const Task& task)
{
if (_args.size () == 0)
return "";
return "";
std::vector <Arg> value_stack;
eval (task, value_stack);
return value_stack.back ()._raw;
}
////////////////////////////////////////////////////////////////////////////////
void E9::eval (const Task& task, std::vector <Arg>& value_stack)
{
// Case sensitivity is configurable.
bool case_sensitive = context.config.getBoolean ("search.case.sensitive");
std::vector <Arg>::iterator arg;
for (arg = _args.begin (); arg != _args.end (); ++arg)
{
if (arg->_category == "op")
{
Arg result;
// Unary operators.
if (arg->_raw == "!")
{
Arg right = value_stack.back ();
value_stack.pop_back ();
operator_not (result, right);
}
// Binary operators.
else
{
Arg right = value_stack.back ();
value_stack.pop_back ();
Arg left = value_stack.back ();
value_stack.pop_back ();
if (arg->_raw == "and") operator_and (result, left, right);
else if (arg->_raw == "or") operator_or (result, left, right);
else if (arg->_raw == "xor") operator_xor (result, left, right);
else if (arg->_raw == "<") operator_lt (result, left, right);
else if (arg->_raw == "<=") operator_lte (result, left, right);
else if (arg->_raw == ">=") operator_gte (result, left, right);
else if (arg->_raw == ">") operator_gt (result, left, right);
else if (arg->_raw == "!=") operator_inequal (result, left, right);
else if (arg->_raw == "=") operator_equal (result, left, right);
else if (arg->_raw == "~") operator_match (result, left, right);
else if (arg->_raw == "!~") operator_nomatch (result, left, right);
else if (arg->_raw == "*") operator_multiply (result, left, right);
else if (arg->_raw == "/") operator_divide (result, left, right);
else if (arg->_raw == "+") operator_add (result, left, right);
else if (arg->_raw == "-") operator_subtract (result, left, right);
else
throw std::string ("Unsupported operator '") + arg->_raw + "'.";
}
// Store the result.
value_stack.push_back (result);
}
// Operand.
else
{
value_stack.push_back (*arg);
}
}
// Check for stack remnants.
if (value_stack.size () != 1)
throw std::string ("Error: Expression::eval found extra items on the stack.");
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_not (Arg& result, Arg& left)
{
std::cout << "# not " << left._raw << "/" << left._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_and (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " and "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_or (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " or "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_xor (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " xor "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_lt (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " < "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_lte (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " <= "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_gte (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " >= "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_gt (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " > "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_inequal (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " != "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_equal (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " = "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_match (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " ~ "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_nomatch (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " !~ "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_multiply (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " * "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_divide (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " / "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_add (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " + "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////
void E9::operator_subtract (Arg& result, Arg& left, Arg& right)
{
std::cout << "# " << left._raw << "/" << left._category
<< " - "
<< right._raw << "/" << right._category
<< " --> "
<< result._raw << "/" << result._category
<< "\n";
}
////////////////////////////////////////////////////////////////////////////////