Re: parascriptum: release v0.2

Justin Forest <[email protected]> Tue, 30 Mar 2004 02:13:07 +0400
Newsgroups gmane.comp.misc.faerion.devel
Message-ID <[email protected]>
1. Файлы и пути.

Настоятельно рекомендую не использовать фокусов вроде INCDIR в рамках 
одного проекта.  Даже в модулей одного проекта, где файловая иерархия 
сколько-нибудь статична, лучше использовать относительные пути, а не 
"какие-то волшебные".  Rascal в пример.

Выносить заголовки в отдельный каталог -- тоже сомнительной ценности 
привычка.

2. Мэйкфайлы.

Тут всё хорошо, только называть их лучше GNUmakefil, в качестве 
гарантии, что обрабатываться они будут GNU мэйком (а с bsd make они не 
совместимы).

3. Макросы.

Макросы -- это плохо.  Допускаю, что иногда они существенно сокращают 
количество набираемого кода (таблица команд в Фэрионе) или избавляют от 
необходимости изменять большое количество файлов (*_API).  Вещи вроде 
PSCR_CLONE, по-моему, должны быть выполнены в виде функций.

4. Типы данных.

Оператор отрицания применяется к булевым выражениям.  Например, !(a < 
b), допустимо.  Тип char таким не является, поэтому "!*str" -- дурной 
тон, и понижает читабельность (порядок аргументов расставляй по вкусу). 
  Лучше писать "*src != 0" (а то и вовсе '\0').  (Это если докапываться 
до всего, от начала и до конца.)

5. Обработчики команд.

При встрече каждой команды искать соответствующую функцию в бинарнике, 
при этом говорить о производительности?  Я (а также apache.orgи многие 
другие) предпочёл бы, чтобы модуль экспортировал массив структур, 
содержащих имя команды и адрес обработчика.  Кажется нечто подобное у 
тебя было изначально, но потом мутировало.  Экспортировать можно 
функцию, которая будет возвращать указатель на массив структур (размер 
сам придумаешь как определить (например, вместо имени в последнем 
элементе будет NULL)).  Получать функция будет номер версии интерфейса, 
для совместимости с будушими версиями.

Кроме того, так ты избавишься от (и без того надуманной) проблемы с 
прочерками и невозможностью использования and в качестве имени функции.

В остальном достаточно вменяемо, концептуально.  Только можно сделать 
набор дефолтных команд, а внешними библиотеками оформлять либо 
дополнительные команды, либо подменять дефолтные.

И что, интерактивного шелла не будет?

> так 390 040 линий тестового кода (около восьми
> мегабайт) даже на моей несколько смехотворной тачке распарсились

Parabellym -- система, конечно, масштабируемая, но размеры конфига ты, 
чесслово, переоцениваешь.

> код лично мне не нравится.

Ну да.  Говорилось о том, что begin/end будут вполне себе командами, 
помнишь?

> PKR -- Process sKip Register
> PMR -- Process Manage Register
> PSR -- Process Status Register
> 
> PSR - это то, куда кладет свой результат команда. если модуль не
> найден - кладем ноль.

Угу.

> PMR - эта штука управляет блоками. создается область видимости и все
> такое. используется при очередном рекурсивном назначении и только.
> блоки, кстати, можно создавать и на ровном месте, только следует
> помнить, что PMR может быть сброшен. но это еще над управляющими
> командами подумать надо.

Нифига не понятно.  Как создаёт, область видимости чего?  Что такое 
"рекурсивное назначение" и "ровное место"?  Имхо такой регистр должен 
устанавливаться если обрабатываемая команда считает себя открывающей 
блок.  Должна быть также команда, закрывающая его.  Много регистров 
будет, но это не смущает пока.

> PKR - отвечает за пропуск ближайшей следующей команды. блок,
> естественно никогда пропущен не будет и PKR будет опять сброшен в
> ноль.

То есть как в случае невыполнившегося условия?  Тогда все эти регистры 
нужно будет заносить в стэк при открытии блока, и вытаскивать обратно 
при выходе, не так ли?  Пока ничего такого не нашёл.  (Стэк здесь, 
естественно, не машинный, а твой собственный.)

> нормальные состояния для регистров: 1, 1, 0 - соответсвенно.

Соответственно чему?  Перечень у тебя в одном порядке, описание -- в 
обратном.

> все управляющие я решил таки подчеркнуть. чтоб не путать с другими.
> если вам понравится такая реализация (хотя бы абстрактно), то я буду
> продолжать, т.к. в ходе работы появились новые идеи. да и это
> достаточно весело из чисто линейного парсера сделать еще что-то ;)

Ну да, я однажды хотел dns подправить в фэрионе, получили rascal и 
parabellym.  Осторожнее. ;)

Мне пока нравится, а если учесть вышеизложенные замечания -- так вообще 
здорово будет.

> хекс, а что ты говорил про сделать подулем?

А что я говорил про сделать модулем?



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
Discussions in this list are held in two languages: English and Russian.
When replying, please use the language that the sender of the original
message is guaranteed to understand, or use English.