[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