Práctica: Autoacciones

Extienda Parse::Yapp con una directiva %autoaction CODE la cuál cambia la acción por defecto. Cuando una regla de producción no tenga una acción asociada, en vez de ejecutarse la acción yapp por defecto se ejecutará el código especificado en CODE. La directiva podrá aparecer en la parte de cabecera o en el cuerpo del programa yapp en una sóla línea aparte. Si aparece en el cuerpo no debe hacerlo en medio de una regla.

Sigue un ejemplo de uso:

%{
use Data::Dumper;
my %tree_name = ('=' => 'eq', '+' => 'plus', '-' => 'minus', 
                 '*' => 'times', '/' => 'divide');
%}
%right  '='
%left   '-' '+'
%left   '*' '/'
%left   NEG
%autoaction { [$tree_name{$_[2]}, $_[1], $_[3]] }

%%
input:               { undef }
        | input line { undef } 
;

line:     '\n'         { undef }
        | exp '\n'     { print Dumper($_[1]); }
        | error '\n'   { $_[0]->YYErrok }
;

exp:        NUM                 { $_[1] }
        |   VAR                 { $_[1] }
        |   VAR '=' exp | exp '+' exp | exp '-' exp | exp '*' exp | exp '/' exp      
        |   '-' exp %prec NEG   { ['neg', $_[2]] }
        |   '(' exp ')'         { $_[2] }
;

%%
y un ejemplo de ejecución:
$ ./useautoaction1.pl
2+3*4
^D
$VAR1 = [
          'plus',
          '2',
          [ 'times', '3', '4' ]
        ];
Analice la adecuación de los mensajes de error emitidos por el compilador de Perl cuando el código en la auto-acción contiene errores. ¿Son apropiados los números de línea?

Tenga en cuenta los siguientes consejos:

Casiano Rodríguez León
2013-04-23