<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' ] ], ';' ];
<commit>
en la gramática anterior?
(supuesto que la entrada es iEt iEt o e o ;
)
¿Se obtiene algún beneficio?