#!/usr/bin/perl -w use strict; my ($nt, $nt2, $nt3, $nt4, $nt5, $nt6, $nt7, $nt9); BEGIN { $nt = 8; $nt2 = 8; $nt5 = 7; $nt6 = 7; $nt7 = 6; $nt9 = 6; } use Test::More tests=> $nt+$nt2+$nt5+$nt6+$nt7+$nt9; # test -S option and PPCR methodology with Pascal range versus enumerated conflict SKIP: { skip "t/pascalnestedeyapp3.eyp not found", $nt unless ($ENV{DEVELOPER} && -r "t/pascalnestedeyapp3.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -P -S range t/pascalnestedeyapp3.eyp 2>&1}); ok(!$r, "pascalnestedeyapp3.eyp compiled with options '-S range' and -P"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/pascalnestedeyapp3.eyp}); ok(!$r, "Pascal conflict grammar compiled"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -m 1 -c 'type r = (x) .. (y); 4'}; }; ok(!$@,'t/pascalnestedeyapp3.eyp executed as modulino'); my $expected = q{ typeDecl_is_type_ID_type_expr( TERMINAL[r], RANGE( range_is_expr_expr( ID( TERMINAL[x] ), ID( TERMINAL[y] ) ) ), NUM( TERMINAL[4] ) ) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "type r = (x) .. (y); 4"'); ############################ eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -m 1 -c 'type r = (x,y,z); 8'}; }; ok(!$@,'t/pascalnestedeyapp3.eyp executed as modulino'); $expected = q{ typeDecl_is_type_ID_type_expr( TERMINAL[r], ENUM( idList_is_idList_ID( idList_is_idList_ID( ID( TERMINAL[x] ), TERMINAL[y] ), TERMINAL[z] ) ), NUM( TERMINAL[8] ) ) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "type r = (x,y,z); 8"'); unlink 't/ppcr.pl'; unlink 'range.pm'; } # test -S option and PPCR methodology with Pascal range versus enumerated conflict SKIP: { skip "t/pascalnestedeyapp3_5.eyp not found", $nt2 unless ($ENV{DEVELOPER} && -r "t/pascalnestedeyapp3_5.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -P -S range t/pascalnestedeyapp3_5.eyp 2>&1}); ok(!$r, "pascalnestedeyapp3_5.eyp compiled with options '-S range' and -P"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/pascalnestedeyapp3_5.eyp}); ok(!$r, "Pascal conflict grammar compiled"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -m 1 -c 'type e = (x, y, z);'}; }; ok(!$@,'t/pascalnestedeyapp3_5.eyp executed as modulino'); my $expected = q{ typeDecl_is_type_ID_type( TERMINAL[e], ENUM( idList_is_idList_ID( idList_is_idList_ID( ID( TERMINAL[x] ), TERMINAL[y] ), TERMINAL[z] ) ) ) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "type e = (x, y, z);"'); ############################ eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -m 1 -c 'type e = (x) .. (y);'}; }; ok(!$@,'t/pascalnestedeyapp3_5.eyp executed as modulino'); $expected = q{ typeDecl_is_type_ID_type( TERMINAL[e], RANGE( range_is_expr_expr( ID( TERMINAL[x] ), ID( TERMINAL[y] ) ) ) ) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "type e = (x) .. (y);"'); unlink 't/ppcr.pl'; unlink 'range.pm'; } # testing PPCR and -S option with CplusplusNested2.eyp # testing nested parsing (YYPreParse) when one token # has been read by the outer parser SKIP: { skip "t/CplusplusNested2.eyp not found", $nt5 unless ($ENV{DEVELOPER} && -r "t/CplusplusNested2.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -PS decl t/CplusplusNested2.eyp}); ok(!$r, "Auxiliary grammar decl.pm gnerated with '-PS decl' option"); $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/CplusplusNested2.eyp 2> t/err}); ok(!$r, "t/CplusplusNested2.eyp grammar compiled"); like(qx{cat t/err},qr{^$},"no warning: %expect-rr 1"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'int (x) + 2; int (z) = 4;' 2>&1}; }; ok(!$@,'t/CplusplusNested2.eyp executed as modulino'); my $expected = q{ PROG(PROG(EMPTY,EXP(TYPECAST(TERMINAL[int],ID[x]),NUM[2])),DECL(TERMINAL[int],ID[z],NUM[4])) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "int (x) + 2; int (z) = 4;"'); unlink 't/ppcr.pl'; unlink 'decl.pm'; unlink 't/err'; } # testing PPCR and -S option with CplusplusNested.eyp # testing nested parsing (YYPreParse) when one token # has been read by the outer parser SKIP: { skip "t/CplusplusNested3.eyp not found", $nt6 unless ($ENV{DEVELOPER} && -r "t/CplusplusNested3.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -PS decl t/CplusplusNested3.eyp}); ok(!$r, "Auxiliary grammar decl.pm gnerated with '-PS decl' option"); $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/CplusplusNested3.eyp 2> t/err}); ok(!$r, "t/CplusplusNested3.eyp grammar compiled"); like(qx{cat t/err},qr{^$},"no warning: %expect-rr 1"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'int (x) + 2; int (z) = 4;' 2>&1}; }; ok(!$@,'t/CplusplusNested3.eyp executed as modulino'); my $expected = q{ PROG(PROG(EMPTY,EXP(TYPECAST(TERMINAL[int],ID[x]),NUM[2])),DECL(TERMINAL[int],ID[z],NUM[4])) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "int (x) + 2; int (z) = 4;"'); unlink 't/ppcr.pl'; unlink 'decl.pm'; unlink 't/err'; } # testing PPCR and -S option with CplusplusStartOption.eyp # testing nested parsing (YYPreParse) when one token # has been read by the outer parser SKIP: { skip "t/CplusplusStartOption.eyp not found", $nt7 unless ($ENV{DEVELOPER} && -r "t/CplusplusStartOption.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -C -S decl -o t/ppcr.pl t/CplusplusStartOption.eyp 2> t/err}); ok(!$r, "t/CplusplusStartOption.eyp grammar compiled"); like(qx{cat t/err},qr{^$},"no warning: %expect-rr 1"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'int (x) = y+z;' 2>&1}; }; ok(!$@,'t/CplusplusStartOption.eyp executed as modulino'); my $expected = q{ DECLARATORINIT(TERMINAL[int],ID[x],PLUS(ID[y],ID[z])) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "int (x) = y+z;"'); unlink 't/ppcr.pl'; unlink 't/err'; } SKIP: { skip "t/CplusplusStartOption.eyp not found", $nt9 unless ($ENV{DEVELOPER} && -r "t/CplusplusStartOption.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/CplusplusStartOption.eyp 2> t/err}); ok(!$r, "t/CplusplusStartOption.eyp grammar compiled"); like(qx{cat t/err},qr/Useless rules:/,"warnings"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'int (x) = y+z;' 2>&1}; }; ok(!$@,'t/CplusplusStartOption.eyp executed as modulino'); my $expected = q{ DECLARATORINIT(TERMINAL[int],ID[x],PLUS(ID[y],ID[z])) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "int (x) = y+z;"'); unlink 't/ppcr.pl'; unlink 't/err'; }