#!/usr/bin/perl -w use strict; my ($nt, $nt2, $nt3, $nt4, $nt5, $nt6, $nt7, $nt8, $nt9, $nt10, $nt11, $nt12, $nt13, $nt14); BEGIN { $nt = 8; $nt2 = 7; $nt3 = 11; $nt4 = 7; $nt5 = 7; $nt6 = 6; $nt7 = 7; $nt8 = 7; $nt9 = 9; $nt10 = 8; $nt11 = 8; $nt12 = 6; $nt13 = 7; $nt14 = 11; } use Test::More tests=> $nt+$nt2+$nt3+$nt4+$nt5+$nt6+$nt7+$nt8+$nt9+$nt10+$nt11+$nt12+$nt13+$nt14; # test PPCR methodology with Pascal range versus enumerated conflict SKIP: { skip "t/pascalnestedeyapp2.eyp not found", $nt unless ($ENV{DEVELOPER} && -r "t/pascalnestedeyapp2.eyp" #&& $^V ge v5.10.0 && -r "t/Range.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -Po t/Range.pm t/Range.eyp 2>&1}); ok(!$r, "Auxiliary grammar Range.yp compiled with option -P"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/pascalnestedeyapp2.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/pascalnestedeyapp2.eyp executed as modulino'); my $expected = q{ typeDecl_is_type_ID_type_expr( TERMINAL[r], RANGE( 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/pascalnestedeyapp2.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 't/Range.pm'; } SKIP: { skip "t/noPackratSolvedExpRG2.eyp not found", $nt2 unless ($ENV{DEVELOPER} && -r "t/noPackratSolvedExpRG2.eyp" && -r "t/ExpList.eyp" #&& $^V ge v5.10.0 && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -Po t/ExpList.pm t/ExpList.eyp}); ok(!$r, "Auxiliary grammar ExpList.yp compiled witn -P option"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/noPackratSolvedExpRG2.eyp 2> t/err}); ok(!$r, "S->xSx|x grammar compiled"); like(qx{cat t/err},qr{1 shift/reduce conflict},"number of conflicts eq 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 -m 1 -c '2-3 3*4 5+2 other things' 2>&1}; }; ok(!$@,'t/noPackratSolvedExpRG2.eyp executed as modulino'); my $expected = q{ Number of x's = 3 nxr = 1 nxs = 1 Shifting input: '*4 5+2 other things' nxr = 1 nxs = 2 Reducing by :MIDx nxs = 2 nxr = 1 input: '+2 other things' T_is_S_other_things( S_is_x_S_x( x_is_NUM_OP_x( TERMINAL[2], TERMINAL[-], x_is_NUM( TERMINAL[3] ) ), S_is_x( x_is_NUM_OP_x( TERMINAL[3], TERMINAL[*], x_is_NUM( TERMINAL[4] ) ) ), x_is_NUM_OP_x( TERMINAL[5], TERMINAL[+], x_is_NUM( TERMINAL[2] ) ) ) ) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "2-3 3*4 5+2"'); unlink 't/ppcr.pl'; unlink 't/ExpList.pm'; unlink 't/err'; } # testing eyapp option -P SKIP: { skip "t/Calc.eyp not found", $nt3 unless ($ENV{DEVELOPER} && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -PTC -o t/ppcr.pl t/Calc.eyp 2> t/err}); ok(!$r, "Calc.eyp compiled with opt P"); ok(-s 't/err' == 0, "no errors during compilation"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); # a prefix is acceptable but the whole string isn't eval { $r = qx{perl -Ilib t/ppcr.pl -t -c 'a=2\@'}; }; ok(!$@,'t/Calc.eyp accepts strict prefix'); my $expected = q{ $VAR1 = { 'a' => bless( { 'children' => [ bless( { 'children' => [], 'attr' => '2', 'token' => 'NUM' }, 'TERMINAL' ) ] }, 'exp_is_NUM' ) }; }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "a=2@"'); unlink 't/err'; unlink 't/ppcr.pl'; unlink 't/ExpList.pm'; #without -P option $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/Calc.eyp 2> t/err}); ok(!$r, "Calc.eyp compiled without opt P"); ok(-s 't/err' == 0, "no errors during compilation"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); eval { $r = qx{perl -Ilib t/ppcr.pl -t -c 'a=2\@' 2>&1}; }; $expected = q{ Syntax error near input: '@' (lin num 1). Expected one of these terminals: -, , /, ^, *, +, }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'error as expected for "a=2@"'); unlink 't/err'; unlink 't/ppcr.pl'; unlink 't/ExpList.pm'; unlink 't/err'; } # testing the use of the same conflict handler in different grammar # sections SKIP: { skip "t/reuseconflicthandler.eyp not found", $nt4 unless ($ENV{DEVELOPER} && -r "t/reuseconflicthandler.eyp" && -r "t/ExpList.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -Po t/ExpList.pm t/ExpList.eyp}); ok(!$r, "Auxiliary grammar ExpList.yp compiled witn -P option"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/reuseconflicthandler.eyp 2> t/err}); ok(!$r, "repeated conflicts grammar compiled"); like(qx{cat t/err},qr{1 shift/reduce conflict},"number of conflicts eq 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 -m 1 -c '2-3 3*4 5+2 ; 4+8 3-1 2*3 ;' 2>&1}; }; ok(!$@,'t/reuseconflicthandler.eyp executed as modulino'); my $expected = q{ Number of x's = 3 Reducing by :MIDx input = '+2 ; 4+8 3-1 2*3 ; ' Number of x's = 3 Reducing by :MIDx input = '*3 ; ' T_is_S_S( S_is_x_S_x( x_is_NUM_OP_x( TERMINAL[2], TERMINAL[-], x_is_NUM( TERMINAL[3] ) ), S_is_x( x_is_NUM_OP_x( TERMINAL[3], TERMINAL[*], x_is_NUM( TERMINAL[4] ) ) ), x_is_NUM_OP_x( TERMINAL[5], TERMINAL[+], x_is_NUM( TERMINAL[2] ) ) ), S_is_x_S_x( x_is_NUM_OP_x( TERMINAL[4], TERMINAL[+], x_is_NUM( TERMINAL[8] ) ), S_is_x( x_is_NUM_OP_x( TERMINAL[3], TERMINAL[-], x_is_NUM( TERMINAL[1] ) ) ), x_is_NUM_OP_x( TERMINAL[2], TERMINAL[*], x_is_NUM( TERMINAL[3] ) ) ) ) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,q{AST for '2-3 3*4 5+2 ; 4+8 3-1 2*3 ;'} ); unlink 't/ppcr.pl'; unlink 't/ExpList.pm'; unlink 't/err'; } # testing PPCR with CplusplusNested.eyp # testing nested parsing (YYPreParse) when one token # has been read by the outer parser SKIP: { skip "t/CplusplusNested.eyp not found", $nt5 unless ($ENV{DEVELOPER} && -r "t/CplusplusNested.eyp" && -r "t/Decl.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -Po t/Decl.pm t/Decl.eyp}); ok(!$r, "Auxiliary grammar Decl.eyp compiled witn -P option"); $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/CplusplusNested.eyp 2> t/err}); ok(!$r, "t/CplusplusNested.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/CplusplusNested.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 't/Decl.pm'; unlink 't/err'; } # testing PPCR with dynamic.eyp SKIP: { skip "t/dynamic.eyp not found", $nt6 unless ($ENV{DEVELOPER} && -r "t/dynamic.eyp" && -r "t/input_for_dynamicgrammar.txt" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/dynamic.eyp 2> t/err}); ok(!$r, "t/dynamic.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 -f t/input_for_dynamicgrammar.txt 2>&1}; }; ok(!$@,'t/dynamic.eyp executed as modulino'); my $expected = q{ 0 2 1 3 }; $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 't/err'; } SKIP: { skip "t/DebugDynamicResolution4.eyp not found", $nt7 unless ($ENV{DEVELOPER} && -r "t/DebugDynamicResolution4.eyp" && -r "t/lastD.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -Po t/lastD.pm t/lastD.eyp}); ok(!$r, "Auxiliary grammar lastD.eyp compiled witn -P option"); $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/DebugDynamicResolution4.eyp 2> t/err}); ok(!$r, "t/DebugDynamicResolution4.eyp grammar compiled"); like(qx{cat t/err},qr{1 shift/reduce conflict},"1 shift-reduce conflict"); 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 'D; D; S; S ' 2>&1}; }; ok(!$@,'t/DebugDynamicResolution4.eyp executed as modulino'); my $expected = q{ PROG(D(D),SS(S) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "D; D; S; S "'); unlink 't/ppcr.pl'; unlink 't/lastD.pm'; unlink 't/err'; } SKIP: { skip "t/CplusplusNested4.eyp not found", $nt8 unless ($ENV{DEVELOPER} && -r "t/CplusplusNested4.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -S decl -Po t/decl.pm t/CplusplusNested4.eyp}); ok(!$r, "Auxiliary parser decl.pm generated from t/CplusplusNested4.eyp"); $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/CplusplusNested4.eyp 2> t/err}); ok(!$r, "t/CplusplusNested4.eyp grammar compiled"); is(qx{cat t/err},'',"no 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) + 2; int (z) = 4; ' 2>&1}; }; ok(!$@,'t/CplusplusNested4.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 't/decl.pm'; unlink 't/err'; } SKIP: { skip "t/pascalnestedeyapp3_6.eyp not found", $nt9 unless ($ENV{DEVELOPER} && -r "t/pascalnestedeyapp3_6.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -S range -Po t/range.pm t/pascalnestedeyapp3_6.eyp}); ok(!$r, "Auxiliary parser decl.pm generated from t/pascalnestedeyapp3_6.eyp"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/pascalnestedeyapp3_6.eyp 2> t/err}); ok(!$r, "t/pascalnestedeyapp3_6.eyp grammar compiled"); is(qx{cat t/err},'',"no 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 'type e = (x)..(z);' 2>&1}; }; ok(!$@,'t/pascalnestedeyapp3_6.eyp executed as modulino'); my $expected = q{ typeDecl_is_type_ID_type(TERMINAL[e],RANGE(range_is_expr_expr(ID(TERMINAL[x]),ID(TERMINAL[z])))) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "type e = (x)..(z);"'); ################################################### eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'type e = (x, y, z);' 2>&1}; }; ok(!$@,'t/pascalnestedeyapp3_6.eyp executed as modulino'); $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);"'); unlink 't/ppcr.pl'; unlink 't/decl.pm'; unlink 't/err'; } # 10 # testing syntax # %conflict DORF /.*?d/? XY:D : XY:F SKIP: { skip "t/confusingsolvedppcr.eyp not found", $nt10 unless ($ENV{DEVELOPER} && -r "t/confusingsolvedppcr.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/confusingsolvedppcr.eyp 2> t/err}); ok(!$r, "t/confusingsolvedppcr.eyp grammar compiled"); like(qx{cat t/err},qr{1 reduce/reduce conflict\s*},"1 rr conflict"); 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 'x y c d' 2>&1}; }; ok(!$@,'t/confusingsolvedppcr.eyp executed as modulino'); my $expected = q{ Bcd(XY(TERMINAL[x],TERMINAL[y]),TERMINAL[c],TERMINAL[d]) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "x y c d"'); ################################################### eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'x y c f' 2>&1}; }; ok(!$@,'t/confusingsolvedppcr.eyp executed as modulino'); $expected = q{ Ecf(XY(TERMINAL[x],TERMINAL[y]),TERMINAL[c],TERMINAL[f]) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "x y c f"'); unlink 't/ppcr.pl'; unlink 't/decl.pm'; unlink 't/err'; } # 11 # testing syntax # %conflict DORF !/.*?d/? XY:F : XY:D SKIP: { skip "t/confusingsolvedppcrnot.eyp not found", $nt11 unless ($ENV{DEVELOPER} && -r "t/confusingsolvedppcrnot.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/confusingsolvedppcrnot.eyp 2> t/err}); ok(!$r, "t/confusingsolvedppcrnot.eyp grammar compiled"); like(qx{cat t/err},qr{1 reduce/reduce conflict\s*},"1 rr conflict"); 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 'x y c d' 2>&1}; }; ok(!$@,'t/confusingsolvedppcrnot.eyp executed as modulino'); my $expected = q{ Bcd(XY(TERMINAL[x],TERMINAL[y]),TERMINAL[c],TERMINAL[d]) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "x y c d"'); ################################################### eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'x y c f' 2>&1}; }; ok(!$@,'t/confusingsolvedppcrnot.eyp executed as modulino'); $expected = q{ Ecf(XY(TERMINAL[x],TERMINAL[y]),TERMINAL[c],TERMINAL[f]) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "x y c f"'); unlink 't/ppcr.pl'; unlink 't/decl.pm'; unlink 't/err'; } # 12 # testing syntax # %conflict DORF /.*?d/? XY:D : XY:F SKIP: { skip "t/DebugDynamicResolution2.eyp not found", $nt12 unless ($ENV{DEVELOPER} && -r "t/DebugDynamicResolution2.eyp" && -x "./eyapp"); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/DebugDynamicResolution2.eyp 2> t/err}); ok(!$r, "t/DebugDynamicResolution2.eyp grammar compiled"); like(qx{cat t/err},qr{1 shift/reduce conflict\s*},"1 sr conflict"); 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 'D;D;D;S;S;S' 2>&1}; }; ok(!$@,'t/DebugDynamicResolution2.eyp executed as modulino'); my $expected = q{ PROG(D(D(D)),SS(SS(S))) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "D;D;D;S;S;S"'); unlink 't/ppcr.pl'; unlink 't/decl.pm'; unlink 't/err'; } SKIP: { skip "t/CplusplusNested5.eyp not found", $nt13 unless ($ENV{DEVELOPER} && -r "t/CplusplusNested5.eyp" && -x "./eyapp" && ( -d 't/Tutu' or mkdir 't/Tutu')); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -m Tutu::decl -o t/Tutu/decl.pm -S decl -P t/CplusplusNested5.eyp}); ok(!$r, "Auxiliary parser decl.pm generated from t/CplusplusNested5.eyp"); $r = system(q{perl -I./lib/ eyapp -C -o t/ppcr.pl t/CplusplusNested5.eyp 2> t/err}); ok(!$r, "t/CplusplusNested5.eyp grammar compiled"); is(qx{cat t/err},'',"no 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) + 2; int (z) = 4; ' 2>&1}; }; ok(!$@,'t/CplusplusNested5.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 't/Tutu/decl.pm'; rmdir 't/Tutu'; unlink 't/err'; } SKIP: { skip "t/AmbiguousLanguage2.eyp not found", $nt14 unless ($ENV{DEVELOPER} && -r "t/AmbiguousLanguage2.eyp" && -r "t/ab.eyp" && -x "./eyapp" && ( -d 't/Tutu' or mkdir 't/Tutu')); unlink 't/ppcr.pl'; my $r = system(q{perl -I./lib/ eyapp -m Tutu::ab -o t/Tutu/ab.pm -P t/ab.eyp}); ok(!$r, "Auxiliary parser Tutu/ab.pm generated from t/ab.eyp"); $r = system(q{perl -I./lib/ eyapp -TC -o t/ppcr.pl t/AmbiguousLanguage2.eyp 2> t/err}); ok(!$r, "t/AmbiguousLanguage2.eyp grammar compiled"); is(qx{cat t/err},"1 shift/reduce conflict and 1 reduce/reduce conflict\n","1 sr and 1rr warnings"); ok(-s "t/ppcr.pl", "modulino ppcr exists"); ok(-x "t/ppcr.pl", "modulino has execution permits"); ########## abbcc eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'abbcc' 2>&1}; }; ok(!$@,'t/AmbiguousLanguage2.eyp executed as modulino'); my $expected = q{ st_is_s(_OPTIONAL,s_is_beqc(beqc_is_as_bc(as_is_as_a(BC),bc_is_b_bc_c(bc_is_b_bc_c(bc_is_empty))))) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "abbcc"'); ########## aabb eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'aabb' 2>&1}; }; ok(!$@,'t/AmbiguousLanguage2.eyp executed as modulino'); $expected = q{ st_is_s(_OPTIONAL,s_is_aeqb(aeqb_is_ab_cs(ab_is_a_ab_b(ab_is_a_ab_b(ab_is_empty)),cs_is_empty)) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "aabb"'); ########## bbcc eval { $r = qx{perl -Ilib -It t/ppcr.pl -t -i -c 'bbcc' 2>&1}; }; ok(!$@,'t/AmbiguousLanguage2.eyp executed as modulino'); $expected = q{ st_is_s(_OPTIONAL,s_is_beqc(beqc_is_as_bc(BC,bc_is_b_bc_c(bc_is_b_bc_c(bc_is_empty))))) }; $expected =~ s/\s+//g; $expected = quotemeta($expected); $expected = qr{$expected}; $r =~ s/\s+//g; like($r, $expected,'AST for "bbcc"'); unlink 't/ppcr.pl'; unlink 't/Tutu/ab.pm'; rmdir 't/Tutu'; unlink 't/err'; }