#include <algorithm>
#include <iostream>
#include <regex>
#include <string>
#include <utility>
#include <vector>
using namespace std;
enum POSES // Deliminators
{
EQUALS,
OPEN,
CLOSE,
SPACE,
EOL,
RETURN,
TAB,
COMMENT,
POSES_SIZE
};
int main() {
const auto input = "#Comment\n\nshow_position = { x=-9 y =78 }"s;
vector<pair<POSES, string>> tokens;
const regex re{ "\\s*(?:\n|(#[^\n]*)|(\\{)|(\\})|(=)|([^{}= \t\r\n]+))" };
for_each(sregex_iterator(cbegin(input), cend(input), re), sregex_iterator(), [&](const auto& i) {
if (i[1].length() > 0U) {
tokens.emplace_back(COMMENT, i[1]);
} else if (i[2].length() > 0U) {
tokens.emplace_back(OPEN, "{"s);
} else if (i[3].length() > 0U) {
tokens.emplace_back(CLOSE, "}"s);
} else if (i[4].length() > 0U) {
tokens.emplace_back(EQUALS, "="s);
} else if (i[5].length() > 0U) {
tokens.emplace_back(POSES_SIZE, i[5]);
}
});
for (const auto& i : tokens) {
switch (i.first) {
case EQUALS:
cout << "EQUALS: =\n";
break;
case OPEN:
cout << "OPEN: {\n";
break;
case CLOSE:
cout << "CLOSE: }\n";
break;
case COMMENT:
cout << "COMMENT: " << i.second << endl;
break;
case POSES_SIZE:
cout << "POSES_SIZE: " << i.second << endl;
}
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmVnZXg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmVudW0gUE9TRVMgLy8gRGVsaW1pbmF0b3JzCnsKCUVRVUFMUywKCU9QRU4sCglDTE9TRSwKCVNQQUNFLAoJRU9MLAoJUkVUVVJOLAoJVEFCLAoJQ09NTUVOVCwKCVBPU0VTX1NJWkUKfTsKCmludCBtYWluKCkgewoJY29uc3QgYXV0byBpbnB1dCA9ICIjQ29tbWVudFxuXG5zaG93X3Bvc2l0aW9uID0geyB4PS05IHkgPTc4IH0iczsKCXZlY3RvcjxwYWlyPFBPU0VTLCBzdHJpbmc+PiB0b2tlbnM7Cgljb25zdCByZWdleCByZXsgIlxccyooPzpcbnwoI1teXG5dKil8KFxceyl8KFxcfSl8KD0pfChbXnt9PSBcdFxyXG5dKykpIiB9OwoKCWZvcl9lYWNoKHNyZWdleF9pdGVyYXRvcihjYmVnaW4oaW5wdXQpLCBjZW5kKGlucHV0KSwgcmUpLCBzcmVnZXhfaXRlcmF0b3IoKSwgWyZdKGNvbnN0IGF1dG8mIGkpIHsKCQlpZiAoaVsxXS5sZW5ndGgoKSA+IDBVKSB7CgkJCXRva2Vucy5lbXBsYWNlX2JhY2soQ09NTUVOVCwgaVsxXSk7CgkJfSBlbHNlIGlmIChpWzJdLmxlbmd0aCgpID4gMFUpIHsKCQkJdG9rZW5zLmVtcGxhY2VfYmFjayhPUEVOLCAieyJzKTsKCQl9IGVsc2UgaWYgKGlbM10ubGVuZ3RoKCkgPiAwVSkgewoJCQl0b2tlbnMuZW1wbGFjZV9iYWNrKENMT1NFLCAifSJzKTsKCQl9IGVsc2UgaWYgKGlbNF0ubGVuZ3RoKCkgPiAwVSkgewoJCQl0b2tlbnMuZW1wbGFjZV9iYWNrKEVRVUFMUywgIj0icyk7CgkJfSBlbHNlIGlmIChpWzVdLmxlbmd0aCgpID4gMFUpIHsKCQkJdG9rZW5zLmVtcGxhY2VfYmFjayhQT1NFU19TSVpFLCBpWzVdKTsKCQl9Cgl9KTsKCglmb3IgKGNvbnN0IGF1dG8mIGkgOiB0b2tlbnMpIHsKCQlzd2l0Y2ggKGkuZmlyc3QpIHsKCQljYXNlIEVRVUFMUzoKCQkJY291dCA8PCAiRVFVQUxTOiAgICAgPVxuIjsKCQkJYnJlYWs7CgkJY2FzZSBPUEVOOgoJCQljb3V0IDw8ICJPUEVOOiAgICAgICB7XG4iOwoJCQlicmVhazsKCQljYXNlIENMT1NFOgoJCQljb3V0IDw8ICJDTE9TRTogICAgICB9XG4iOwoJCQlicmVhazsKCQljYXNlIENPTU1FTlQ6CgkJCWNvdXQgPDwgIkNPTU1FTlQ6ICAgICIgPDwgaS5zZWNvbmQgPDwgZW5kbDsKCQkJYnJlYWs7CgkJY2FzZSBQT1NFU19TSVpFOgoJCQljb3V0IDw8ICJQT1NFU19TSVpFOiAiIDw8IGkuc2Vjb25kIDw8IGVuZGw7CgkJfQoJfQp9