On Tuesday, Jun 15, 2004 David Holden said:
> Hello,
> 
>  I would like to rebuild a parsed string from the datastructure given by 
> autotree.
> 
> For example
> 
> 
> Given the date string "(2001)."
> 
> 
> using the following rules:-
> 
>        Date: lft_bracket Year YearLabel(?) rgt_bracket point
> 
>        Year: /\d{4}/
>        YearLabel: /[a-z]/
>        point: '.'
>        lft_bracket: '('
>        rgt_bracket: ')'
> 
> 
> autotree gives the following datastructure
> 
> $VAR1 = bless( {
>                  'Year' => bless( {
>                                     '__VALUE__' => '2001'
>                                   }, 'Year' ),
>                  '__RULE__' => 'Date',
>                  'point' => bless( {
>                                      '__VALUE__' => '.'
>                                    }, 'point' ),
>                  'lft_bracket' => bless( {
>                                            '__VALUE__' => '('
>                                          }, 'lft_bracket' ),
>                  'rgt_bracket' => bless( {
>                                            '__VALUE__' => ')'
>                                          }, 'rgt_bracket' ),
>                  'YearLabel(?)' => []
>                }, 'Date' );
> 
> I would like to be able to reconstruct the string "(2001)." from this 
> structure the problem I have is that because it is a HASH it does not have 
> order information, e.g. in the above "Year" key comes before "lft_bracket".
> 
> Am I missing somethings?

No.

Basically what you want to do is "unparse" the data.  The "unparser" will 
need to know as much about the syntax as the parser.

autotree gives you a "best guess" as to what you need, but if you want to 
have a structure that contains ordering information, you will need to take 
control of the structure that gets created.

To do so, you do not need to abandon autotree:

use strict;
use vars qw($parser $text %top);
use Data::Dumper;
use Parse::RecDescent;
$RD_WARN  = 1;
$RD_HINT  = 1;
$RD_TRACE = 120;
use constant GRAMMAR => q(

<autotree>
Date: lft_bracket Year YearLabel(?) rgt_bracket point [EMAIL PROTECTED]

       Year: /\d{4}/
       YearLabel: /[a-z]/
       point: '.'
       lft_bracket: '('
       rgt_bracket: ')'


);

$parser = Parse::RecDescent->new(GRAMMAR) or die 'Bad grammar';
$text .= $_ while (<DATA>);
print Dumper($parser->Date($text));

__DATA__
(2001).


> 
>  thanks in advance.
> 
>     Dave.
> 
> 
> 
> 
> 
> 
> -- 
> Dr. David Holden.
> 
> Thanks in advance:-
> Please avoid sending me Word or PowerPoint attachments.
> See: <http://www.fsf.org/philosophy/no-word-attachments.html>
> 
> Show me your papers..: http://www.no2id.net/index.html
> 
> Public GPG key available on request.
> -------------------------------------------------------------


--
 Intel, Corp.
 5000 W. Chandler Blvd.
 Chandler, AZ 85226

-- 
 Intel, Corp.
 5000 W. Chandler Blvd.
 Chandler, AZ  85226


Reply via email to