next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Análisis Sintáctico con yacc Sup: Transformaciones Árbol con Parse::Eyapp Ant: Transformaciones de Árboles con Err: Si hallas una errata ...

La opción SEVERITY

La opción SEVERITY del constructor Parse::Eyapp::Treeregexp::new controla la forma en la que se interpreta el éxito de un casamiento en lo que se refiere al número de hijos del nodo. Para ilustrar su uso consideremos el siguiente ejemplo que hace uso de Rule6 la gramática que fue introducida en la sección [*] (página [*]).
nereida:~/src/perl/YappWithDefaultAction/examples> cat -n numchildren.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Rule6;
 4  use Data::Dumper;
 5  use Parse::Eyapp::Treeregexp;
 6  use Parse::Eyapp::Node;
 7
 8  our @all;
 9  my $severity = shift || 0;
10
11  my $transform = Parse::Eyapp::Treeregexp->new( STRING => q{
12    zero_times_whatever: TIMES(NUM($x)) and { $x->{attr} == 0 } => { $_[0] = $NUM }
13  },
14  SEVERITY => $severity,
15  );
16
17  $transform->generate;
18  $Data::Dumper::Indent = 1;
19  my $parser = new Rule6();
20  my $t = $parser->Run;
21  $t->s(@all);
22  print Dumper($t);
Este programa obtiene el nivel de severidad a usar desde la línea de comandos (línea 9). Nótese que la especificación de TIMES en la transformación zero_times_whatever este aparece con un único hijo. Existen varias interpretaciones de la expresión que se corresponden con los niveles de SEVERITY : En la siguiente ejecución el nivel especificado es cero. La expresión 0*2 casa y es modificada.
nereida:~/src/perl/YappWithDefaultAction/examples> numchildren.pl 0
0*2
$VAR1 = bless( {
  'children' => [
    bless( {
      'children' => [],
      'attr' => 0,
      'token' => 'NUM'
    }, 'TERMINAL' )
  ]
}, 'NUM' );
En la siguiente ejecución el nivel especificado es uno. La expresión 0*2 no casa pero no se avisa ni se considera un error la presencia de un nodo TIMES con una aridad distinta.
nereida:~/src/perl/YappWithDefaultAction/examples> numchildren.pl 1
0*2
$VAR1 = bless( {
  'children' => [
    bless( {
      'children' => [
        bless( {
          'children' => [],
          'attr' => '0',
          'token' => 'NUM'
        }, 'TERMINAL' )
      ]
    }, 'NUM' ),
    bless( {
      'children' => [
        bless( {
          'children' => [],
          'attr' => '2',
          'token' => 'NUM'
        }, 'TERMINAL' )
      ]
    }, 'NUM' )
  ]
}, 'TIMES' );
En la siguiente ejecución el nivel especificado es dos. La expresión 0*2 no casa y se avisa de la presencia de un nodo TIMES con una aridad distinta:
nereida:~/src/perl/YappWithDefaultAction/examples> numchildren.pl 2
0*2
Warning! found node TIMES with 2 children.
Expected 1 children (see line 12 of numchildren.pl)"
$VAR1 = bless( {
  'children' => [
    bless( {
      'children' => [
        bless( {
          'children' => [],
          'attr' => '0',
          'token' => 'NUM'
        }, 'TERMINAL' )
      ]
    }, 'NUM' ),
    bless( {
      'children' => [
        bless( {
          'children' => [],
          'attr' => '2',
          'token' => 'NUM'
        }, 'TERMINAL' )
      ]
    }, 'NUM' )
  ]
}, 'TIMES' );
En la última ejecución el nivel especificado es tres. El programa se detiene ante la presencia de un nodo TIMES con una aridad distinta:
nereida:~/src/perl/YappWithDefaultAction/examples> numchildren.pl 3
0*2
Error! found node TIMES with 2 children.
Expected 1 children (see line 12 of numchildren.pl)"
 at (eval 3) line 28


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Análisis Sintáctico con yacc Sup: Transformaciones Árbol con Parse::Eyapp Ant: Transformaciones de Árboles con Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22