Парсинг командной строки

Разработка на C# под linux
https://fsharpforfunandprofit.com/posts/pattern-matching-command-line/
EBNF и Reflection
https://github.com/gsscoder/commandline

Mono.Options -> NDesk.Options -> ManyConsole
https://github.com/fschwiet/ManyConsole

http://stackoverflow.com/questions/491595/best-way-to-parse-command-line-arguments-in-c

http://dgondotnet.blogspot.dk/2013/08/my-last-console-application-manyconsole.html

Mono.Options

https://github.com/mono/mono/blob/master/mcs/class/Mono.Options/Mono.Options/Options.cs
http://tirania.org/blog/archive/2008/Oct-14.html
https://www.nuget.org/packages/Mono.Options/
https://components.xamarin.com/gettingstarted/mono.options?version=4.2.2.0

в репозитории
https://github.com/mono/mono/tree/master/mcs/class/Mono.Options
есть:
- файл проекта с опциями сборки
- документация (которую непонятно как обрабатывать)
- тесты

https://devmanual.gentoo.org/ebuild-writing/variables/index.html#src_uri

Как работает Mono.Options

И как его использовать.
Основная закавыка - я вижу, как указать параметру, является ли он обязательным (=) необязательным (:) или просто параметром без значения
я не вижу, как указать программе, чтобы параметр встерчался только один раз (и такая ошибка вероятно не выводится как ошибка)

NDesk.Options

http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionSet.html
If you are not familiar with NDesk.Options, you should start by using that: http://www.ndesk.org/Options
the main downside in Mono.Options (the lack of the concept of njommand”) has been addressed.

Our commands must override .Run() and declare their arguments/delegates-to-execute pairs in their constructors in a pretty sensible way.

provide me a collection of commands (that can be auto-magically discovered
ConsoleCommandDispatcher.FindCommandsInSameAssemblyAs(typeof(Program)))

provide the command-line arguments

tell where to write messages

ManyConsole

Have Program.Main call ConsoleCommandDispatcher (see https://github.com/fschwiet/ManyConsole/blob/master/SampleConsole/Program.cs)



Multi-Arguments

Inheriting the delegate philosophy, defining multi-arguments is nothing special, but the delegate will be executed multiple times, so adding the values to a list is easy enough.

Interactivity

ability to interpret interactive commands ļonsole-mode commands

docopt

http://stackoverflow.com/questions/491595/best-way-to-parse-command-line-arguments-in-c

Другие проекты

Вообще говоря, проектов на github очень много
C++-ники рекомендуют boost program options.
умеет кучу всякого: и параметры, и через переменные окружения, и через response-файлы

Как вообще парсят параметры?

Ну, если параметры описаны как-то (например есть специальный язык docopt.org)
и программа описывается как-то (при помощи reflection)
то между двумя этими описаниями можно задать связи (откуда брать, куда класть)
эти связи могут быть описаны с помощью некоего синтаксиса. Многие предпочитают использовать синтаксис языка и разбирать его стандартным компилятором языка,
для того, чтобы программист, использующий библиотеку был в своей тарелке.

Какие бывают фичи:
синглтон, чтобы не создавать объект "var par = new Parameters();"
остаётся только вызвать Singleton.Parser.Parse(argv) вместо par.Parse(argv);
остальной код можно разметить например аттрибутами и тогда Parse разложит распарсенное куда надо и ошибки отработает и отрепортит и справку выведет...

Если есть связка между описанием артефакта из входных данных и описанием программного кода, который этот артефакт будет хранить,
то можно сократить описание артефакта и перестать указывать тип артефакта, так как этот тип можно извлечь из описания программного кода
это относится в частности к boolean типам

Куда в таком подходе укладывать EBNF? В глобальный атрибут?
Как будет происходить локализация текстов сообщений? (очевидно ресурсами, эти ресурсы должны быть упомянуты в том глобальном атрибуте?)