Re: P::RD and OOP

[email protected] ("nntp.perl.org") Tue, 03 Aug 2004 21:51:19 +0200
Newsgroups perl.recdescent
Message-ID <[email protected]>
Sean O'Rourke wrote:
 > <[email protected]> writes:
 >
 >>Then where do I save those dirs? $Nokia::Gen::self->{SUBREF}
 >>wouldn't work since there is no such variable. And if I use
 >>$main::parser->{SUBREF} then the variable name is hardcoded.
 >
 >
 > From the P::RD manpage, I've found
 >
 >     $thisparser
 >         A reference to the Parse::RecDescent object through which
 >         parsing was initiated.
 >
 > Would this do what you need?  Could you store directories as
 > $thisparser->{DATA}{SUBREF}?

or better: $thisparser->{local}{all}{of}{your}{data}
                          ^^^^^

I use the P::RD heavily in inheritance. But be aware, P::RD
is inheritable but not the precompiled grammars!

I wrote a patch (posted already on this list)
news://nntp.perl.org:119/[email protected]

in order to solve this problem for a project of mine:
Config::Scoped

Study Config::Scoped for OO style parsers, and ask me if you
have problems, but it's very well doceumented. It's released on
CPAN. From the README:

NAME

     Config:Scoped - feature rich configuration file parser


FEATURES

     Config::Scoped has the following highlights as a configuration file
     parser:

     * Complex recursive datastructures to any extent with scalars,
       lists and hashes as elements,

     * As a subset parses any complex Perl datastructures
       (no references and globs) without *do* or *require*,

     * Include files with recursion checks,

     * Controlled macro expansion in double quoted tokens,

     * Lexically scoped parameter assignments and pragma directives,

     * Perl quote like constructs to any extent, '', "", and
       here docs <<,

     * Perl code evaluation in Safe compartments,

     * Caching and restore with MD5 checks to determine
       alterations in the original config files,

     * Standard macro, parameter, declaration redefinition
       validation, may be overridden to validate on semantic
       knowledge,

     * Standard file permission and ownership safety validation,
       may be overridden,

     * Fine control for redefiniton warnings with pragma's
       and other safety checks,

     * Easy inheritable, may be subclassed to build parsers
       with specialized validation features,

     * Condoning syntax checker, semicolons and or commas are not always
       necessary to finish a statement or a list item if the end can be
       guessed by other means like newlines, closing brackets,
       braces etc.,

     * Well spotted messages for syntax errors even within include
       files with correct line numbers and file names,

     * Exception based error handling,

     * etc.,

PREREQUISITES

     Parse::RecDescent, Error

     Standard modules:

         Carp
         Storable
         File::Spec
         File::Basename
         Digest::MD5
         Safe

APPETIZER

Configuration file example:

     # default parameters
     community = public;
     variables = [ ifInOctets, ifOutOctets ];
     oids = {
     ifInOctets  = 1.3.6.1.2.1.2.2.1.10;
     ifOutOctets = 1.3.6.1.2.1.2.2.1.16;
     };

     %warnings parameter off;    ### allow parameter redefinition

     # declarations
     devices rtr001 {
     ports = [ 1, 2, 8, 9 ];
     }

     devices rtr007 {
     community = 'really top secret!';
     ports = [ 1, 2, 3, 4 ];
     }


INSTALLATION

     It's all pure Perl.

     perl Makefile.PL
     make
     make test
     make install

AUTHOR

     Karl Gaissmaier ([email protected])


COPYRIGHT

      Copyright (c) 2004, Karl Gaissmaier. All Rights Reserved.
      This program is free software; you can redistribute it and/or
      modify it under the same terms as Perl itself.



-- 
Karl Gaissmaier       KIZ/Infrastructure, University of Ulm, Germany
Email:[email protected]           Service Group Network