-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexer.cpp
78 lines (64 loc) · 1.71 KB
/
lexer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "lexer.hpp"
void skippWhiteSpace(csi& si, const csi& end) {
while(si < end && (*si) == ' ') {
si++;
}
}
std::string strFromPtr(csi begin, size_t length) {
std::ostringstream oss;
for (auto si = begin; si < begin + length; si++) {
oss << *si;
}
return oss.str();
}
Token Tokenizer::consumeString (csi& si) const {
si++;
auto tok = consumeToToken(si, TokenType::STRING, [](char c){
return c != '"';
});
si++;
if (si == source.end()) {
exit(-12); // String not ended.
}
return tok;
}
TokenList Tokenizer::tokenize() const {
TokenList tl;
auto si = source.cbegin();
const auto begin = source.cbegin();
const auto end = source.cend();
while (si < end) {
if (*si == ' ' || *si == '\n') {
si++;
continue;
}
if (*si == '(') {
tl.push_back(Token(TokenType::OPENING_PARREN,
"(",
static_cast<int>(si - begin)));
si++;
continue;
}
if (*si == ')') {
tl.push_back(Token(TokenType::CLOSING_PARREN,
")",
static_cast<int>(si - begin)));
si++;
continue;
}
if (*si == '"') {
tl.push_back(consumeString(si));
continue;
}
if(isNumeric(*si)) {
tl.push_back(consumeToToken(si, TokenType::NUMERIC, isNumeric));
continue;
}
if(isWordy(*si)) {
tl.push_back(consumeToToken(si, TokenType::KEY_WORD, isWordy));
continue;
}
si++;
}
return tl;
}