-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathToken.h
173 lines (154 loc) · 4.52 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#pragma once
#include <ostream>
#include <string>
/// Token osztálytípus
enum class TokenType
{
/// Egy valós szám
NumberLiteral,
/// "true" / "false"
BoolLiteral,
/// Az "undefined" szó
UndefinedLiteral,
/// Operátorok és egyéb jelek
Symbol,
/// Változó illetve függvénynév
Identifier,
/// Token, amit a nyelv nem ismer fel
Unknown,
/// A forráskód végére helyezett Token (sentrynek és utolsó sor/utolsó oszlop miatt)
Ending
};
/// A nyelv alapegysége
class Token
{
protected:
/// A sor, ahol a Token elkezdődött
int line;
/// Az oszlop, ahol a Token elkezdődött
int column;
public:
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
Token(int line, int column);
virtual ~Token() = default;
/// Kiírja magát az output streamre
/// @param os A stream, amire kiírunk
virtual void print(std::ostream& os) const = 0;
/// Megmondja, hogy a Token típusa megegyezik e a megadattal
/// A leszármazott osztályok ezen keresztül tudják "megmondani", milyen típusúak.
/// @param type Típus, amit viszgálunk
virtual bool match(TokenType type) const = 0;
/// A sor, ahol a Token elkezdődött
int getLine();
/// Az oszlop, ahol a Token elkezdődött
int getColumn();
};
/// Kiír egy Token-t az output streamre
/// @param os A stream, amire kiírunk
/// @param other A Token, amit kiír
/// @see Token::print
std::ostream& operator<<(std::ostream& os, const Token& other);
/// Egy valós szám
class NumberToken : public Token
{
private:
/// A Token értéke
double value;
public:
/// @param value A Token értéke
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
NumberToken(double value, int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
/// A Token értéke
double getValue() const;
};
/// "true" / "false"
class BoolToken : public Token
{
private:
/// A Token értéke
bool value;
public:
/// @param value A Token értéke
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
BoolToken(bool value, int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
/// A Token értéke
bool getValue() const;
};
/// Az "undefined" szó
class UndefinedToken : public Token
{
public:
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
UndefinedToken(int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
};
/// Változó illetve függvénynév
class IdentifierToken : public Token
{
private:
/// A Token értéke
std::string value;
public:
/// @param value A Token értéke
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
IdentifierToken(std::string value, int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
/// A Token értéke
std::string getValue() const;
};
/// Operátorok és egyéb jelek
class SymbolToken : public Token
{
private:
/// A Token értéke
std::string value;
public:
/// @param value A Token értéke
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
SymbolToken(std::string value, int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
/// Checks if the tokens matches a character
/// @param value The character to check against
bool match(std::string value) const;
/// A Token értéke
std::string getValue() const;
};
/// Token, amit a nyelv nem ismer fel
class UnknownToken : public Token
{
private:
/// A Token értéke
std::string value;
public:
/// @param value A Token értéke
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
UnknownToken(std::string value, int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
/// A Token értéke
std::string getValue() const;
};
/// A forráskód végére helyezett Token (sentrynek és utolsó sor/utolsó oszlop miatt)
class EndingToken : public Token
{
public:
/// @param line A sor, ahol a Token elkezdődött
/// @param column Az oszlop, ahol a Token elkezdődött
EndingToken(int line, int column);
void print(std::ostream& os) const override;
bool match(TokenType type) const override;
};