










Sig: Usando autoscore
Sup: RecDescent
Ant: Las directivas rulevar y
Err: Si hallas una errata ...
La directiva <score: ...> toma como argumento
una expresión numérica que indica la prioridad de la
producción. La directiva lleva un <reject> asociado.
La producción con puntuación mas alta es elegida (salvo
que hubiera otra que hubiera aceptado directamente).
El problema anterior puede ser resuelto como sigue:
#!/usr/local/bin/perl5.8.0 -w
use strict;
use Parse::RecDescent;
use Data::Dumper;
#$::RD_TRACE = 1;
my $grammar = q{
line : <leftop: value ',' value>
<score: @{$item[1]}>
| <leftop: datum ':' datum>
<score: @{$item[1]}>
| <leftop: field ";" field>
<score: @{$item[1]}>
value: /[^,]*/
datum: /[^:]*/
field: /[^;]*/
};
my $parse = Parse::RecDescent->new($grammar);
my $line;
while ($line = <>) {
print "$line\n";
my $result = $parse->line($line);
if (defined($result)) { print Dumper($result); }
else { print "Cadena no válida\n"; }
}
Al darle como entrada el fichero
$ cat file3.txt
1:2:3,3:4;44
1,2:2,3:3;33
1;2:2;3:3;44
Obtenemos la ejecución:
$ ./score.pl file3.txt
1:2:3,3:4;44
$VAR1 = [ '1', '2', '3,3', '4;44 ' ];
1,2:2,3:3;33
$VAR1 = [ '1', '2:2', '3:3;33 ' ];
1;2:2;3:3;44
$VAR1 = [ '1', '2:2', '3:3', '44 ' ];











Sig: Usando autoscore
Sup: RecDescent
Ant: Las directivas rulevar y
Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22