Hello, I'm new to P::RD, and I'm writing my first Perl module, which
I'm calling Parse::CurlyBlock, and will release to CPAN when its mature.

Its for a genaral configuration parsing task, in the style of BIND
named.conf syntax, only a bit more genaral. Here are some examples.

#my $data = 'foo;';
#my $data = 'foo bar;';
#my $data = 'foo { baz; };';
#my $data = 'foo bar { baz; };';
#my $data = 'foo bar { baz "bux"; one two; };';
my $data = 'foo bar far { baz "bux"; one two; } { three four; };
            alpha beta;';
#my $data = 'foo; bar;';

Statements are seperated by a ";". The genaral form of each statement is

word args(s?) block(s?). So all af the above are valid. The last one
consists of two statements, obviously. Blocks are surrounded by "{" and
"}". words can be quoted or bare.

Here is the grammar as it stands

    my $grammar = q{

                        { my @statements }

        startrule       : statement(s) eof
                        {
                            push @statements, \$item[1];
                        }

        statement       : word arg(s?) ";"
                        | word arg(s?) block(s?) ";"
                        | <error?>
                        {
                            my %result;
                            $result{'args'} = $item{'arg(s?)'};
                            $result{'blocks'} = $item{'block(s?)'};
                            $return = { $item{'word'} => \%result };
                            $return;
                        }

        word            : bareword
                        | quotedword
                        { $return = $item[1] }

        arg             : word
                        { $return = $item[1] }

        block           : "{" statement(s) "}"
                        { $return = $item[2] }

        eof             : /^\Z/
                        { $return = $item[1] }

        bareword        : /\w+/
                        { $return = $item[1] }

        quotedword      : / $Regexp::Common::RE{quoted} /x
                        { $return = $item[1] =~ m/^ ["'`] (.*) ["'`] $/x; }

    };

I'm trying to get out a data structure such as the following.

my $data = 'foo bar far { baz "bux"; one two; } { three four; };
            alpha beta;';

[   # List of statements
    'foo' => { 'args' => [ 'bar', 'far' ]
             { 'blocks' => [ [ 'baz' => 'bux',
                               'one' => 'two' ],
                             [ 'three' => 'four' ] ] },
    'alpha' => { 'args' => [ 'beta' ] }
]

I think it reaches a good balance of flexibility, and managability.
Anyway, I can't get the thing to work (obvious, since I'm writing to the
list). I'm having problems with the <error?> in the statement rule (or
rather, with the rule itself).

       ERROR (line 1): Invalid statement: Was expecting ';' but found "{ baz
                       "bux"; one two; } { three four; };" instead

When I use Data::Dumper to dump the @statements in startrule, it also
shows a ';' as being entered into the structure.

$VAR1 = \[
            {
              'foo' => {
                         'blocks' => [
                                       [
                                         ';',
                                         ';'
                                       ],
                                       [
                                         ';'
                                       ]
                                     ],
                         'args' => [
                                     'bar',
                                     'far'
                                   ]
                       }
            },
            ';'
          ];

I've read a couple of tutorials, and the perldoc for P::RD, but there
isn't much discussion that I've found on dealing with this sort of
parsing problem (largely bracketed expressions).

Also, startrule is always returning '1', according to Data::Dumper(
$parser->startrule( $content ) );  What should I be doing to remedy
that?

Many thanks for your time.

PS. Please be gentle. I flunked Theory of Computing ;^)

-- 
Cameron Kerr
[EMAIL PROTECTED] : http://nzgeeks.org/cameron/
Empowered by Perl!

Reply via email to