The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/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} = <STDIN>
        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