#obsolete
%{
my $ID = qr{[A-Za-z][A-Za-z0-9_]*};
my ($PREFIX, $POSTFIX);
{
use Regexp::Grammars;
qr{
<grammar: ConflictSolver>
<rule: Prefix> TYPE ID = \( ID$
<rule: Postfix> \G ( , <id> )* \) ;
<token: id> [A-Za-z_][A-Za-z0-9_]*
}x;
$PREFIX = qr{
<Prefix>
<extends: ConflictSolver>
}x;
$POSTFIX = qr{
<Postfix>
<extends: ConflictSolver>
}x;
}
%}
%conflict rangeORenum {
my $pre = join '', $self->YYSymbolStack("TYPE",-1);
if ($pre =~ /$PREFIX$/ && /$POSTFIX/) { $self->YYSetReduce([',', ')'], 'ID:ENUM' ); }
else { $self->YYSetReduce([',', ')'], 'ID:RANGE' ); }
}
%token TYPE = /type/
%token ID = /([A-Za-z][A-Za-z0-9_]*)/
%token NUM = /(\d+)/
%left ','
%left '-' '+'
%left '*' '/'
%expect-rr 2
%%
type_decl : TYPE ID '=' type ';'
;
type :
%name ENUM
'(' id_list ')'
| %name RANGE
expr '..' expr
;
id_list :
%name ID:ENUM
ID %PREC rangeORenum
| 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 rangeORenum
| %name NUM NUM
;
%%
=head1 SYNOPSIS
See
=over 2
=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 something like:
eyapp -TC pascalenumeratedvsrangenested.eyp
if your Perl version is higher than 5.10, otherwise:
eyapp -T -b '/usr/bin/env perl5.10.1' -B '' pascalenumeratedvsrangenested.eyp
Substitute the perl5.10.1 part
for whatever you have, but be sure
you use a version of the Perl nterpreter equal or higher than 5.10.
Be also sure to have installed the last version of L<Regexp::Grammars>.
Run it with this options:
$ ./pascalenumeratedvsrangenested.pm -t -i -m 1 -c 'type e = (x, y, 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