Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

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

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

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


 
X9 ©   (2005-08-05 19:24) [1]

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


 
Ega23 ©   (2005-08-05 19:54) [2]

ParamCount, ParamStr(N) ?


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

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

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

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

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


 
Adder ©   (2005-08-05 23:02) [4]

Жаль, под рукой нету 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


 
Piter ©   (2005-08-05 23:32) [5]

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

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


 
Piter ©   (2005-08-05 23:36) [6]

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


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

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


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

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


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

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


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

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

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


 
Anatoly Podgoretsky ©   (2005-08-06 12:54) [10]

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


 
Anatoly Podgoretsky ©   (2005-08-06 12:57) [11]

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


 
GuAV ©   (2005-08-06 15:54) [12]


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

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


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

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


 
имя   (2005-08-06 17:03) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2005.09.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
14-1124138602
Германн
2005-08-16 00:43
2005.09.11
Файлы *.eps. Если кто с ними работал подскажите, плиз!


14-1124434567
Ксардас
2005-08-19 10:56
2005.09.11
Ктонить знает какой файл нужно удалить,чтоб...


14-1124216995
rts111
2005-08-16 22:29
2005.09.11
Test


3-1122447485
Polyak
2005-07-27 10:58
2005.09.11
Как сжать базу ????


11-1106572108
sldragon
2005-01-24 16:08
2005.09.11
MinimizeIcon in the ToolWindow