Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм разбора параметров командной строки


Серджио_Точини ©   (2005-08-05 18:59:00) 

Доброго времени суток!
Интересует сабж... причем (1) универсальный (т.е. не для какого-то конкретного случая и (2) такой, как это реализовано в консольных программах Linux'а. Т.е. именно с поддержкой коротких/длинных ключей (например, -k/--key), с возможностью группировки коротких ключей (например, ls -la), ну и т.д.
Подозреваю, что это не особо сложная задача для самостоятельной реализации, но не очень хочется изобретать велосипед. Лучше чем это уже реализовано у меня все равно не получится. Посему прошу поделиться ссылками или личным опытом.
Заранее благодарен.


  (2005-08-06 17:03:00) [1]

Удалено модератором


Серджио_Точини   (2005-08-06 16:47:00) [2]

Ну я вообще POSIX и имел ввиду, просто понятие Linux народу ближе ;) Хотя... если не ошибаюсь Linux вроде как претендует нолное соответствие POSIX, ну да ладно... А по поводу конечного автомата я в курсе, наверно этим ща и заморочусь... Просто хотел найти уже готовое решение, а не делать с нуля тоже самое что уже реализовывалось не одну сотню (тысячу) раз.


GuAV   (2005-08-06 15:54:00) [3]


> X9 ©   (06.08.05 0:44) [9][Ответить]

В случае сложного алгоритма разбора IMHO лучше использовать не ParamStr, а GetCommandLine.


Anatoly Podgoretsky   (2005-08-06 12:57:00) [4]

Для однобуквенных можно вспользоваться множеством.


Anatoly Podgoretsky   (2005-08-06 12:54:00) [5]

Никакого общего алгоритма нет, поскольку форматы определяет автор. Линукс здесь не исключение, за исключением POSIX


X9   (2005-08-06 00:44:00) [6]

Серджио_Точини (05.08.05 22:32) [3]
Ну что же, тогда лучше IMHO будет вручную (если не критично по времени, если критично, то загляните на gnu.org). Вот простейший алгоритм действий:
1) Получаем "первый параметр" (так "думает" Delph) командной строки с помощью ParamStr(1). Смотрим первый символ - если это "-", то это значит:
   а) Началась строка коротких аргументов (если следующий символ не равен "-";
   б) Началась строка длинных аргументов (в противоположность пункту а);
   в) Указывается значение аргумента по умолчанию (например, имя файла для текстового редактора).
Из пункта в) следует, что лучше, если все значения аргументов заключать в кавычки. Если этого не сделать, задача серьёзно услодняется: представьте себе, что есть некий файл с именем "-myfile", где каждый символ имени файла может быть интерпретирован как отдельный параметр. Останоыимся на том, что Вы всё-таки решили использовать кавычки.
2) В цикле доходим до первого пробела (либо кавычек), обрабатывая попадающиеся ключи, если видим кавычки, их содержимое расцениваем как аргумент, если нет - то снова 1).

Лучше всего (IMHO) было бы завести 2 массива типа string: один со строками самих параметров, другой - со значениями аргументов. Это решение, хоть и не оптимальное, зато универсальное и легко масштабируемое.


Alexander Panov   (2005-08-06 00:40:00) [7]

Джо ©   (06.08.05 0:34) [7]
По-моему, для такой задачи прямо напрашивается нарисовать конечный автомат.


Вот именно. И после изучения этой темы разбор будет весьма простой задачей.

А ветка перенесена потому, что автор не хочет заниматься этим. В основных конференциях разжевывать и готовый код писать никто не будет.
А в конференции для начинающих может кто и ответит соотвентствующим образом.


Джо   (2005-08-06 00:34:00) [8]

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


Piter   (2005-08-05 23:36:00) [9]

Удалено модератором


Piter   (2005-08-05 23:32:00) [10]

Нда, непонятна почему ветка перемещена.

Синтаксический разбор выражений - очень непростая задача. Я не знаю как сделать оптимально.


Adder   (2005-08-05 23:02:00) [11]

Жаль, под рукой нету Linux'а с его открытыми исходниками :)
Зато есть Boost ( http://www.boost.org/index.htm)

http://www.boost.org/doc/html/program_options.html
А здесь можно найти исходники:
http://sourceforge.net/project/showfiles.php?group_id=7586


Серджио_Точини   (2005-08-05 22:32:00) [12]

> X9
Немножко не то. Определять ключи так, как делает это эта функция я так могу.

> Ega23
Как получить переданные программе параметры я знаю, проблема их грамотно разобрать.

И вообще, я не понимаю, почему эту ветку перенесли в данный раздел. Ну да ладно, Вам виднее :)

Приведу конкретный пример, как могут быть переданы параметры. Допустим прога запущена с параметрами '-a -b -c'. Но пользователь точно так же задать '-abc', что будет тоже самое. Не знаю, как это называется грамотно, назовем это комбинированным ключом. В Linux'е это позволяет делать любая прога. Так же у большинства Linux'овых программ у каждого ключа есть "длинный" аналог, т.е. таже строка может выглядеть скажем так '--apple --banana --coconut'(если условиться, что -a = --apple, -b = --banana и т.д.). Ну и естественно допустимы строки типа '-ac --banana'... продолжать можно до бесконечности. Также стоит заметить, что в строке помимо ключей могут встречать и какие-нибудь параметры/опции, требующие значений. Например '-ab --coconut -X 500'. Вот меня и интересует алгоритм, способный разбирать подобное. Жаль, под рукой нету Linux'а с его открытыми исходниками :)


Ega23   (2005-08-05 19:54:00) [13]

ParamCount, ParamStr(N) ?


X9   (2005-08-05 19:24:00) [14]

Посмотрите Delphi Help по функции FindCmdLineSwitch. Она как раз этим и занимается.


Наверх

Титульная страница Поиск, карта сайта Написать письмо