![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм разбора параметров командной строки
Серджио_Точини © (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. Она как раз этим и занимается.