[cdev] Utility bc
maegabot88
megabot88 на gmail.com
Пн Мар 15 22:02:46 MSK 2010
Мне все переделывать?
15.03.2010 20:15, Grigoriy A. Sitkarev пишет:
> Отвечу по порядку.
>> Еще раз здравствуйте.
>>
>> ОС я поставил 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 mailing list
> cdev на wiki.syktsu.ru
> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev
Подробная информация о списке рассылки cdev