Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.014 c
1-1124783767
user51
2005-08-23 11:56
2005.09.11
как проеобразовать string к pwidechar


3-1122729432
r2d2
2005-07-30 17:17
2005.09.11
как обнулить автоикрементное поле в таблице Paradox?


3-1122887461
Kara
2005-08-01 13:11
2005.09.11
Преобразование типов данных


11-1106744649
chum
2005-01-26 16:04
2005.09.11
TabOrder


1-1124747605
kimona
2005-08-23 01:53
2005.09.11
RichEdit and background Image





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский