Save 13 lines in lexer.cpp and remove the longlex boolean variable.

This commit is contained in:
Username404-59 2021-07-06 10:11:25 +02:00
parent 9d36279f95
commit e8c633d545
Signed by: Username404-59
GPG Key ID: 7AB361FBB257A5D1
1 changed files with 37 additions and 50 deletions

View File

@ -12,64 +12,51 @@ tok::type getIdentifierCharType(const char& Char) {
vector<tok> lex(const string& in) vector<tok> lex(const string& in)
{ {
vector<tok> resVal; vector<tok> resVal;
bool longLex = false; for (unsigned int i = 0; i < in.size(); ++i) {
pair<tok::type, string> generated; const char& current = in[i];
for (const char& current : in) { switch (current) {
if (!longLex) { case '#': resVal.emplace_back(tok::TAG, "#"); break;
if (!generated.second.empty()) { case '=': resVal.emplace_back(tok::DEFINE, "="); break;
resVal.emplace_back(generated.first, generated.second); case '(': resVal.emplace_back(tok::LPAR, "("); break;
generated.second = ""; case ')': resVal.emplace_back(tok::RPAR, ")"); break;
} case '{': resVal.emplace_back(tok::LBRACE, "{"); break;
switch (current) { case '}': resVal.emplace_back(tok::RBRACE, "}"); break;
case '#': resVal.emplace_back(tok::TAG, "#"); break; case '[': resVal.emplace_back(tok::LBRACKET, "["); break;
case '=': resVal.emplace_back(tok::DEFINE, "="); break; case ']': resVal.emplace_back(tok::RBRACKET, "]"); break;
case '(': resVal.emplace_back(tok::LPAR, "("); break; case '+': resVal.emplace_back(tok::PLUS, "+"); break;
case ')': resVal.emplace_back(tok::RPAR, ")"); break; case '-': resVal.emplace_back(tok::HYPHEN, "-"); break;
case '{': resVal.emplace_back(tok::LBRACE, "{"); break; case '>': resVal.emplace_back(tok::LCOMP, ">"); break;
case '}': resVal.emplace_back(tok::RBRACE, "}"); break; case '<': resVal.emplace_back(tok::RCOMP, "<"); break;
case '[': resVal.emplace_back(tok::LBRACKET, "["); break; case '\'': resVal.emplace_back(tok::SQUOTE, "\'"); break;
case ']': resVal.emplace_back(tok::RBRACKET, "]"); break; case ' ': case '\t': case '\r':
case '+': resVal.emplace_back(tok::PLUS, "+"); break; case '\n': break;
case '-': resVal.emplace_back(tok::HYPHEN, "-"); break; default: {
case '>': resVal.emplace_back(tok::LCOMP, ">"); break; tok::type type = getIdentifierCharType(current);
case '<': resVal.emplace_back(tok::RCOMP, "<"); break; switch (type) {
case '\'': resVal.emplace_back(tok::SQUOTE, "\'"); break; case tok::UNEXPECTED: break;
case ' ': case '\t': case '\r': case tok::STRING: ++i;
case '\n': break; case tok::IDENTIFIER: case tok::NUMBER: {
default: { string formedString;
tok::type type = getIdentifierCharType(current); for (;i < in.size(); ++i) {
switch (type) { bool isString = getIdentifierCharType(in[i]) == tok::STRING;
case tok::UNEXPECTED: break; if ((getIdentifierCharType(in[i]) == type && !isString) || (type == tok::STRING && !isString)) {
case tok::IDENTIFIER: case tok::NUMBER: { formedString += string(1, in[i]);
generated.second.append(string(1, current)); } else {
resVal.emplace_back(type, formedString);
break;
}
} }
case tok::STRING: { break;
generated.first = type;
longLex = true;
break;
}
default: resVal.emplace_back(type, string(1, current));
} }
break; default: resVal.emplace_back(type, string(1, current));
} }
} break;
} else {
tok::type currentType = getIdentifierCharType(current);
switch (currentType) {
case tok::UNEXPECTED: if ((generated.first == currentType) || (generated.first == tok::STRING)) break;
case tok::STRING: {
longLex = false;
break;
}
default: generated.second.append(string(1, current)); break;
} }
} }
} }
/* Test /* Test
for (const auto& it : resVal) { for (const auto& it : resVal) {
if (it.toktype == tok::STRING) cout << '"' << it.toktext << '"' << '\n'; cout << it.toktext << ' ' << it.toktype << '\n';
if (it.toktype == tok::NUMBER) cout << it.toktext << "= number\n";
if (it.toktype == tok::IDENTIFIER) cout << it.toktext << '\n';
} }
*/ */
return resVal; return resVal;