-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLexer.cpp
More file actions
74 lines (64 loc) · 1.8 KB
/
Lexer.cpp
File metadata and controls
74 lines (64 loc) · 1.8 KB
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
#include "Lexer.h"
bool IsDigitCharacter(char Input) {
return isdigit(Input) || Input == '.';
}
int Lexer::GetToken() {
while (isspace(LastChar))
LastChar = getc(In);
if (isalpha(LastChar)) {
IdVal = (char) LastChar;
LastChar = getc(In);
while (isalnum(LastChar)) {
IdVal += (char) LastChar;
LastChar = getc(In);
}
if (IdVal == "func")
return t_func;
else if (IdVal == "native")
return t_native;
else if (IdVal == "when")
return t_when;
else if (IdVal == "then")
return t_then;
else if (IdVal == "otherwise")
return t_otherwise;
else if (IdVal == "while")
return t_while;
else if (IdVal == "let")
return t_let;
else if (IdVal == "in")
return t_in;
else if (IdVal == "step")
return t_step;
else if (IdVal == "do")
return t_do;
else if (IdVal == "unary")
return t_unary;
else if (IdVal == "binary")
return t_binary;
else if (IdVal == "operator")
return t_operator;
else return t_id;
}
if (IsDigitCharacter(LastChar)) {
std::string Num;
do {
Num += (char) LastChar;
LastChar = getc(In);
} while (IsDigitCharacter(LastChar));
NumVal = strtod(Num.c_str(), nullptr);
return t_num;
}
if (LastChar == '#') {
do {
LastChar = getc(In);
} while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');
if (LastChar != EOF)
return GetToken();
}
if (LastChar == EOF)
return t_eof;
int Current = LastChar;
LastChar = getc(In);
return Current;
}