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, <[email protected]> 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, <[email protected]> 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 [email protected].
>>> 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 [email protected].
> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.