- •Лекция 2
- •Упрощенная модель компиляции
- •Лексический анализ программы
- •Категории лексем
- •Идентификаторы
- •Ключевые слова
- •Зарезервированные идентификаторы
- •Стандартные идетификаторы
- •Идентификатор пользователя
- •Константы
- •Литералы
- •Целые константы
- •Вещественные константы
- •Булевские (логические) константы
- •Символьные константы
- •Строковые константы
- •Именованные константы
- •Перечисляемые константы
- •Препроцессорные константы
- •Знаки операций
- •Знаки пунктуации
- •Разделители
- •Пробельные разделители
Разделители
Компилятор, выполняя лексический анализ программы на языке С++, для распознания начала и (или) конца лексем использует разделители.
Функции разделителей:
обозначение места начала и конца лексем;
исключение из компиляции всех избыточных символов, не входящих в состав лексем.
Разделители лексем:
-
Пробельные разделители
-
Знаки операций (они сами есть лексемы)
-
Знаки пунктуации (они сами есть лексемы)
Пробельные разделители
К пробельным разделителям относятся неизображаемые символы и комментарии. Пробельные разделители не обрабатываются компилятором и игнорируются им.
В общем случае пробельных разделителей может быть произвольное число (как ни одного, так и любое их количество). Хороший стиль предполагает наличие хотя бы одного такого символа после каждой лексемы.
Комментарий не является лексемой и трактуется компилятором как пробельный разделитель. Многострочный комментарий отмечается символами “/*” в начале и “*/” в конце выделяемого текста. Признаком однострочного комментария являются символы ”//” в начале строки программы. Однострочный комментарий удобно использовать как пояснение к тексту оператора. Например:
int a; // текст, поясняющий назначение переменной
Символы комментария необходимо отделять от текста программы пробелом. В противном случае, текст программы может неправильно интерпретироваться компилятором.
Символы комментария необходимо отделять от текста программы пробелом.
Например, запись без пробелов:
int i = j //*деление на k*/k +m; будет распознана неправильно, как int i = j + m; (как имеющая однострочный комментарий), Запись с пробелами:
int i = j / /*деление на k*/ k +m;
будет распознана правильно, как int i = j / j / k+m; (как имеющая многострочный комментарий).
Комментарии не могут быть вложенными, т.к. в тексте однострочного комментария символы многострочного комментария /* игнорируются (воспринимаются как обычные символы). Точно также игнорируются (воспринимаются как обычные) в тексте многострочного комментария символы однострочного комментария //.
ASCII-Коды (символы с кодами 0-127)
01111111
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
0 |
0 |
|
46 |
2E |
. |
92 |
5C |
\ |
1 |
1 |
|
47 |
2F |
/ |
93 |
5D |
] |
2 |
2 |
|
48 |
30 |
0 |
94 |
5E |
^ |
3 |
3 |
|
49 |
31 |
1 |
95 |
5F |
_ |
4 |
4 |
|
50 |
32 |
2 |
96 |
60 |
' |
5 |
5 |
|
51 |
33 |
3 |
97 |
61 |
a |
6 |
6 |
|
52 |
34 |
4 |
98 |
62 |
b |
7 |
7 |
звонок |
53 |
35 |
5 |
99 |
63 |
c |
8 |
8 |
|
54 |
36 |
6 |
100 |
64 |
d |
9 |
9 |
|
55 |
37 |
7 |
101 |
65 |
e |
10 |
A |
перевод строки |
56 |
38 |
8 |
102 |
66 |
f |
11 |
B |
|
57 |
39 |
9 |
103 |
67 |
g |
12 |
C |
|
58 |
3A |
: |
104 |
68 |
h |
13 |
D |
возврат каретки |
59 |
3B |
; |
105 |
69 |
i |
14 |
E |
|
60 |
3C |
< |
106 |
6A |
j |
15 |
F |
|
61 |
3D |
= |
107 |
6B |
k |
16 |
10 |
|
62 |
3E |
> |
108 |
6C |
l |
17 |
11 |
|
63 |
3F |
? |
109 |
6D |
m |
18 |
12 |
|
64 |
40 |
@ |
110 |
6E |
n |
19 |
13 |
|
65 |
41 |
A |
111 |
6F |
o |
20 |
14 |
|
66 |
42 |
B |
112 |
70 |
p |
21 |
15 |
|
67 |
43 |
C |
113 |
71 |
q |
22 |
16 |
|
68 |
44 |
D |
114 |
72 |
r |
23 |
17 |
|
69 |
45 |
E |
115 |
73 |
s |
24 |
18 |
|
70 |
46 |
F |
116 |
74 |
t |
25 |
19 |
|
71 |
47 |
G |
117 |
75 |
u |
26 |
1A |
|
72 |
48 |
H |
118 |
76 |
v |
27 |
1B |
|
73 |
49 |
I |
119 |
77 |
w |
28 |
1C |
|
74 |
4A |
J |
120 |
78 |
x |
29 |
1D |
|
75 |
4B |
K |
121 |
79 |
y |
30 |
1E |
|
76 |
4C |
L |
122 |
7A |
z |
31 |
1F |
|
77 |
4D |
M |
123 |
7B |
{ |
32 |
20 |
пробел |
78 |
4E |
N |
124 |
7C |
¦ |
33 |
21 |
! |
79 |
4F |
O |
125 |
7D |
} |
34 |
22 |
'' |
80 |
50 |
P |
126 |
7E |
~ |
35 |
23 |
# |
81 |
51 |
Q |
127 |
7F |
del |
36 |
24 |
$ |
82 |
52 |
R |
|
|
|
37 |
25 |
% |
83 |
53 |
S |
|
|
|
38 |
26 |
& |
84 |
54 |
T |
|
|
|
39 |
27 |
' |
85 |
55 |
U |
|
|
|
40 |
28 |
( |
86 |
56 |
V |
|
|
|
41 |
29 |
) |
87 |
57 |
W |
|
|
|
42 |
2A |
* |
88 |
58 |
X |
|
|
|
43 |
2B |
+ |
89 |
59 |
Y |
|
|
|
44 |
2C |
, |
90 |
5A |
Z |
|
|
|
45 |
2D |
- |
91 |
5B |
[ |
|
|
|
01111111
Кодовая таблица 866 – MS-DOS
(символы с кодами 127-255)
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
128 |
80 |
А |
150 |
96 |
Ц |
172 |
AC |
м |
193 |
C1 |
┴ |
214 |
D6 |
╓ |
235 |
EB |
ы |
129 |
81 |
Б |
151 |
97 |
Ч |
173 |
AD |
н |
194 |
C2 |
┬ |
215 |
D7 |
╫ |
236 |
EC |
ь |
130 |
82 |
В |
152 |
98 |
Ш |
174 |
AE |
о |
195 |
C3 |
├ |
216 |
D8 |
╪ |
237 |
ED |
э |
131 |
83 |
Г |
153 |
99 |
Щ |
175 |
AF |
п |
196 |
C4 |
─ |
217 |
D9 |
┘ |
238 |
EE |
ю |
132 |
84 |
Д |
154 |
9A |
Ъ |
176 |
B0 |
- |
197 |
C5 |
┼ |
218 |
DA |
┌ |
239 |
EF |
я |
133 |
85 |
Е |
155 |
9B |
Ы |
177 |
B1 |
- |
198 |
C6 |
╞ |
219 |
DB |
█ |
240 |
F0 |
Ё |
134 |
86 |
Ж |
156 |
9C |
Ь |
178 |
B2 |
- |
199 |
C7 |
╟ |
220 |
DC |
▄ |
241 |
F1 |
ё |
135 |
87 |
З |
157 |
9D |
Э |
179 |
B3 |
│ |
200 |
C8 |
╚ |
221 |
DD |
▌ |
242 |
F2 |
≥ |
136 |
88 |
И |
158 |
9E |
Ю |
180 |
B4 |
┤ |
201 |
C9 |
╔ |
222 |
DE |
▐ |
243 |
F3 |
≤ |
137 |
89 |
Й |
159 |
9F |
Я |
181 |
B5 |
╡ |
202 |
CA |
╩ |
223 |
DF |
▀ |
244 |
F4 |
⌠ |
138 |
8A |
К |
160 |
A0 |
а |
182 |
B6 |
╢ |
203 |
CB |
╦ |
224 |
E0 |
р |
245 |
F5 |
⌡ |
139 |
8B |
Л |
161 |
A1 |
б |
183 |
B7 |
╖ |
204 |
CC |
╠ |
225 |
E1 |
с |
246 |
F6 |
+ |
140 |
8C |
М |
162 |
A2 |
в |
184 |
B8 |
╕ |
205 |
CD |
═ |
226 |
E2 |
т |
247 |
F7 |
≈ |
141 |
8D |
Н |
163 |
A3 |
г |
185 |
B9 |
╣ |
206 |
CE |
╬ |
227 |
E3 |
у |
248 |
F8 |
|
142 |
8E |
О |
164 |
A4 |
д |
186 |
BA |
║ |
207 |
CF |
╧ |
228 |
E4 |
ф |
249 |
F9 |
|
143 |
8F |
П |
165 |
A5 |
е |
187 |
BB |
╗ |
208 |
D0 |
╨ |
229 |
E5 |
х |
250 |
FA |
● |
144 |
90 |
Р |
166 |
A6 |
ж |
188 |
BC |
╝ |
209 |
D1 |
╤ |
230 |
E6 |
ц |
251 |
FB |
√ |
145 |
91 |
С |
167 |
A7 |
з |
189 |
BD |
╜ |
210 |
D2 |
╥ |
231 |
E7 |
ч |
252 |
FC |
n |
146 |
92 |
Т |
168 |
A8 |
и |
190 |
BE |
╛ |
211 |
D3 |
╙ |
232 |
E8 |
ш |
253 |
FD |
2 |
147 |
93 |
У |
169 |
A9 |
й |
191 |
BF |
┐ |
212 |
D4 |
╘ |
233 |
E9 |
щ |
254 |
FE |
■ |
148 |
94 |
Ф |
170 |
AA |
к |
192 |
C0 |
└ |
213 |
D5 |
╒ |
234 |
EA |
ъ |
255 |
FF |
|
149 |
95 |
Х |
171 |
AB |
л |
|
|
|
|
|
|
|
|
|
|
|
|
Кодовая таблица 1251 – MS Windows
(символы с кодами 127-255, даны выборочно)
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
dec |
hex |
char |
|
|||
128 |
80 |
|
150 |
96 |
|
172 |
AC |
¬ |
193 |
C1 |
Б |
214 |
D6 |
Ц |
235 |
EB |
л |
|
|||
129 |
81 |
|
151 |
97 |
|
173 |
AD |
- |
194 |
C2 |
В |
215 |
D7 |
Ч |
236 |
EC |
м |
|
|||
130 |
82 |
|
152 |
98 |
|
174 |
AE |
® |
195 |
C3 |
Г |
216 |
D8 |
Ш |
237 |
ED |
н |
|
|||
131 |
83 |
|
153 |
99 |
|
175 |
AF |
Ï |
196 |
C4 |
Д |
217 |
D9 |
Щ |
238 |
EE |
о |
|
|||
132 |
84 |
|
154 |
9A |
|
176 |
B0 |
º |
197 |
C5 |
Е |
218 |
DA |
Ъ |
239 |
EF |
п |
|
|||
133 |
85 |
|
155 |
9B |
|
177 |
B1 |
± |
198 |
C6 |
Ж |
219 |
DB |
Ы |
240 |
F0 |
р |
|
|||
134 |
86 |
|
156 |
9C |
|
178 |
B2 |
|
199 |
C7 |
З |
220 |
DC |
Ь |
241 |
F1 |
с |
|
|||
135 |
87 |
|
157 |
9D |
|
179 |
B3 |
i |
200 |
C8 |
И |
221 |
DD |
Э |
242 |
F2 |
т |
|
|||
136 |
88 |
|
158 |
9E |
|
180 |
B4 |
r |
201 |
C9 |
Й |
222 |
DE |
Ю |
243 |
F3 |
у |
|
|||
137 |
89 |
|
159 |
9F |
|
181 |
B5 |
μ |
202 |
CA |
К |
223 |
DF |
Я |
244 |
F4 |
ф |
|
|||
138 |
8A |
|
160 |
A0 |
|
182 |
B6 |
¶ |
203 |
CB |
Л |
224 |
E0 |
а |
245 |
F5 |
х |
|
|||
139 |
8B |
|
161 |
A1 |
Ў |
183 |
B7 |
. |
204 |
CC |
М |
225 |
E1 |
б |
246 |
F6 |
ц |
|
|||
140 |
8C |
|
162 |
A2 |
ў |
184 |
B8 |
ë |
205 |
CD |
Н |
226 |
E2 |
в |
247 |
F7 |
ч |
|
|||
141 |
8D |
|
163 |
A3 |
J |
185 |
B9 |
№ |
206 |
CE |
О |
227 |
E3 |
г |
248 |
F8 |
ш |
|
|||
142 |
8E |
|
164 |
A4 |
|
186 |
BA |
ε |
207 |
CF |
П |
228 |
E4 |
д |
249 |
F9 |
щ |
|
|||
143 |
8F |
|
165 |
A5 |
¤ |
187 |
BB |
» |
208 |
D0 |
Р |
229 |
E5 |
е |
250 |
FA |
ъ |
|
|||
144 |
90 |
|
166 |
A6 |
¦ |
188 |
BC |
j |
209 |
D1 |
С |
230 |
E6 |
ж |
251 |
FB |
ы |
|
|||
145 |
91 |
|
167 |
A7 |
§ |
189 |
BD |
S |
210 |
D2 |
Т |
231 |
E7 |
з |
252 |
FC |
ь |
|
|||
146 |
92 |
|
168 |
A8 |
Ё |
190 |
BE |
s |
211 |
D3 |
У |
232 |
E8 |
и |
253 |
FD |
э |
|
|||
147 |
93 |
|
169 |
A9 |
© |
191 |
BF |
ï |
212 |
D4 |
Ф |
233 |
E9 |
й |
254 |
FE |
ю |
|
|||
148 |
94 |
|
170 |
AA |
Є |
192 |
C0 |
А |
213 |
D5 |
Х |
234 |
EA |
к |
255 |
FF |
я |
|
|||
149 |
95 |
|
171 |
AB |
« |
䦋㌌㏒ |
䦋㌌㏒㧀좈琰茞ᓀ㵂Ü |
|
|
|
|
|
|
|
䦋㌌㏒㧀좈琰茞ᓀ㵂Ü |
䦋㌌㏒㧀좈琰茞ᓀ㵂Ü |
䦋㌌㏒㧀좈琰茞ᓀ㵂Ü |
1 Из соображений удобства кодирования и из технических соображений пользуются равномерными кодами, т.е. двоичными группами равной длины. При использовании 8 двоичных знаков (1 байт) получим 256 комбинаций двоичных символов. Одной из распространенных систем «байтового» кодирования является ASCII (American Stаndard Cod Information Interchange, произносим «аскей»). Но эта система является международной (общепринятой) только в первой половине кодов (от 0 до 127), вторая половина кодов (от 128 до 255) является национальной и различна для разных стран (см. таблицы кодов в конце лекции).
Программист, используя в программах, выполняемых в консольном режиме, строковые и символьные константы с русскими буквами, сталкивается с проблемой различия кодировок. В консольном режиме примеряется ОЕМ-кодировка, в которой для представления символов со значениями кодов 128-255 используется кодовая таблица 866 – MS DOS. В программах, исполняемых и создаваемых под управлением MS Windows, применяется для тех же символов кодовая таблица 1251 (ANSI-кодировка). Поэтому текст с русскими буквами (их коды находятся в диапазоне 128-255), подготовленный к редакторе MS Windows, нельзя правильно отобразить в консольном окне – нужна перекодировка из MS Windows в MS DOS и обратно.