Форум: "Начинающим";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизАлгоритм разбора параметров командной строки Найти похожие ветки
← →
Серджио_Точини (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c