#!/usr/bin/perl -w use strict; use Test::More tests => 4; use_ok qw( Parse::Eyapp ); SKIP: { skip "developer test", 3 unless ($ENV{DEVELOPER} && ($ENV{DEVELOPER} eq 'casiano')); my $grammar = q{ /* intermediate action and %tree */ %{ #use Data::Dumper; #$Data::Dumper::Indent = 1; sub tutu { print "Tutu:\n<@_>\n"; } %} %% S: { print "S -> epsilon\n" } | 'a' S { tutu(@_) } 'b' { print "S -> a S b\n" } ; %% sub _Error { exists $_[0]->YYData->{ERRMSG} and do { print $_[0]->YYData->{ERRMSG}; delete $_[0]->YYData->{ERRMSG}; return; }; print "Syntax error.\n"; } sub _Lexer { my($parser)=shift; $parser->YYData->{INPUT} or $parser->YYData->{INPUT} = or return('',undef); $parser->YYData->{INPUT}=~s/^[ \t\n]//; for ($parser->YYData->{INPUT}) { s/^(.)//s and return($1,$1); } } }; my $p = Parse::Eyapp->new_grammar( input=>$grammar, classname=>'aSb_int', firstline => 10, #outputfile => 'aSb_int.pm' ); die $p->warnings."Solve Ambiguities. See file aSb_int.output\n" if $p->Warnings; my $parser = new aSb_int(); #print Dumper($parser); my $expected_parser = bless( { 'DEBUG' => 0, 'STACK' => [], 'VALUE' => \undef, 'STATES' => [ { 'GOTOS' => { 'S' => 1 }, 'ACTIONS' => { 'a' => 2 }, 'DEFAULT' => -1 }, { 'ACTIONS' => { '' => 3 } }, { 'GOTOS' => { 'S' => 4 }, 'ACTIONS' => { 'a' => 2 }, 'DEFAULT' => -1 }, { 'DEFAULT' => 0 }, { 'GOTOS' => { '@2-2' => 5 }, 'DEFAULT' => -3 }, { 'ACTIONS' => { 'b' => 6 } }, { 'DEFAULT' => -2 } ], 'GRAMMAR' => [ [ '_SUPERSTART', '$start', [ 'S', '$end' ] ], [ 'S_1', 'S', [] ], [ 'S_2', 'S', [ 'a', 'S', '@2-2', 'b' ] ], [ '_CODE', '@2-2', [] ] ], 'RULES' => [ [ '$start', 2, undef ], [ 'S', 0, sub { "DUMMY" } ], [ 'S', 4, sub { "DUMMY" } ], [ '@2-2', 0, sub { "DUMMY" } ] ], 'CHECK' => \undef, 'ERRST' => \undef, 'PREFIX' => '', 'DOTPOS' => \undef, 'ERROR' => sub { "DUMMY" }, 'TOKEN' => \undef, 'VERSION' => '1.06', 'NBERR' => \undef, 'TERMS' => { 'a' => 0, 'b' => 0, '$end' => 0 } }, 'aSb_int' ); is_deeply($expected_parser->{STATES}, $parser->{STATES}, "DFA states intermediate action"); is_deeply([ 'S_2', 'S', [ 'a', 'S', '@2-2', 'b' ], 0 ], $parser->{GRAMMAR}[2], "GRAMMAR intermediate action"); is_deeply([ '', 'a', 'b', 'error' ] , [ sort keys %{$parser->{TERMS}} ], "TERMS states intermediate action"); } # SKIP test