package Tail2; use base qw(Exporter); our @EXPORT = qw(_Error make_lexer Run); sub _Error { my $parser = shift; my $yydata = $parser->YYData; exists $yydata->{ERRMSG} and do { print $yydata->{ERRMSG}; delete $yydata->{ERRMSG}; return; }; my($token)=$parser->YYCurval; my($what)= $token->[0] ? "input: '$token->[0]'" : "end of input"; my @expected = $parser->YYExpect(); local $" = ', '; print << "ERRMSG"; Syntax error near $what (lin num $token->[1]). Expected one of these terminals: @expected ERRMSG } sub make_lexer { my $input = shift; return sub { my($parser)=shift; for ($$input) { s/^\s+//; s/^([0-9]+(?:\.[0-9]+)?)// and return('NUM',$1); s/^while// and return('while', 'while'); s/^([A-Za-z][A-Za-z0-9_]*)// and return('VAR',$1); s/^(.)//s and return($1,$1); return('',undef); } return('',undef); } } sub Run { my($self)=shift; my $input = shift or die "No input given\n"; return $self->YYParse( yylex => make_lexer($input), yyerror => \&_Error, #yydebug =>0x1F ); } 1;