use lib '../Pugs-Compiler-Rule/lib', '../Pugs-Compiler-Precedence/lib', ; use strict; use warnings; use Test::More tests => 17; use Pugs::Compiler::Rule; use Pugs::Grammar::Precedence; use Pugs::Grammar::Term; use Pugs::Grammar::Operator; use Pugs::Grammar::Expression; use Pugs::Grammar::StatementControl; use Data::Dumper; $Data::Dumper::Indent = 1; $Data::Dumper::Sortkeys = 1; { my $match = Pugs::Grammar::Expression->parse( q(10) ); #print Dumper $match->(); is_deeply( $match->(), { 'num' => '10' ,}, 'the expression compiler looks ok' ); } { my $match = Pugs::Grammar::Expression->parse( q($a) ); #print Dumper $match->(); is_deeply( $match->(), { 'scalar' => '$a' ,}, 'the expression compiler looks ok - var without spaces' ); } { my $match = Pugs::Grammar::Expression->parse( q( $a ) ); #print Dumper $match->(); is_deeply( $match->(), { 'scalar' => '$a' ,}, 'the expression compiler looks ok - var with spaces' ); } { my $match = Pugs::Grammar::Expression->parse( q($a {) ); #print Dumper $match->(); is_deeply( $match->(), { 'scalar' => '$a' ,}, 'the expression compiler looks ok - var before {' ); } { my $match = Pugs::Grammar::Expression->parse( q($a )."\n" ); #print Dumper $match->(); is_deeply( $match->(), { 'scalar' => '$a' ,}, 'the expression compiler looks ok - var before newline' ); } { my $match = Pugs::Grammar::StatementControl->statement_list( q(10) ); #print Dumper $match->(); is_deeply( $match->(), { #'statements' => [ # { 'num' => '10' # } #] }, 'a simple statement' ); } { my $match = Pugs::Grammar::StatementControl->statement_list( q(10;20) ); #print Dumper $match->(); is_deeply( $match->(), { #'statements' => [ # { 'list' => [ { 'num' => '10' }, { 'num' => '20' } ], 'op1' => ';' # } #] }, 'statements' ); } { my $match = Pugs::Grammar::StatementControl->statement_list( q(10+10;) ); #print Dumper $match->(); is_deeply( $match->(), { #'statements' => [ # { 'exp1' => { 'num' => '10' }, 'exp2' => { 'num' => '10' }, 'op1' => '+' # } #] }, 'a simple statement 2' ); } { my $match = Pugs::Grammar::StatementControl->parse( q({ 10 }) ); #print Dumper $match->(); is_deeply( $match->(), { 'bare_block' => { 'num' => '10' } }, 'a bare block' ); } { my $match = Pugs::Grammar::StatementControl->parse( q({}) ); #print Dumper $match->(); is_deeply( $match->(), { 'bare_block' => { #'statements' => [ # {} #] } }, 'an empty block' ); } { my $match = Pugs::Grammar::StatementControl->parse( q( if 10 { 20 }) ); #print Dumper $match->(); is_deeply( $match->(), { 'if' => { 'block' => { #'statements' => [ # { 'num' => '20' # } #] }, 'exp' => { 'num' => '10' } } }, 'if' ); } { my $match = Pugs::Grammar::StatementControl->parse( q(if 10 { 20; 30 }) ); #print Dumper $match->(); is_deeply( $match->(), { 'if' => { 'block' => { #'statements' => [ # { 'list' => [ { 'num' => '20' }, { 'num' => '30' } ], 'op1' => ';' # } #] }, 'exp' => { 'num' => '10' } } }, 'if with 2-statement block' ); } { my $match = Pugs::Grammar::StatementControl->parse( q(if $i { if $a { $b } }) ); #print Dumper $match->(); is_deeply( $match->(), { 'if' => { 'block' => { 'if' => { 'block' => { 'scalar' => '$b' }, 'exp' => { 'scalar' => '$a' } } }, 'exp' => { 'scalar' => '$i' } } }, 'if inside if' ); } { my $match = Pugs::Grammar::StatementControl->parse( q({{}}) ); # print Dumper $match->(); is_deeply( $match->(), { 'bare_block' => { 'bare_block' => {} } }, 'a block with an empty block' ); } { my $match = Pugs::Grammar::StatementControl->statement_list( q( if 11 { if $a { $b; } } ) ); #print Dumper $match->(); is_deeply( $match->(), { 'if' => { 'block' => { 'if' => { 'block' => { 'scalar' => '$b' }, 'exp' => { 'scalar' => '$a' } } }, 'exp' => { 'num' => '11' } } }, 'if inside if 2 with newlines' ); } { my $match = Pugs::Grammar::StatementControl->statement_list( q( { 3 } { 4 } ) ); #print Dumper $match->(); is_deeply( $match->(), [ { 'bare_block' => [ { 'num' => '3' } ] }, { 'bare_block' => [ { 'num' => '4' } ] } ], '2 blocks' ); } { my $match = Pugs::Grammar::StatementControl->statement_list( q( { 3 } 7; { 4+5 } 8+9; ) ); #print Dumper $match->(); is_deeply( $match->(), [ { 'bare_block' => [ { 'num' => '3' } ] }, { 'num' => '7' }, { 'bare_block' => [ { 'exp1' => { 'num' => '4' }, 'exp2' => { 'num' => '5' }, 'op1' => '+' } ] }, { 'exp1' => { 'num' => '8' }, 'exp2' => { 'num' => '9' }, 'op1' => '+' } ], '2 blocks, 2 expressions' ); }