next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Las Directivas skip y Sup: RecDescent Ant: La ambiguedad de las Err: Si hallas una errata ...

La directiva commit

El excesivo costo de RD puede aliviarse haciendo uso de las directivas <commit> y <uncommit>, las cuales permiten podar el árbol de búsqueda. Una directiva <commit> le indica al analizador que debe ignorar las producciones subsiguientes si la producción actual fracasa. Es posible cambiar esta conducta usando posteriormente la directiva <uncommit>, la cual revoca el estatus del último <commit>. Así la gramática del if-then-else puede reescribirse como sigue:
$ cat -n ifthenelse_commit.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Parse::RecDescent;
 4  use Data::Dumper;
 5
 6  $::RD_TRACE = 1;
 7  $::RD_AUTOACTION =  q{ [@item] };
 8  my $grammar = q{
 9    prog : st ';'
10    st : 'iEt' <commit> st <uncommit> 'e' st
11       | 'iEt' <commit> st
12       | 'o' { 'o' }
13  };
14  ...

en este caso, si no se encuentra una sentencia después de iEt se producirá directamente el fracaso de st sin intentar las otras dos reglas. Sin embargo, si no se encuentra un e después de la sentencia si que se va a intentar la regla de la línea 11, ya que la directiva <uncommit> revoca el <commit> previo.

Observe el resultado de la ejecución: la acción automática de construcción del árbol da lugar a la inserción de los valores devueltos por las directivas <commit>:

./ifthenelse_commit.pl file4.txt

iEt iEt o e o ;

$VAR1 = [ 'prog',
          [ 'st',
            'iEt', 1, [ 'st',
                            'iEt', 1, 'o', 1, 'e', 'o'
                      ]
          ],
          ';'
        ];

Ejercicio 6.4.1   ¿Cuanto ahorro produce en este caso, el uso de las directivas <commit> en la gramática anterior? (supuesto que la entrada es iEt iEt o e o ;) ¿Se obtiene algún beneficio?


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Las Directivas skip y Sup: RecDescent Ant: La ambiguedad de las Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22