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:
yapp
su módulo use
una orden como: yapp -m Parse::Yapp::Parse Parse.yp
.
Este es un caso en que el nombre del fichero de salida (Parse.pm
)
y el nómbre del package Parse::Yapp::Parse
no coinciden.
Este es un caso en que el nombre del fichero de salida (Parse.pm
)
y el nómbre del package Parse::Yapp::Parse
no coinciden.
Parse::Yapp
en su ordenador.
El compilador de Perl va a intentar cargar la instalada.
Para ello en su versión del script yapp
puede incluir
una línea que le indique al compilador que debe buscar primero
en el lugar en el que se encuentra nuestra librería:
BEGIN { unshift @INC, '/home/lhp/Lperl/src/yapp/Parse-Yapp-Auto/lib/' }
Yapp
que el usuario ha escrito el
código de la autoacción en aquellas reglas en las que no existe
código explícito asociado. Es posible realizar esta práctica modificando
sólo el fichero YappParse.yp
. El código original
Yapp
usa undef
para indicar, en el campo adecuado, que una acción no fué definida.
La idea es sustituir ese undef
por el código asociado con la
autoacción:
my($code)= $autoaction? $autoaction:undef;