Yerbacon/src/etc/lexer.cpp

44 lines
1.7 KiB
C++

//
// Created by doggo on 04/02/2021.
//
#include "../headers/lex.hpp"
#include <iostream>
using namespace std;
vector<tok> resVal;
void separate() {resVal.emplace_back(tok::SEPARATOR, "");}
vector<tok> lex(const string& in)
{
for (const char& current : in) {
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 '"': resVal.emplace_back(tok::DQUOTE, "\""); break;
case ' ': case '\t': case '\r':
case '\n': separate(); break;
default: {
if (isdigit(current))
resVal.emplace_back(tok::INT, string(1, current));
else if (isalpha(current))
resVal.emplace_back(tok::ALPHACHAR, string(1, current));
else resVal.emplace_back(tok::OTHER, string(1, current));
break;
}
}
}
return resVal;
}