%{
my $INT    = '(int)\b';
my $ID     = '([a-zA-Z_][a-zA-Z_0-9]*)';
my $NUM    = '(\d+)';

my $ISDEC;

%}

%token NUM = /$NUM/
%token INT = /$INT/
%token ID  = /$ID/

%right '='
%left '+'

%conflict decORexp {
  if ($ISDEC) { $self->YYSetReduce(')', 'ID:DEC' ); }
  else { $self->YYSetReduce(')', 'ID:EXP' ); }
}

%explorer decORexp {
   #print "***********************\n";
   $ISDEC = $self->YYPreParse('Decl', 
      #0xF # debug
   ); 
}

%expect-rr 1  # expect 1 reduce-reduce conflict

%tree bypass
%start decl

%%
prog:
    %name EMPTY
    /* empty */
  | %name PROG
    prog %decORexp? stmt
;

stmt: 
    %name EXP
    expr ';' 
  | %name DECL
    decl    
;

expr:
    %name ID:EXP
    ID                            %PREC decORexp 
  | %name NUM 
    NUM
  | %name TYPECAST
    INT '(' expr ')' /* typecast */ 
  | %name PLUS
    expr '+' expr
  | %name ASSIGN
    expr '=' expr
;

decl:
    %name DECLARATOR
    INT declarator ';'
  | %name DECLARATORINIT
    INT declarator '=' expr ';'
;

declarator:
    %name ID:DEC
    ID                            %PREC decORexp 
  | '(' declarator ')'
;

%%

####################################################

=head1 SYNOPSIS

Compile it with
 
   eyapp -C CplusplusStartOption

This compiletion must produce warnings

   eyapp -S decl -C CplusplusStartOption

=cut