










 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