arnold(a)skeeve.com wrote in
<202108011948.171JmAcK001895(a)freefriends.org>:
|Douglas McIlroy <douglas.mcilroy(a)dartmouth.edu> wrote:
|
|> In realizing the white paper's desire to "have the parser
|> provide the results to the program", it's likely that the mechanism
|> will, like Yacc, go beyond parsing and invoke semantic actions
|> as it identifies tree nodes.
|
|I have to admit that all this feels like overkill. Parsing options
|is only a very small part of the real work that a program does.
|
|Speaking for myself, I want something simple and regular that will
|get the job done and let me get on with the actual business of
|my software. A grammar just for command-line argument parsing feels
|like the tail wagging the dog: not nearly enough ROI, at least
|for me.
|
|I happen to like the getopt_long interface designed by the GNU
|project. It's easy to learn, setup and use. Once it's in place
|it's set and forget.
By coincidence just last week i stumbled over (actually searched
and fixed) an issue where that terrible command line resorting hit
me where i did not expect it. Ie after changing aspects of
a scripts that affect variable content, where that string then
appended to a string constant and then evaluated-passed to
a program, where the variable content did never contain
a hyphen-minus initially, but after the rewrite. So they saw
a leading hyphen-minus somewhere on the line and turned it into an
option. (The fix was easy, just turn 'X'$Y into 'X'"$Y", it
maybe
should have always been written like that, but it seemed
unnecessary at first.)
|My two cents,
For C++/C i have always had my own one which can long options,
optionally relates long to short options, where the long ones also
can include a help string (all in one string, as in "debug;d;"
N_("identical to -Sdebug") and N_() expands to literal).
I agree with the other post that turning command lines into a tree
of nodes is great, but of course this is hard to define. For
first level only yet (without support for multiplexer commands,
ie, commands where the first command chooses an actual command)
i have this for the mailer i maintain, for some commands already.
It is a pain to write things like the following by hand
mx_CMD_ARG_DESC_SUBCLASS_DEF(call, 2, a_cmd_cad_call){
{mx_CMD_ARG_DESC_SHEXP | mx_CMD_ARG_DESC_HONOUR_STOP,
n_SHEXP_PARSE_TRIM_IFSSPACE}, /* macro name */
{mx_CMD_ARG_DESC_SHEXP | mx_CMD_ARG_DESC_OPTION |
mx_CMD_ARG_DESC_GREEDY | mx_CMD_ARG_DESC_HONOUR_STOP,
n_SHEXP_PARSE_IFS_VAR | n_SHEXP_PARSE_TRIM_IFSSPACE} /* args */
}mx_CMD_ARG_DESC_SUBCLASS_DEF_END;
--steffen
|
|Der Kragenbaer, The moon bear,
|der holt sich munter he cheerfully and one by one
|einen nach dem anderen runter wa.ks himself off
|(By Robert Gernhardt)