[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