PPI::Token::Number::Exp - Token class for an exponential notation number


PPI documentation Contained in the PPI distribution.

Index


Code Index:

NAME

Top

PPI::Token::Number::Exp - Token class for an exponential notation number

SYNOPSIS

Top

  $n = 1.0e-2;
  $n = 1e+2;

INHERITANCE

Top

  PPI::Token::Number::Exp
  isa PPI::Token::Number::Float
      isa PPI::Token::Number
          isa PPI::Token
              isa PPI::Element

DESCRIPTION

Top

The PPI::Token::Number::Exp class is used for tokens that represent floating point numbers with exponential notation.

METHODS

Top

literal

Return the numeric value of this token.

SUPPORT

Top

See the support section in the main module.

AUTHOR

Top

Chris Dolan <cdolan@cpan.org>

COPYRIGHT

Top


PPI documentation Contained in the PPI distribution.
package PPI::Token::Number::Exp;

use strict;
use PPI::Token::Number::Float ();

use vars qw{$VERSION @ISA};
BEGIN {
	$VERSION = '1.215';
	@ISA     = 'PPI::Token::Number::Float';
}

sub literal {
	my $self = shift;
	return if $self->{_error};
	my ($mantissa, $exponent) = split m/e/i, $self->_literal;
	my $neg = $mantissa =~ s/^\-//;
	$mantissa =~ s/^\./0./;
	$exponent =~ s/^\+//;
	my $val = $mantissa * 10 ** $exponent;
	return $neg ? -$val : $val;
}





#####################################################################
# Tokenizer Methods

sub __TOKENIZER__on_char {
	my $class = shift;
	my $t     = shift;
	my $char  = substr( $t->{line}, $t->{line_cursor}, 1 );

        # To get here, the token must have already encountered an 'E'

	# Allow underscores straight through
	return 1 if $char eq '_';

	# Allow digits
	return 1 if $char =~ /\d/o;

	# Start of exponent is special
	if ( $t->{token}->{content} =~ /e$/i ) {
		# Allow leading +/- in exponent
		return 1 if $char eq '-' || $char eq '+';

		# Invalid character in exponent.  Recover
		if ( $t->{token}->{content} =~ s/\.(e)$//i ) {
			my $word = $1;
			$t->{class} = $t->{token}->set_class('Number');
			$t->_new_token('Operator', '.');
			$t->_new_token('Word', $word);
			return $t->{class}->__TOKENIZER__on_char( $t );
		}
		else {
			$t->{token}->{_error} = "Illegal character in exponent '$char'";
		}
	}

	# Doesn't fit a special case, or is after the end of the token
	# End of token.
	$t->_finalize_token->__TOKENIZER__on_char( $t );
}

1;