-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlexer.cpp
More file actions
99 lines (91 loc) · 2.91 KB
/
lexer.cpp
File metadata and controls
99 lines (91 loc) · 2.91 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "lexer.h"
void lexer_map_init(map<string, string> &l_map)
{
l_map.insert(pair<string, string>("int", "Keyword"));
l_map.insert(pair<string, string>("char", "Keyword"));
l_map.insert(pair<string, string>("return", "Keyword"));
l_map.insert(pair<string, string>("if", "Keyword"));
l_map.insert(pair<string, string>("else", "Keyword"));
l_map.insert(pair<string, string>("while", "Keyword"));
l_map.insert(pair<string, string>("break", "Keyword"));
l_map.insert(pair<string, string>("=", "Operator"));
l_map.insert(pair<string, string>("!", "Operator"));
l_map.insert(pair<string, string>("+", "Operator"));
l_map.insert(pair<string, string>("-", "Operator"));
l_map.insert(pair<string, string>("*", "Operator"));
l_map.insert(pair<string, string>("/", "Operator"));
l_map.insert(pair<string, string>("==", "Operator"));
l_map.insert(pair<string, string>("!=", "Operator"));
l_map.insert(pair<string, string>("<", "Operator"));
l_map.insert(pair<string, string>(">", "Operator"));
l_map.insert(pair<string, string>("<=", "Operator"));
l_map.insert(pair<string, string>(">=", "Operator"));
l_map.insert(pair<string, string>("&&", "Operator"));
l_map.insert(pair<string, string>("||", "Operator"));
l_map.insert(pair<string, string>("[", "Special"));
l_map.insert(pair<string, string>("]", "Special"));
l_map.insert(pair<string, string>("(", "Special"));
l_map.insert(pair<string, string>(")", "Special"));
l_map.insert(pair<string, string>("{", "Special"));
l_map.insert(pair<string, string>("}", "Special"));
l_map.insert(pair<string, string>(";", "Special"));
l_map.insert(pair<string, string>(",", "Special"));
}
char lexer(map<string, string> &l_map, string str)
{
if(isKOS(l_map, str))
return 'K'; //keyword, operator, special symbol
else if(isDigit(str))
return 'D'; //digit
else if(isInentifier(str))
return 'I'; //identifier
else if(isChar(str))
return 'C'; //char
else if(str == "//")
return 'M'; //comment
else
return 'E'; //error
}
bool isKOS(map<string, string> &l_map, string str)
{
//keyword, operastor, special
map<string, string>::iterator it = l_map.find(str);
if(it != l_map.end())
return true;
else
return false;
}
bool isDigit(string str)
{
//digit
for(string::iterator it = str.begin(); it != str.end(); ++it)
if(!isdigit(*it))
return false;
return true;
}
bool isInentifier(string str)
{
//identifier
for(string::iterator it = str.begin(); it != str.end(); ++it)
if(it == str.begin())
{
if(!isalpha(*it) && *it != '_')
return false;
}
else
if(!isalnum(*it) && *it != '_')
return false;
return true;
}
bool isChar(string str)
{
//char
if(str[0] == '\'' && str[2] == '\'')
{
if(isgraph(str[1]))
return true;
}
else if(str == "\'\\t\'" || str == "\'\\n\'" || str == "\' \'")
return true;
return false;
}