$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: David B. Held (dheld_at_[hidden])
Date: 2002-01-22 15:49:43
-----Original Message-----
From: Vladimir Prus <ghost_at_[hidden]>
To: boost_at_[hidden] <boost_at_[hidden]>
Date: Monday, January 21, 2002 05:50 AM
Subject: [boost] Command line syntaxes
>[...]
>I'd like to ask that we don't start "Spirit vs. hand-make parser"
discussion
>once again.
>[...]
20 minutes later, Vladimir writes...
>HartmutKaiser_at_[hidden] wrote:
>> Vladimir Prus wrote:
>> > "-bar" can be interpreted, depending on the styles user wants
>> > as either:
>> > 1) Three short options
>> > 2) Short option followed by parameter
>> > 3) Long option
>> > Can you give an *example* of how this can be handled with Spirit.
>>
>> char const *option_to_parse = "-your_option_here";
>> char const *end_of_option = option_to_parse+strlen(option_to_parse);
>>
>> // 1) Three short options
>[snip]
>> // 2) Short option followed by parameter
>[snip]
>> // 3) Long option
>[snip]
>
>And how do I specify that "-xy" should be treated as two options when 'x'
>takes no parameter and as an option with parameter otherwise? How will I
>detect the case when there short option "f" and there's long option "foo",
in
>which case "-f" can mean either the short option or the abbreviated long
one?
Am I the only person that detects an inconsistency here?
To answer the questions posed, and only the questions, I present:
1) -x takes no parameter:
rule<> cla =
lexeme[
chlit('-') >> +(
chlit('x')[&handle_option_x] |
chlit('y')[&handle_option_y]
)];
2) -x takes one parameter:
rule<> cla =
*(
strlit("-x") >> lexeme[*(anychar - ' ')][&handle_x_param] |
strlit("-y")
);
3) -x takes a parameter iff -b has already been encountered as an
option:
rule<> x_no_param =
lexeme[
*(
*chlit(' ') >> chlit('-') >>
+(
chlit('x')[&handle_option_x] |
chlit('y')[&handle_option_y] |
) >>
) >>
+(
chlit('b')[&handle_option_b] |
chlit('y')[&handle_option_y]
)
];
rule<> x_param =
lexeme[
*(
*chlit(' ') >> chlit('-') >>
+(
chlit('x') >> lexeme[*(anychar - ' ')][&handle_x_param] |
chlit('y')[&handle_option_y] |
chlit('b')[&handle_option_b]
)
)
];
rule<> cla =
x_no_param >> x_param;
4) -f (short) is preferred over -f[oo] (long)
rule<> cla =
lexeme[
*(
chlit('-') >>
(
chlit('f')[&handle_option_f] |
(
strlit("fo") |
strlit("foo")
)[&handle_option_foo]
)
)
];
Note that if the final question really means: "How will the framework
detect when I have specified both a short option -f and an
abbreviated long option -foo, and an ambiguity results?", my
response is: Any framework will have to deal with the problem, if so
desired, and certainly before parsing begins. Therefore, any
solution is independent of the parser(s).
Dave