-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathToken.cpp
More file actions
82 lines (68 loc) · 2.24 KB
/
Copy pathToken.cpp
File metadata and controls
82 lines (68 loc) · 2.24 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
#include <Token.h>
// Сохраняет лексему
void Token_stream::putback (Token t)
{
if (full)
error("буфер уже заполнен!");
buffer = t;
full = true;
}
// Получает лексему и возращает её (работает с потоком cin и с буфером buffer)
Token Token_stream::get () {
if (full) {
full = false;
return buffer;
}
char ch;
while (cin.get(ch) && isspace(ch) && ch != '\n') {} // игнорируем все пробельные символы, кроме "\n"
switch (ch) {
case '(':
case ')':
case '|':
case '^':
case '+':
case '-':
case '*':
case '/':
case '%':
case '=':
return Token{ ch }; // Возвращаем лексему - симбол
case print:
case '\n':
return Token{ print }; // Возвращаем лексему - " ; "
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': {
cin.putback(ch);
double val;
cin >> val;
return Token{ number, val }; // Возвращаем лексему - число
}
default:
if (isalpha(ch)) {
string s;
s += ch;
while (cin.get(ch) &&
(isalpha(ch) || isdigit(ch) || ch == '_')) // Считываем слово
s += ch;
cin.putback(ch);
if (s == declkey) return Token{ let }; // Если слово " let "
if (s == const_decley) return Token{ constant }; // Если слово " const "
if (s == "help") return Token{ help }; // Если слово " help "
if (s == "quit") return Token{ quit }; // Если слово " quit "
return Token{ name, s }; // Возвращаем лексему - переменную
}
error("Неверная лексема!");
}
}
// функция игнорирования лексем (нужна после обнаружения ошибки)
void Token_stream::ignore (char c) {
if (full && c == buffer.kind) {
full = false;
return;
}
full = false;
char ch;
while (cin >> ch)
if (ch == c) return;
}