in reply to Parsing command string into a hash

Well, you'll need a parser. The grammar is quite straightforward, so it shouldn't be too hard to write one using Parse::RecDescent. What's you question?

Replies are listed 'Best First'.
Re^2: Parsing command string into a hash
by perlpal (Scribe) on Jul 16, 2009 at 14:43 UTC
    I did go through Parse::RecDescent. I couldn't quite understand how to formulate the grammar.

    Any help with that would be greatly appreciated!

      I couldn't quite understand how to formulate the grammar.

      Odd, since it's very similar to what you need to parse. What did you try? At first, focus on the parsing and don't worry about your output. Add that at the end.


      There are problems with the design of your output structure.

      • Why is a non-switch parameter called "param1' in one place and "value" in another?

      • Why would a property of mandatory parameters be called "param1"?

        # Bad - Redundant 'mandatory' => [ { 'param1' => '...', } { 'param2' => '...', } ], # Bad - Hash as an array 'mandatory' => { 'param1' => '...', 'param2' => '...', }, # Ok 'mandatory' => [ { 'param' => '...', ... } { 'param' => '...', ... } ], # Ok 'mandatory' => [ '...', '...', ],
      • What if an alternation contains something other than just a <...> or just a [<...>]? For example, could you have { update | insert }? Your output format doesn't support that.

        By the way, it works out that if any of the terms of an alternation are optional, they all are.

        { ... | [...] | ... }
        is equivalent to
        [ { ... | ... | ... } ]

        That's good, because your design relies on it.

        I meant that i am finding it difficult to define the grammar for the parser .

        Answering your queries :

        > Why is a non-switch parameter called "param1' in one place and "value" in another.
        - this was done to ease the effort i would have to put in the final command generation after the hash is built. All non-switch parameters within mandatory braces are put in the "mandatory hash" with keys as "param1,param2.....".
        the switch parameters within mandatory braces are placed in a separate hash with the switch and corresponding parameter.

        > Why would a property of mandatory parameters be called "param1"?
        - "param1" is not a property of mandatory parameters ,but more of a key name to identify them.

        > What if an alternation contains something other than just a <...> or just a <...>? For example, could you have { update | insert }? Your output format doesn't support that.
        - For alternations , i place all the alternates in an anonymous array in the hash. A crude way of handling them but i''ve just about begun to build a prototype.