

<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?

