[Cascavel-pm] Gramáticas, Parse::RecDescent (era: Casos de Sucesso)

eden edencardim em gmail.com
Terça Agosto 7 11:38:37 PDT 2007


On 8/7/07, Nelson Ferraz <nferraz em gmail.com> wrote:
> Realmente -- pelo pouco que usei já tive essa impressão.
>
> No entanto ainda não consegui perceber como retornar valores da
> gramática. Isto é; eu consigo verificar se o texto é válido, mas não
> consigo extrair as informações dele. Por exemplo:
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> use Parse::RecDescent;
>
> my $grammar = q{
>                  ini_file: section(s)
>                      section: section_label parameter(s) | <error>
>                          section_label: /\s*\[\w+\]\s*/
>                          parameter: key '=' value
>                              key: /\w+/
>                              value: /.*\n/
> };
>
> my $parser = Parse::RecDescent->new($grammar) or die "Invalid grammar!
> \n";
>
> my $text = do { local $/; <DATA> };
>
> if ( defined( my $result = $parser->ini_file($text) ) ) {
>      print "It's a valid input!\n";
>      use Data::Dumper;
>      print Dumper $result;
> }
> else {
>      print "No good.\n";
> }
>
> __DATA__
>
> [foo]
>
> a=1
> b=2
> c=3
>
> [bar]
>
> x=a
> y=b
> z=c
>
> __END__
>
> Como extrair essas informações (sections, parameters, values) de
> forma que elas possam ser trabalhadas?

Se me lembro bem, o valor retornado pela última action de uma regra é
o valor que será retornado pelo reconhecimento da regra toda. Você
pode usar isso para construir uma estrutura customizada ou ativar a
diretiva <autotree> para construir uma árvore padrão:

my $grammar = q{
   <autotree>

    ini_file: section(s)
    section: section_label parameter(s) | <error>
    section_label: /\s*\[\w+\]\s*/
    parameter: key '=' value
    key: /\w+/
    value: /.*\n/
};

-- 
edenc.vox.com


Mais detalhes sobre a lista de discussão Cascavel-pm