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 :
TIMES
con un número de hijos diferente quiero ser avisado
TIMES
con un número de hijos diferente
quiero que se considere un error
(mis nodos tiene aridad fija)
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