The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

%conflict rORe range? ID:RANGE : ID:ENUM

%token ID  = /([A-Za-z]\w*)/
%token NUM = /(\d+)/

%left   ','
%left   '-' '+'
%left   '*' '/'

%expect-rr 2

%%

type_decl : 'type' ID '=' type ';'
;

type : 
      %name ENUM
      %rORe? '(' id_list ')'
    | %name RANGE
      %rORe? range
;

range:
       expr '..' expr
;

id_list : 
      %name ID:ENUM
      ID                      %PREC rORe
    | id_list ',' ID
;

expr : '(' expr ')'   { $_[2] } /* bypass */
    | %name PLUS     expr '+' expr
    | %name MINUS    expr '-' expr
    | %name TIMES    expr '*' expr
    | %name DIV      expr '/' expr
    | %name COMMA    expr ',' expr
    | %name ID:RANGE
      ID                     %PREC rORe
    | %name NUM      NUM
;

%%

=head1 SYNOPSIS

See 

=over 2

=item * File C<userange.pl>.

=item * File pascalenumeratedvsrange.eyp in examples/debuggintut/

=item * The Bison manual L<http://www.gnu.org/software/bison/manual/html_mono/bison.html>

=back

Compile it with:

      eyapp -TC pascalnestedeyapp3_6.eyp

The compile it again, but using 'range' as start symbol (option -S)
and option -P to generate a parser that accepts if a prefix of the input matches:

      eyapp -P -S range pascalnestedeyapp3_6.eyp 

Run it with this options:

    $  ./pascalnestedeyapp3_6.pm -t -i -m 1 -c 'type e = (x)..(z);'
    $ ./pascalnestedeyapp3_6.pm -t -i -m 1 -c 'type e = (x, y, z);'
    $ ./pascalnestedeyapp3_6.pm -t -i -m 1 -c 'type e = (x, @, z);'

Try also these inputs:

                type e = (x) .. (y);
                type r = (x) ..  y ;
                type r = (x+2)*3 ..  y/2 ;
                type e = (x, y, z);
                type e = (x);
                type e = (x, y, z) .. (u+v);


=cut