[cdev] Utility bc
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Пн Мар 15 21:15:36 MSK 2010
Отвечу по порядку.
> Еще раз здравствуйте.
>
> ОС я поставил Debian Lenny, пишу в ней на kdevelop.
Очень хорошо.
> Спецификацию OpenGroup я немного поглядел, тк с английским не дружу,
> но посмотрю еще что там есть. Также я сделал что-то похожее на разбор
> входящей строки и вывод ответа, но я "уже" не строю там дерево.
В том то и дело что "похожее" потому что ваше задание - не реализация
алгоритма Бауэера-Замельзона. На базе того что вы изобразили, сделать
интерпретатор похожий на bc вряд ли получится.
Вообще для генерации кода лексического анализатора и синтаксического из
спецификаций есть генераторы кода lex и yacc (flex и bison в GNU мире).
Они могут генерировать код анализаторов по спецификациям формальным но
вам надо этот код делать вручную, во-первых для того чтобы научиться
программировать а во-вторых чтобы понять как это должно работать изнутри.
>
> В bc, я смотрел, есть своя лексика, похожая на си. По крайней мере
> там можно задавать свои функции и использовать их. Мне такое тоже надо
> делать? Просто пока я не представляю даже как это делать :) .
Я вам уже сказал что если вы сделаете хотя бы лексический анализатор,
соответствующий спецификации, уже будет зачёт. Прочитайте что это такое
и потом вернитесь к спецификации Open Group. В Драконовой Книге очень
хорошо это всё описано, рекомендую её найти и прочитать соответствующие
главы.
> Программу скину позже, но она вам вряд ли понравится.
Конечно не понравится.
1. Не проверяете что вернул malloc(3).
2. Не высвобождаете память заголовков после выталкивания элементов из
стека. Память будет утекать.
3. Если я введу больше 80 символов на стандартный ввод то буфер будет
переполнен и программа будет работать некорректно потому что затрёт
чужой кусок или вообще повредит его. Функцию gets(3) вообще использовать
не рекомендуется, это потенциальная ошибка всегда.
4. Огромное количество предупреждений при компиляции с -Wall.
5. ASCII символы от '0' до '9' идут в лексикографическом порядке.
Поэтому узнать является ли код символа числом, можно очень просто:
if (s[i] >= '0' && s[i] <= '9') {
...
}
И сравнивать 10 раз не нужно. Для этого есть и стандартная функция
библиотеки Си isdigit(3). Что использовать - зависит от случая и часто
дело вкуса.
--
Г.А.
Подробная информация о списке рассылки cdev