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.