FAQ
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?

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.
-------------------------------------------------------------

Search Discussions

  • Ron D. Smith at Jun 15, 2004 at 3:36 pm

    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 {\@item}

    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

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouprecdescent @
categoriesperl
postedJun 15, '04 at 3:18p
activeJun 15, '04 at 3:36p
posts2
users2
websitemetacpan.org...

2 users in discussion

David Holden: 1 post Ron D. Smith: 1 post

People

Translate

site design / logo © 2019 Grokbase