Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2010, 16:07   #1
vetalij
Пользователь
 
Регистрация: 02.04.2009
Сообщений: 18
Восклицание описание к коду!

Есть вот такой код

Код:
int tok;
double tokval;

int next() {
	for (;;) {
		int c = getchar();
		if (c == EOF || strchr("+-*/^()\n", c) != NULL) return tok = c;
		if (isspace(c)) continue;
		if (isdigit(c) || c == '.') {
			ungetc(c, stdin);
			scanf(" %lf", &tokval);
			return tok = 'n';
		}
		fprintf(stderr, "Bad character: %c\n", c); abort();
	}
}

void skip(int t) { assert(tok == t); next(); }

double expr();
}
конкретно понему изветсно что:
Функция getchar() - забирает данные из потока ввода по одному.
strchr("+-*/^()\n", c) - проверяют c на наличие стоящих в кавычках констант.
isspace - провереят c на наличие пробела.
isdigit - проверяет на наличие десятичного числа(от 0 до 9) в c.
abort() - прерывает ВСЮ программу.
assert() - проверяет условие, стоящие в скобках(выражение) и если оно верно, то программа работает далее, если же нет, то вызывается функция 'abort()'.

так вот. хотелось бы узнать описание к:
ungetc(c, stdin) - ?
int tok; - ?
double tokval; - ?
if (c == EOF || - ? (конкретно для чего здесь " || ").
if (isspace(c)) continue; - ? (что делает эта строка).
if (isdigit(c) || c == '.') - ? (и что делает эта строка).
vetalij вне форума Ответить с цитированием
Старый 25.02.2010, 16:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if (c == EOF || strchr("+-*/^()\n", c) != NULL) return tok = c;
Ну если дословно переводить с буржуинского то
Если с равен концу файла или находится среди +-*/^()\n то выйти из функции, присвоив его tok и вернув его же.
Цитата:
int tok; - ?
А это видимо просто временная переменная для проверки некий символ то вылететь из программы с ошибкой (assert(tok == t)), иначе взять следующий символ, и опять его так проверить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2010, 16:20   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
if (c == EOF || - ? (конкретно для чего здесь " || ").
EOF - конец файла(потока)
"||" - логическое ИЛИ

Код:
if (isspace(c)) continue; - ? (что делает эта строка).
если c есть пробел, то пропустить текущую итерацию цикла, то есть ничего не делать и перейти к следующей итерации
Код:
if (isdigit(c) || c == '.') - ? (и что делает эта строка).
если символ C состоит из цифры ИЛИ из точки
NiCola999 вне форума Ответить с цитированием
Старый 02.03.2010, 01:38   #4
Gay For Furlong
Новичок
Джуниор
 
Регистрация: 02.03.2010
Сообщений: 1
По умолчанию

Это код лексического анализатора. tok - тип следующей лексемы: это либо знак операции, скобка, символ 'n' обозначает лексему-число (при этом ее значение хранится в tokval), EOF=-1 сигнализирует о конце входа.

> if (c == EOF || - ? (конкретно для чего здесь " || ").
EOF - тоже лексема. Сигнализирует конец ввода.

> if (isspace(c)) continue; - ? (что делает эта строка).
пропускает пробелы и табы

> if (isdigit(c) || c == '.') - ? (и что делает эта строка).
обнаруживает начало записи числа.

-- автор этого кода

Попрошу дальнейшие вопросы задавать там, где этот код был изначально опубликован - http://forum.algolist.ru/source-impl...html#post10503
Gay For Furlong вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по коду BeZone Помощь студентам 10 28.12.2009 13:21
комментарии к коду leahov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 09.06.2009 13:09
Комментарии к коду ELL Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.03.2009 16:01
Комментарии к коду Juhn Паскаль, Turbo Pascal, PascalABC.NET 6 24.12.2007 20:29
Комментарии к коду Ярослав Помощь студентам 4 23.11.2007 16:57