Вот, собственно, дошел в проекте до такого участка: Код (Text): void run(){ try{ PrintWriter pw = new PrintWriter ( new OutputStreamWriter (sock.getOutputStream(), "utf8"), true); BufferedReader br = new BufferedReader (new InputStreamReader (sock.getInputStream(), "utf8")); String req = br.readLine(); // Место для обработки пользовательских команд... // типа HELP, etc... sock.close(); Теперь req - команда удаленного пользователя. Можно воспользоваться SWITCH/CASE,, можно - IF/ELSE. Но мне почему-то кажется, что ни один из этих способов не является правильным. Может есть более оптимизированные и профессиональные алгоритмы обработки команд?
Для начала было бы неплохо разбить строчку на лексемы: команда и аргументы. А уж отдельно команду сравнивать можно и в switch и как больше нравится.
Great А если нужно будет добавлять новые команды и методы их реализации, а стороннего кодера я к исходникам допускать не хочу? Да и перекомпилляция всего проекта не каждому понравится. (это система электронного документооборота)
censored Оно! В каком виде её лучше хранить? (формат) Попробую использовать HashTable. (пока только этот метод вижу.) <offtop> <subj> Пишу проект на PHP, Java, Pascal, Shell. Надеюсь, администрация не обидится, если алгоритмы синтаксического разбора я буду представлять на одном из этих языков? Мы ведь сейчас обсуждаем алгоритмы и, возможно методы оптимизации %subj%, а не языки </subj> </offtop>
FreeManCPM Уж лучше объединить команды в группы и на каждую группу писать so... типа такие вещи как usage, help, version можно объединить в libhelpcmd.so, причем help и version в libhelpcmd.so.1 Идея неплохая....
Хочу поделиться радостью: Код (Text): [root@dsrv]# as -V -Qy -o processcmd.o processcmd.asm GNU assembler version 2.15.94.0.2.2 (i386-asplinux-linux) using BFD version 2.15.94.0.2.2 20041220 компоновка processcmd (gcc) Done!. Написал вчера таки обработчик команд!!!
Самое простое - хэш имя_команды=обработчик. Т.к. в большинстве случаев формат параметров для каждой команды свой, то особого смысла в предварительной разбивке строки на лексемы нет. Но если есть определённый стандарт (например, параметры командной строки в юниксах), то имеет смысл написать и лексер, который дёргается обработчиком при выборке аргументов.
Есть более сложные, но сводимые к тем же переключателям/таблицам. Если команд немного и не предполагается менять их ежеденевно, IMHO, switch - лучшее решение. Посмотрите на att_getopt.c. Если команд действительно много (сотни), они будут меняться и имеют сложный синтаксис, имеет смысл воспользоваться стандартными генераторами парсеров (Lex/Yacc etc. Сейчас очень моден Coco/R, хотя я рекомендовал бы Flex/Bison) .