Save 13 lines in lexer.cpp and remove the longlex boolean variable.
This commit is contained in:
parent
9d36279f95
commit
e8c633d545
|
@ -12,64 +12,51 @@ tok::type getIdentifierCharType(const char& Char) {
|
|||
vector<tok> lex(const string& in)
|
||||
{
|
||||
vector<tok> resVal;
|
||||
bool longLex = false;
|
||||
pair<tok::type, string> 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;
|
||||
|
|
Loading…
Reference in New Issue