I started writing a simple parser using Marpa.Made some progress and 
however as I started adding new rule, my parser started failing.

use strict;
use warnings;
use warnings qw(FATAL utf8); # Fatalize encoding glitches.
use feature 'say' ;
#use Data::Dumper;
use Data::Dumper::Concise;
#use Log::Handler;
use Marpa::R2;
use PyGen;
#use Moo;

my @flt;
sub flattenArray {
        foreach (@_) {
          if (ref $_ eq "ARRAY") {
                flattenArray(@$_);
                }
          else {
                push @flt,$_;
                }
        }
}

sub PYGEN_Action::ifAction {
  my (undef,@a,@b) = @_;
  my $cndHsh = {
    'var'   => $a[0]->[1]->[0],
    'op'    => $a[0]->[1]->[1],
    'val'   => $a[0]->[1]->[2],
  };
  my $actHsh = {
    'act'   => $a[1]->[0]->[0],
    'var'   => $a[1]->[0]->[1],
    };
  print $$cndHsh{'var'};
  print "\n";
  my $pygen = PyGen->new();
  $pygen->write_if($cndHsh);
  $pygen->write_act($actHsh);
}


sub PYGEN_Action::verbAction {
  print "verbAction inputs\n";
  print @_;
}

sub PYGEN_Action::listAction {
  #unpack lol. output is global @flt;
  flattenArray(@_);
  my $pygen = PyGen->new();
  shift @flt; #discard empty hash.
  $pygen->write_list(\@flt); 
}

my $g = Marpa::R2::Scanless::G->new({
        default_action => '::array',
        source         => \(<<'END_OF_SOURCE'),

:start    ::= language
#
# include begin
language          ::= if_statement action_statements action => ifAction
                      | action_statements action => verbAction
                      | ('List') variable ('is') comma_list  action => 
listAction

action_statements ::= action_statement*

if_statement      ::= if_type var_op_val
                      | if_type var_in_list
action_statement  ::= action_verb variable
                       | action_verb var_op_val
var_op_val        ::= variable operator value
                        | variable operator variable
var_in_list       ::= variable 'in' variable
comma_list        ::= str
                       | comma_list (',') str
#comma_list        ::= variable (',') variable
:discard        ~ ws
ws              ~ [\s]+

# include end
action_verb     ~  'remove' | 'Create' | 'Get'| 'Set' | 'CREATE' |'Revise'
if_type         ~ 'If'
variable        ~ [\w]+
operator        ~ 'has' | '>' | '<' | '='
value           ~ 'duplicate'
str             ~ [\w]+
END_OF_SOURCE
});
my $re = Marpa::R2::Scanless::R->new({ grammar => $g });
my $input = <<'INPUT';
 If documentTitle = A100
    remove Document
 List Author is Dante, Murakami, Ash, Harris
INPUT
print "Trying to parse:\n$input\n\n";
print "\n", $re->show_progress(0, -1);
$g->parse(\$input, 'PYGEN_Action');
=====================================
Output is
P0 @0-0 L0c0 language -> . if_statement action_statements
P1 @0-0 L0c0 language -> . action_statements
P2 @0-0 L0c0 language -> . 'List' variable 'is' comma_list
P3 @0-0 L0c0 action_statements -> . action_statement *
P4 @0-0 L0c0 if_statement -> . if_type var_op_val
P5 @0-0 L0c0 if_statement -> . if_type var_in_list
P6 @0-0 L0c0 action_statement -> . action_verb variable
P7 @0-0 L0c0 action_statement -> . action_verb var_op_val
P13 @0-0 L0c0 :start -> . language
Error in SLIF parse: No lexemes accepted at line 3, column 2
  Rejected lexeme #0: str; value="List"; length = 4
  Rejected lexeme #1: variable; value="List"; length = 4
  Rejected lexeme #2: 'List'; value="List"; length = 4
* String before error:  If documentTitle = A100\n\tremove Document\n\s
* The error was at line 3, column 2, and at character 0x004c 'L', ...
* here: List Author is Dante, Murakami, Ash, Harris\n
Marpa::R2 exception at gendeb.py line 99.
================================
1. I tested the grammar for c('List') variable ('is') comma_list  action => 
listAction
in a separate parser program, and it worked fine.
Any insights into why this is happening?

Thanks,
Rk

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/marpa-parser/0969de68-b9de-4eb1-8887-9cbce3bd9272n%40googlegroups.com.

Reply via email to