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