%token D S %{ our $VERSION = '0.01'; %} %% p: ds ';' ss | ss ; ds: ds ';' D | D { print "Reducing by rule:\n"; print "\tds -> D\n"; $_[1]; } ; ss: S ';' ss | S ; %% my $tokenline = 0; sub _Error { my $parser = shift; my ($token) = $parser->YYCurval; my ($what) = $token ? "input: '$token'" : "end of input"; die "Syntax error near $what line num $tokenline\n"; } my $input; sub _Lexer { for ($input) { s{^(\s+)}{} and $tokenline += $1 =~ tr{\n}{}; return ('',undef) unless $_; return ($1,$1) if s/^(.)//; } return ('',undef); } sub Run { my ($self) = shift; $input = shift; return $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error, yydebug => 0x1F, ); }