diff --git a/DSL/Operator.pm b/DSL/Operator.pm index ff9cbf7..9ce3209 100755 --- a/DSL/Operator.pm +++ b/DSL/Operator.pm @@ -17,10 +17,28 @@ has 'arguments' => ( required => 1 ); +my $debug = 1; +# Comment out next line for debug output +#undef $debug; + sub from_parse { my $self=shift; my @terms; + print STDERR "DSL::Operator->from_parse( ".( + (ref $_[0] eq "ARRAY") ? + "[ ".join(", ",map { my $that = $_; + while (ref $that eq 'ARRAY' and @$that == 1) {$that = $that->[0];} + ((ref $that) =~ /^DSL::/) ? $that->prettyprint : $that + } @{$_[0]})." ]" + : (ref $_[0]) =~ /^DSL::/ ? $_[0]->prettyprint : $_[0] + )." )\n" if defined($debug); @terms=@{$_[0]}; shift; + print STDERR "~~(" if defined($debug); + for my $that (@terms) { + print STDERR " \"".(((ref $that) =~ /^DSL::/) ? $that->prettyprint : $that)."\"" if defined($debug); + while (ref $that eq 'ARRAY' and @$that == 1) {$that = $that->[0];} + } + print STDERR " )~~\n" if defined($debug); if (@terms < 2) { return $terms[0]; } @@ -29,11 +47,16 @@ sub from_parse { } my @args = (shift @terms); my $op = shift @terms; - while($terms[1] eq $op) { + my $oneLastTerm=0; + while((@terms > 1) && ($terms[1] eq $op)) { push @args, shift @terms; shift @terms; + $oneLastTerm=1; } - return __PACKAGE__->new( operator=>$op, arguments=>[ @args, __PACKAGE__->from_parse(@terms)] ); + push @args, shift @terms if $oneLastTerm; + return (@terms == 0) + ? __PACKAGE__->new( operator=>$op, arguments=>[ @args ] ) + : __PACKAGE__->new( operator=>$op, arguments=>[ @args, __PACKAGE__->from_parse(@terms)] ); } diff --git a/DSL/Parser.pm b/DSL/Parser.pm index 4c763df..062f38b 100755 --- a/DSL/Parser.pm +++ b/DSL/Parser.pm @@ -31,32 +31,36 @@ equals: '=' variable: /(?!=print[^a-zA-Z0-9_])[a-zA-Z_][a-zA-Z0-9_]*/ { "DSL::Variable"->get($item[1]) } -expression: - { - my $expressions=$item[1]; - if (ref $expressions ne 'ARRAY') { +expression: expOrTermProc[$item[1]] + +term: expOrTermProc[$item[1]] + +# { +# my $expressions=$item[1]; +# if (ref $expressions ne 'ARRAY') { +# $return=$expressions; +# } +# elsif (@$expressions == 1) { +# $return=$expressions->[0]; +# if (ref $return eq 'ARRAY' and @$return == 1) { +# $return=$return->[0]; +# } +# } +# else { +# $return=DSL::Operator->from_parse($expressions); +# } +# } + +expOrTermProc: { + my $expressions=$arg[0]; + ## should always be an array + if ((ref $expressions) ne 'ARRAY') { $return=$expressions; } elsif (@$expressions == 1) { $return=$expressions->[0]; - if (ref $return eq 'ARRAY' and @$return == 1) { - $return=$return->[0]; - } - } - else { - $return=DSL::Operator->from_parse($expressions); - } - } - -term: - { - my $expressions=$item[1]; - if (ref $expressions ne 'ARRAY') { - $return=$expressions; - } - elsif (@$expressions == 1) { - $return=$expressions->[0]; - if (ref $return eq 'ARRAY' and @$return == 1) { + ## reductio ad infinitum + while ((ref $return) eq 'ARRAY' and @$return == 1) { $return=$return->[0]; } } diff --git a/DSL/Statement/Print.pm b/DSL/Statement/Print.pm index 036f5b7..2b16988 100755 --- a/DSL/Statement/Print.pm +++ b/DSL/Statement/Print.pm @@ -38,8 +38,9 @@ sub do { for my $expression (@{$self->expressions}) { my $result=$expression->do; push @results, $result; - # print $result; + print $result; } + print "\n"; return join(", ", @results) . "\n"; } diff --git a/prd.pl b/prd.pl index a397772..1e67614 100755 --- a/prd.pl +++ b/prd.pl @@ -20,6 +20,19 @@ my @tests=( "a=7;\nb =6\n;c = a + b;\nprint a;\nprint a+b; print c*a; print a+b*c;\n", + "print 2 * 2;\n", + "print 2 * 2 + 1;\n", + "print 2d6 + 2d6;\n", + "a=7;\nb =6\n;c = a + b;\nprint a+b+c; print a*b*c;\n", + "print 2 * 2 * 1;\n", + "print 2*2*1;\n", + "print 1d6;\n", + "print d6;\n", + "print 2d6;\n", + "print 2d6, 2d6;\n", + "print 32d24;\n", + "a=2d6\n;print a;\n", + "print 2d6 + 2d6 + 2d6;\n", ); for my $test (0..$#tests) { @@ -27,10 +40,14 @@ printf "Test %2d:\n%s\n", 1+$test, $tests[$test]; print "----------\n"; my $result=$dsl->parse($tests[$test]); - die "Cannot parse test " . ($test+1) . "\n" unless (defined($result)); + do {print "****-> Cannot parse test " . ($test+1) . "\n";next;} unless (defined($result)); # print Dumper($result); print $result->prettyprint; + print "<--Output-->\n"; + my $retResult=$result->do; + print "--Returned result--> ".$retResult; } +print "###########\n\n"; exit;