File Coverage

blib/lib/PPI/Token/Number/Float.pm
Criterion Covered Total %
statement 36 36 100.0
branch 14 14 100.0
condition n/a
subroutine 4 4 100.0
pod 1 1 100.0
total 55 55 100.0


line stmt bran cond sub pod time code
1             package PPI::Token::Number::Float;
2              
3             =pod
4              
5             =head1 NAME
6              
7             PPI::Token::Number::Float - Token class for a floating-point number
8              
9             =head1 SYNOPSIS
10              
11             $n = 1.234;
12              
13             =head1 INHERITANCE
14              
15             PPI::Token::Number::Float
16             isa PPI::Token::Number
17             isa PPI::Token
18             isa PPI::Element
19              
20             =head1 DESCRIPTION
21              
22             The C<PPI::Token::Number::Float> class is used for tokens that
23             represent floating point numbers. A float is identified by n decimal
24             point. Exponential notation (the C<e> or C<E>) is handled by the
25             PPI::Token::Number::Exp class.
26              
27             =head1 METHODS
28              
29             =cut
30              
31 67     67   362 use strict;
  67         101  
  67         1849  
32 67     67   239 use PPI::Token::Number ();
  67         86  
  67         30921  
33              
34             our $VERSION = '1.284';
35              
36             our @ISA = "PPI::Token::Number";
37              
38             =pod
39              
40             =head2 base
41              
42             Returns the base for the number: 10.
43              
44             =cut
45              
46             sub base() { 10 }
47              
48             =pod
49              
50             =head2 literal
51              
52             Return the numeric value of this token.
53              
54             =cut
55              
56             sub literal {
57 11     11 1 118 my $self = shift;
58 11         43 my $str = $self->_literal;
59 11         15 my $neg = $str =~ s/^\-//;
60 11         20 $str =~ s/^\./0./;
61 11         33 my $val = 0+$str;
62 11 100       54 return $neg ? -$val : $val;
63             }
64              
65              
66              
67              
68              
69             #####################################################################
70             # Tokenizer Methods
71              
72             sub __TOKENIZER__on_char {
73 8257     8257   9718 my $class = shift;
74 8257         9135 my $t = shift;
75 8257         12916 my $char = substr( $t->{line}, $t->{line_cursor}, 1 );
76              
77             # Allow underscores straight through
78 8257 100       12952 return 1 if $char eq '_';
79              
80             # Allow digits
81 7646 100       20484 return 1 if $char =~ /\d/o;
82              
83 2776 100       5296 if ( $char eq '.' ) { # A second decimal point? That gets complicated.
84 1327 100       5621 if ( $t->{token}{content} =~ /\.$/ ) {
    100          
85             # We have a .., which is an operator. Take the . off the end of the
86             # token and finish it, then make the .. operator.
87 5         17 chop $t->{token}{content};
88 5         36 $t->{class} = $t->{token}->set_class( 'Number' );
89 5         20 $t->_new_token('Operator', '..');
90 5         12 return 0;
91             } elsif ( $t->{token}{content} =~ /\._/ ) {
92             ($t->{token}{content}, my $bareword)
93 171         763 = split /\./, $t->{token}{content};
94 171         505 $t->{class} = $t->{token}->set_class( 'Number' );
95 171         521 $t->_new_token('Operator', '.');
96 171         364 $t->_new_token('Word', $bareword);
97 171         342 $t->_new_token('Operator', '.');
98 171         371 return 0;
99             } else {
100 1151         2868 $t->{class} = $t->{token}->set_class( 'Number::Version' );
101 1151         2717 return 1;
102             }
103             }
104              
105             # perl seems to regard pretty much anything that's not strictly an exp num
106             # as float + stuff
107 1449         3173 my $char2 = substr $t->{line}, $t->{line_cursor}+1, 1;
108 1449 100       4514 if ("$char$char2" =~ /[eE][0-9+-]/) {
109 12         32 $t->{class} = $t->{token}->set_class( 'Number::Exp' );
110 12         25 return 1;
111             }
112              
113             # Doesn't fit a special case, or is after the end of the token
114             # End of token.
115 1437         3358 $t->_finalize_token->__TOKENIZER__on_char( $t );
116             }
117              
118             1;
119              
120             =pod
121              
122             =head1 SUPPORT
123              
124             See the L<support section|PPI/SUPPORT> in the main module.
125              
126             =head1 AUTHOR
127              
128             Chris Dolan E<lt>cdolan@cpan.orgE<gt>
129              
130             =head1 COPYRIGHT
131              
132             Copyright 2006 Chris Dolan.
133              
134             This program is free software; you can redistribute
135             it and/or modify it under the same terms as Perl itself.
136              
137             The full text of the license can be found in the
138             LICENSE file included with this module.
139              
140             =cut