class Scanner enum state IDENT NUMB COM ALE DELIM NEQ static char TW м

 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
class Scanner {
enum state { H, IDENT, NUMB, COM, ALE, DELIM, NEQ }; /// ?
static char* TW [ ]; // массив для служебных символов
static type_of_lex words [ ]; // массив названий для служебных символов
static char * TD [ ]; .. массив для таблицы ограничителей
static type_of_lex dlms [ ];/ массив названий для таблицы ограничителей
state CS; //?
FILE *fp; // имя файла
char c; // какой то символ
char buf [ 80 ]; // массив(буфер) из 80 элементов
int buf_top; // определяет сколькоэдементов в буфере
void clear ( ) ; // очистить
void add ( ); // добавить
int look (const char * buf, char * * list); // ?
void gc ( ) { c = fgetc ( fp ); } //?
public:
Scanner (const char * program);
Lex get_lex ();
};
void Scanner::clear ( ) {
buf_top = 0;
for (int j = 0; j < 80; j++ ) // очищаем заполняя концом строки
buf [ j ] = '\0';
}
void Scanner::add ( ) {
buf [ buf_top ++ ] = c; // добавляем какой то элемент и увеличиваем на 1 количество элементов
}
int Scanner::look (const char * buf, char * * list) { // onst char *buf - массив чаровский, иначе говоря какая - то строка(лексема)
Если входная строка не лежит в таблице созданных лексем, то выходим из метода.
int i = 0;
while (list [ i ]) /// пока не закончится лист??
{
if ( ! strcmp (buf, list [ i ] ) )
return i;
i++;
}
return 0;
}
Scanner::Scanner (const char * program) { // открытие файла для чтения и записи
fp = fopen ( program, "r" );
CS = H;
clear(); // ?? смысл если открыли для чтения и записи потом все стирать?
}