










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 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 :
- 0: Quiero decir que tiene al menos un hijo. No me importa si tiene mas
- 1: Para que case tiene que tener exactamente un hijo
- 2: Para que case tiene que tener exactamente un hijo. Si aparece un nodo
TIMES con un número de hijos diferente quiero ser avisado
- 3: Para que case tiene que tener exactamente un hijo. Si aparece un nodo
TIMES con un número de hijos diferente
quiero que se considere un error
(mis nodos tiene aridad fija)
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











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