-
Notifications
You must be signed in to change notification settings - Fork 0
/
token.h
121 lines (72 loc) · 2.78 KB
/
token.h
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#ifndef BUNNY_TOKEN_H
#define BUNNY_TOKEN_H
#include <iostream>
#include <string>
#include <unordered_map>
typedef std::string tokenType; //per rendere il codice più facile da interpretare
namespace bunny
{
class Token
{
public:
Token() = default;
Token(tokenType _type, std::string _literal): type(_type), literal(_literal){}
Token(tokenType _type, char currentChar) : type(_type), literal(std::string(1, currentChar)){}
// es. TOKEN(INT, "322")
tokenType type;
std::string literal;
void printToken();
};
/*
Ho preferito gestire i token usando le std::string e non una ENUM.
Questo perchè è più facile così la stampa e successiva gestione dei TOKEN.
Sono CONST poichè non vogliamo che, in nessun modo, i valori vengano cambiati da qualche funzione
essendo che darebbe poi problemi nella creazione dell'AST durante il parsing.
*/
// Error TOKEN
const tokenType ILLEGAL = "ILLEGAL"; // un token che non conosciamo
const tokenType END = "END"; // fine file
// Variable TOKEN
const tokenType INT = "INT";
const tokenType STRING = "STRING";
const tokenType IDENTIFIER = "IDENTIFIER";
// Operations TOKEN
const tokenType PLUS = "+";
const tokenType MINUS = "-";
const tokenType SLASH = "/";
const tokenType ASTERISK = "*";
const tokenType PERCENT = "%";
const tokenType BANG = "!";
const tokenType ASSIGN = "=";
// Confront TOKEN
const tokenType LT = "<"; //Lower Thna
const tokenType GT = ">"; //Greater Than
const tokenType LE = "<="; //Lower Equal
const tokenType GE = ">="; //Greater Equal
const tokenType EQ = "=="; //Equal
const tokenType NE = "!="; //Not Equal
//General TOKEN
const tokenType SEMI = ";";
const tokenType COMMA = ",";
//Keywords TOKEN [TO ADD FOR LOOP]
const tokenType WHILE = "WHILE";
const tokenType IF = "IF";
const tokenType ELSE = "ELSE";
const tokenType TRUE = "TRUE";
const tokenType FALSE = "FALSE";
const tokenType RETURN = "RETURN";
const tokenType VAR = "VAR";
const tokenType FUNCTION = "FUNCTION";
//General TOKEN
const tokenType LPAREN = "(";
const tokenType RPAREN = ")";
const tokenType LBRACE = "{";
const tokenType RBRACE = "}";
const tokenType LBRACKET = "[";
const tokenType RBRACKET = "]";
const tokenType REF = "&";
extern std::unordered_map<std::string, tokenType> keywords;
// Serve per verificare se un identificatore è una parola chiave oppure una variabile che viene dichiarata
tokenType checkIdent(std::string ident);
}
#endif // BUNNY_TOKEN_H