Разработка командного интерпретатора (как это сделать правильно?)

Тема в разделе "WASM.HEAP", создана пользователем device, 9 авг 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Вот, собственно, дошел в проекте до такого участка:

    Код (Text):
    1. void run(){
    2. try{
    3. PrintWriter pw = new PrintWriter ( new OutputStreamWriter (sock.getOutputStream(), "utf8"), true);
    4.  
    5. BufferedReader br = new BufferedReader (new InputStreamReader (sock.getInputStream(), "utf8"));
    6. String req = br.readLine();
    7.  
    8. // Место для обработки пользовательских команд...
    9. // типа HELP, etc...
    10.  
    11. sock.close();
    Теперь req - команда удаленного пользователя. Можно воспользоваться SWITCH/CASE,, можно - IF/ELSE. Но мне почему-то кажется, что ни один из этих способов не является правильным. Может есть более оптимизированные и профессиональные алгоритмы обработки команд?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Для начала было бы неплохо разбить строчку на лексемы: команда и аргументы. А уж отдельно команду сравнивать можно и в switch и как больше нравится.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    device
    таблица комманд?
     
  4. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Great
    А если нужно будет добавлять новые команды и методы их реализации, а стороннего кодера я к исходникам допускать не хочу?
    Да и перекомпилляция всего проекта не каждому понравится.
    (это система электронного документооборота)
     
  5. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    censored
    Оно! В каком виде её лучше хранить? (формат)

    Попробую использовать HashTable. (пока только этот метод вижу.)

    <offtop>
    <subj>
    Пишу проект на PHP, Java, Pascal, Shell. Надеюсь, администрация не обидится, если алгоритмы синтаксического разбора я буду представлять на одном из этих языков? Мы ведь сейчас обсуждаем алгоритмы и, возможно методы оптимизации %subj%, а не языки
    </subj>
    </offtop>
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    на каждую каманду свою длл :) типа имя_команды.длл.
     
  7. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    FreeManCPM
    Уж лучше объединить команды в группы и на каждую группу писать so...

    типа такие вещи как usage, help, version можно объединить в libhelpcmd.so, причем help и version в libhelpcmd.so.1
    Идея неплохая....
     
  8. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Хочу поделиться радостью:
    Код (Text):
    1. [root@dsrv]# as -V -Qy -o processcmd.o processcmd.asm
    2. GNU assembler version 2.15.94.0.2.2 (i386-asplinux-linux) using BFD version 2.15.94.0.2.2 20041220
    3. компоновка processcmd (gcc)
    4. Done!.
    Написал вчера таки обработчик команд!!!
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Самое простое - хэш имя_команды=обработчик. Т.к. в большинстве случаев формат параметров для каждой команды свой, то особого смысла в предварительной разбивке строки на лексемы нет. Но если есть определённый стандарт (например, параметры командной строки в юниксах), то имеет смысл написать и лексер, который дёргается обработчиком при выборке аргументов.
     
  10. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Есть более сложные, но сводимые к тем же переключателям/таблицам.
    Если команд немного и не предполагается менять их ежеденевно, IMHO, switch - лучшее решение. Посмотрите на att_getopt.c. Если команд действительно много (сотни), они будут меняться и имеют сложный синтаксис, имеет смысл воспользоваться стандартными генераторами парсеров (Lex/Yacc etc. Сейчас очень моден Coco/R, хотя я рекомендовал бы Flex/Bison) .