#include <regex>
#include <iostream>
using namespace std;
// types of operators
enum class opType: char { unary, lasso, rasso, none };
// operator descriptors
struct opDesc {
string symbol;
opType type;
char priority;
// partial order comparison
bool operator< (const opDesc& a) const
{
// unary operators first
if (symbol == a.symbol) return type < a.type;
return symbol < a.symbol;
}
// comparison with strings
static bool comp_desc_str (const opDesc& a, const string& s)
{
return a.symbol < s;
}
static bool comp_str_desc (const string& s, const opDesc& a)
{
return s < a.symbol;
}
// display
friend ostream& operator<<(ostream& os, const opDesc& op);
};
ostream& operator<<(ostream& os, const opDesc& op)
{
os << op.symbol << "[" << (int)op.type << ":" << (int)op.priority << "]";
return os;
}
static opDesc op_descriptors[] = {
{ "+" , opType::unary, 8 }, // unary +
{ "-" , opType::unary, 8 }, // unary -
{ "~" , opType::unary, 8 }, // bitwise not
{ "**", opType::rasso, 7 }, // power
{ "*" , opType::lasso, 6 }, // multiplication
{ "/" , opType::lasso, 6 }, // division
{ "%" , opType::lasso, 6 }, // remainder
{ "+" , opType::lasso, 5 }, // addition
{ "-" , opType::lasso, 5 }, // substraction
{ "<<", opType::lasso, 4 }, // left shift
{ ">>", opType::lasso, 4 }, // right shift
{ "&" , opType::lasso, 3 }, // bitwise and
{ "^" , opType::lasso, 2 }, // bitwise xor
{ "|" , opType::lasso, 1 }, // bitwise or
{ "(" , opType::none , 0 }, // braces
{ ")" , opType::none , 0 }
};
int main(void)
{
// sort descriptors by value and type
sort(begin(op_descriptors), end(op_descriptors));
// do some searches
string patterns[] = { "+", "-", ">>", "**" };
for (string s : patterns)
{
pair<opDesc*, opDesc*> ops;
// this won't work
/*
ops = equal_range(
std::begin(op_descriptors),
std::end (op_descriptors),
s,
opDesc::comp_desc_str or opDesc::comp_str_desc);
*/
// this works
ops.first = lower_bound(
std::begin(op_descriptors),
std::end (op_descriptors),
s, opDesc::comp_desc_str);
ops.second = upper_bound(
std::begin(op_descriptors),
std::end (op_descriptors),
s, opDesc::comp_str_desc);
cout << s <<": "<< ops.first[0] << ops.second[-1] << endl;
}
}
I2luY2x1ZGUgPHJlZ2V4PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gdHlwZXMgb2Ygb3BlcmF0b3JzCmVudW0gY2xhc3Mgb3BUeXBlOiBjaGFyIHsgdW5hcnksIGxhc3NvLCByYXNzbywgbm9uZSB9OwoKLy8gb3BlcmF0b3IgZGVzY3JpcHRvcnMKc3RydWN0IG9wRGVzYyB7CglzdHJpbmcgc3ltYm9sOwoJb3BUeXBlIHR5cGU7CgljaGFyICAgcHJpb3JpdHk7CgoJLy8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uCglib29sIG9wZXJhdG9yPCAoY29uc3Qgb3BEZXNjJiBhKSBjb25zdAoJewoJCS8vIHVuYXJ5IG9wZXJhdG9ycyBmaXJzdAoJCWlmIChzeW1ib2wgPT0gYS5zeW1ib2wpIHJldHVybiB0eXBlIDwgYS50eXBlOwoJCXJldHVybiBzeW1ib2wgPCBhLnN5bWJvbDsKCX0KCgkvLyBjb21wYXJpc29uIHdpdGggc3RyaW5ncwoJc3RhdGljIGJvb2wgY29tcF9kZXNjX3N0ciAoY29uc3Qgb3BEZXNjJiBhLCBjb25zdCBzdHJpbmcmIHMpCgl7CgkJcmV0dXJuIGEuc3ltYm9sIDwgczsKCX0KCXN0YXRpYyBib29sIGNvbXBfc3RyX2Rlc2MgKGNvbnN0IHN0cmluZyYgcywgY29uc3Qgb3BEZXNjJiBhKQoJewoJCXJldHVybiBzIDwgYS5zeW1ib2w7Cgl9CgoJLy8gZGlzcGxheQoJZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IG9wRGVzYyYgb3ApOwp9OwoKb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3Qgb3BEZXNjJiBvcCkKewogICAgb3MgPDwgb3Auc3ltYm9sIDw8ICJbIiA8PCAoaW50KW9wLnR5cGUgPDwgIjoiIDw8IChpbnQpb3AucHJpb3JpdHkgPDwgIl0iOwogICAgcmV0dXJuIG9zOwp9CgpzdGF0aWMgb3BEZXNjIG9wX2Rlc2NyaXB0b3JzW10gPSB7Cgl7ICIrIiAsIG9wVHlwZTo6dW5hcnksIDggfSwgLy8gdW5hcnkgKwoJeyAiLSIgLCBvcFR5cGU6OnVuYXJ5LCA4IH0sIC8vIHVuYXJ5IC0KCXsgIn4iICwgb3BUeXBlOjp1bmFyeSwgOCB9LCAvLyBiaXR3aXNlIG5vdAoJeyAiKioiLCBvcFR5cGU6OnJhc3NvLCA3IH0sIC8vIHBvd2VyCgl7ICIqIiAsIG9wVHlwZTo6bGFzc28sIDYgfSwgLy8gbXVsdGlwbGljYXRpb24KCXsgIi8iICwgb3BUeXBlOjpsYXNzbywgNiB9LCAvLyBkaXZpc2lvbgoJeyAiJSIgLCBvcFR5cGU6Omxhc3NvLCA2IH0sIC8vIHJlbWFpbmRlcgoJeyAiKyIgLCBvcFR5cGU6Omxhc3NvLCA1IH0sIC8vIGFkZGl0aW9uCgl7ICItIiAsIG9wVHlwZTo6bGFzc28sIDUgfSwgLy8gc3Vic3RyYWN0aW9uCgl7ICI8PCIsIG9wVHlwZTo6bGFzc28sIDQgfSwgLy8gbGVmdCBzaGlmdAoJeyAiPj4iLCBvcFR5cGU6Omxhc3NvLCA0IH0sIC8vIHJpZ2h0IHNoaWZ0Cgl7ICImIiAsIG9wVHlwZTo6bGFzc28sIDMgfSwgLy8gYml0d2lzZSBhbmQKCXsgIl4iICwgb3BUeXBlOjpsYXNzbywgMiB9LCAvLyBiaXR3aXNlIHhvcgoJeyAifCIgLCBvcFR5cGU6Omxhc3NvLCAxIH0sIC8vIGJpdHdpc2Ugb3IgCgl7ICIoIiAsIG9wVHlwZTo6bm9uZSAsIDAgfSwgLy8gYnJhY2VzCgl7ICIpIiAsIG9wVHlwZTo6bm9uZSAsIDAgfQp9OwoKaW50IG1haW4odm9pZCkKewoJLy8gc29ydCBkZXNjcmlwdG9ycyBieSB2YWx1ZSBhbmQgdHlwZQoJc29ydChiZWdpbihvcF9kZXNjcmlwdG9ycyksIGVuZChvcF9kZXNjcmlwdG9ycykpOwoKCS8vIGRvIHNvbWUgc2VhcmNoZXMKCXN0cmluZyBwYXR0ZXJuc1tdID0geyAiKyIsICItIiwgIj4+IiwgIioqIiB9OwoKCWZvciAoc3RyaW5nIHMgOiBwYXR0ZXJucykKCXsKCQlwYWlyPG9wRGVzYyosIG9wRGVzYyo+IG9wczsKCQkvLyB0aGlzIHdvbid0IHdvcmsKCQkvKgoJCW9wcyA9IGVxdWFsX3JhbmdlKAoJCQlzdGQ6OmJlZ2luKG9wX2Rlc2NyaXB0b3JzKSwgCgkJCXN0ZDo6ZW5kICAob3BfZGVzY3JpcHRvcnMpLCAKCQkJcywKCQkJb3BEZXNjOjpjb21wX2Rlc2Nfc3RyIG9yIG9wRGVzYzo6Y29tcF9zdHJfZGVzYyk7CiAgICAgICAgKi8KCQkvLyB0aGlzIHdvcmtzCgkJb3BzLmZpcnN0ID0gbG93ZXJfYm91bmQoCgkJCXN0ZDo6YmVnaW4ob3BfZGVzY3JpcHRvcnMpLCAKCQkJc3RkOjplbmQgIChvcF9kZXNjcmlwdG9ycyksIAoJCQlzLCBvcERlc2M6OmNvbXBfZGVzY19zdHIpOwoJCW9wcy5zZWNvbmQgPSB1cHBlcl9ib3VuZCgKCQkJc3RkOjpiZWdpbihvcF9kZXNjcmlwdG9ycyksIAoJCQlzdGQ6OmVuZCAgKG9wX2Rlc2NyaXB0b3JzKSwgCgkJCXMsIG9wRGVzYzo6Y29tcF9zdHJfZGVzYyk7CgkJY291dCA8PCBzIDw8IjogIjw8IG9wcy5maXJzdFswXSA8PCBvcHMuc2Vjb25kWy0xXSA8PCBlbmRsOwoJfQp9