From 52687a403376b08282310846ed221789bdb50b8a Mon Sep 17 00:00:00 2001 From: - <-> Date: Sat, 24 Nov 2012 17:13:48 -0800 Subject: [PATCH] Work on SL if: t+ --- blog/sl/error.pl | 41 ++++++++++++++++++++++-------------- r2/lib/Marpa/R2/Stuifzand.pm | 8 +++++-- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/blog/sl/error.pl b/blog/sl/error.pl index 3029f1d0f..a883f51f8 100644 --- a/blog/sl/error.pl +++ b/blog/sl/error.pl @@ -22,23 +22,35 @@ my $prefix_grammar = Marpa::R2::Grammar->new( { start => 'Script', - actions => 'My_Actions', + action_object => 'My_Actions', default_action => 'do_arg0', rules => [ <<'END_OF_RULES' ] Script ::= - Expression - | [s] [a] [y] :ws Expression action => do_arg1 + :ows Expression :ows + | :ows ([s] [a] [y]) :ows Expression Expression ::= - :ows Number :ows - | :ows [+] :ows Expression :ows action => do_add + Number + | ([+]) :ows Expression :ows Expression action => do_add Number ::= [\d] + action => do_number END_OF_RULES } ); -sub My_Actions::do_add { shift; return $_[1] + $_[2] } -sub My_Actions::do_arg0 { shift; return shift; } -sub My_Actions::do_arg1 { shift; return $_[1]; } +package My_Actions; +our $SELF; +sub new { return $SELF } +sub do_number { + my $self = shift; + my ($start, $end) = Marpa::R2::Context::location(); + return substr ${$self->{input}}, $start, $end-$start; +} +sub do_add { shift; +# say +(scalar @_), " args: ", join "; ", @_; +return $_[0] + $_[1] } +sub do_arg0 { shift; return shift; } +sub do_arg1 { shift; return $_[1]; } + +package main; $prefix_grammar->precompute(); @@ -105,15 +117,12 @@ sub My_Error::show_position { sub my_parser { my ( $grammar, $string ) = @_; - my $recce = Marpa::R2::Recognizer->new( { grammar => $grammar } ); - # A quasi-object, for internal use only - my $self = bless { - grammar => $grammar, - input => \$string, - recce => $recce, - }, - 'My_Error'; + my $self = bless { grammar => $grammar, input => \$string, }, 'My_Error'; + local $My_Actions::SELF = $self; + + my $recce = Marpa::R2::Recognizer->new( { grammar => $grammar } ); + $self->{recce} = $recce; $recce->read_string($string); my $value_ref = $recce->value; diff --git a/r2/lib/Marpa/R2/Stuifzand.pm b/r2/lib/Marpa/R2/Stuifzand.pm index a724e8ef5..a59e75591 100644 --- a/r2/lib/Marpa/R2/Stuifzand.pm +++ b/r2/lib/Marpa/R2/Stuifzand.pm @@ -33,6 +33,7 @@ use constant HIDE => 1; sub new { my $class = shift; return bless { name => $_[NAME], is_hidden => ($_[HIDE]//0) }, $class } sub name { return $_[0]->{name} } +sub names { return $_[0]->{name} } sub is_hidden { return $_[0]->{is_hidden} } sub hidden_set { $_[0]->{is_hidden} = 1; } sub symbols { return $_[0]; } @@ -42,7 +43,10 @@ package Marpa::R2::Internal::Stuifzand::Symbol_List; sub new { my $class = shift; return bless [@_], $class } sub names { - return map { $_->name() } @{ $_[0] }; + return map { $_->names() } @{ $_[0] }; +} +sub is_hidden { + return map { $_->is_hidden() } @{ $_[0] }; } sub hidden_set { @@ -50,7 +54,7 @@ sub hidden_set { } sub mask { - return map { !$_->is_hidden() } @{ $_[0] }; + return map { ! $_ } map { $_->is_hidden() } @{ $_[0] }; } sub symbols { return @{ $_[0] }; }