you can do

sub My_Actions::do_extract_rate {
    my ( undef, $t1, undef, $t2 ) = @_;
    return [ $t1, $t2 ];
}

this will return [ [ 'EUR', '089980' ], [ 'GBP', '063886' ], [ 'AUD',
'135358' ] ] as the parse value.


On Sun, Aug 16, 2015 at 6:41 PM, <phi...@free.fr> wrote:

> Removing ::first did the trick, thanks.
>
> Is there a more idiomatic way in MARPA to store the currency labels and
> their respective rates than to store them in a hash in the closure?
>
> my %rate_hash = ();...
>
> and then
>
> sub My_Actions::do_extract_rate {
>     my ( undef, $t1, undef, $t2 ) = @_;
>     $rate_hash{$t1} = $t2;
> }
>
>
>
>
>
>
> Le dimanche 16 août 2015 17:06:40 UTC+2, Jeffrey Kegler a écrit :
>>
>> As a hasty guess (I have not tested it) the problem may be here:
>>
>>      Catx ::= Expression+ action => ::first
>>
>> The ":first" causes only the first expression to be seen by the semantics.
>>
>> Re no '\w{3}'  -- here 'the better became the enemy of the good'.  I
>> developed a scheme for efficient binarization of arbitrary counts and
>> sequences, but it won't come out in Marpa::R2, which is now frozen.  The
>> next version is Kollos, into which the binarized implementation is already
>> coded.  But I've hear that someone else has a layer on top of Marpa::R2,
>> which may come out shortly, and might include that feature and a lot of
>> other syntactic sugars.
>>
>> Hope this helps, jeffrey
>>
>>
>>
>> On Sun, Aug 16, 2015 at 3:19 AM, <phi...@free.fr> wrote:
>>
>>> Hello,
>>> I would like to parse a text file containing the following data, with
>>> MARPA:
>>>
>>> EUR=089980
>>> GBP=063886
>>> AUD=135358
>>> ...
>>>
>>> When I run my program (see below), it only displays the first exchange
>>> rate, namely "089980", although my DSL file says that Catx (i.e., the
>>> exchange rate file) should contain one or more Expressions ("Expression+").
>>>
>>> Furthermore, why can't you specify tokens with specific lengths in MARPA
>>> DSLs, e.g.,
>>>
>>> Label ~ \w{3}
>>>
>>> In the Catx data file's case, [currency] labels are always 3 characters
>>> long.
>>>
>>> Many thanks.
>>>
>>> Best regards,
>>>
>>> Philippe
>>>
>>>
>>>
>>> PERL script:
>>>
>>> -------------------
>>> #!/usr/bin/perl
>>> use strict;
>>> use warnings;
>>> use Marpa::R2;
>>> use Data::Dumper;
>>>
>>> my $data_file = '/Users/philippe/Desktop/MARPA/data.txt';
>>> my $dsl_file = '/Users/philippe/Desktop/MARPA/catx.dsl';
>>> my $input = slurp_file($data_file);
>>> my $dsl = slurp_file($dsl_file);
>>>
>>> my $grammar = Marpa::R2::Scanless::G->new( { source => \$dsl } );
>>> my $recce = Marpa::R2::Scanless::R->new(
>>>     { grammar => $grammar, semantics_package => 'My_Actions' } );
>>> my $length_read = $recce->read ( \$input );
>>> die "Read ended after $length_read of ", length $input, " characters"
>>>     if $length_read != length $input;
>>>
>>> if ( my $ambiguous_status = $recce->ambiguous() ) {
>>>     chomp $ambiguous_status;
>>>     die "Parse is ambiguous\n", $ambiguous_status;
>>> }
>>> my $value_ref = $recce->value;
>>> print "$$value_ref\n";
>>>
>>> sub slurp_file {
>>>     my $file = shift;
>>>     local $/ = undef;
>>>     open my $fh, '<', $file or die "$!";
>>>     my $data = <$fh>;
>>>     close $fh;
>>>     return $data;
>>> }
>>> sub My_Actions::do_extract_rate {
>>>     my ( undef, $t1, undef, $t2 ) = @_;
>>>     return $t2;
>>> }
>>> --------------------
>>>
>>> DSL file:
>>>
>>> -------------------
>>>
>>> :default ::= action => [name,values]
>>> lexeme default = latm => 1
>>>
>>> Catx ::= Expression+ action => ::first
>>> Expression ::= Label '=' Rate action => do_extract_rate
>>> Label ~ [\w]+
>>> Rate ~ [\d]+
>>> :discard ~ whitespace
>>> :discard ~ cr
>>> whitespace ~ [\s]+
>>> cr ~ [\n]+
>>>
>>>
>>>
>>> --------------------
>>>
>>>
>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "marpa parser" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to marpa-parser...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "marpa parser" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to marpa-parser+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"marpa parser" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to marpa-parser+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to