# Copyright (c)  Philippe Verdret, 1995-1998

require 5.003;
use strict;

package Parse::Token;

my $old_next = \&next;
*next = sub {			# add some actions before and after the routine call
  my $self = $_[0];
  if ($Parse::Token::trace) {
    my $name = $self->name;
    $self->context("try to find:\t$name");
    my $reader = $self->reader;
    my $pendingToken = $reader->[$Lex::PEND_TOKEN];
    if ($pendingToken) {
      if ($pendingToken->name eq 'EOI') {
	$self->context("End of input at line $.");	
	return undef;
      } else {
	$self->context("pending token:\t", $pendingToken->name);
      }
    }
  }
  my $string = &$old_next(@_);
  if ($Parse::Token::trace) {
    if ($self->status) {
      $self->context("token found: $string");
    } else {
      $self->context("token not found");
    }
  }
  $string;
};

my $old_isnext = \&isnext;
*isnext = sub {
  my $self = $_[0];
  if ($Parse::Token::trace) {
    my $name = $self->name;
    $self->context("try to find:\t$name");
    my $reader = $self->reader;
    my $pendingToken = $reader->[$Lex::PEND_TOKEN];
    if ($pendingToken) {
      if ($pendingToken->name eq 'EOI') {
	$self->context("End of input at line $.");	
	return undef;
      } else {
	$self->context("pending token:\t", $pendingToken->name);
      }
    }
  }
  my $status = &$old_isnext(@_);
  if ($Parse::Token::trace) {
    if ($self->status) {
      $self->context("token found: ${$_[1]}");
    } else {
      $self->context("token not found");
    }
  }
  $status;
};

1;

__END__