From 436ad07f1cce8d202c601ca0d0609e01e42fba4b Mon Sep 17 00:00:00 2001 From: Jeff Ober Date: Fri, 17 Jan 2020 14:02:24 -0500 Subject: [PATCH] Tokenizer no longer keeps copy of every token --- lib/TOML/Tiny/Tokenizer.pm | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/lib/TOML/Tiny/Tokenizer.pm b/lib/TOML/Tiny/Tokenizer.pm index f40c228..4704d8f 100644 --- a/lib/TOML/Tiny/Tokenizer.pm +++ b/lib/TOML/Tiny/Tokenizer.pm @@ -17,32 +17,20 @@ sub new { last_position => length $param{source}, position => 0, line => 1, - tokens => [], + last_token => undef, }, $class; return $self; } -sub prev_token_type { - my $self = shift; - - if (@{$self->{tokens}}) { - return $self->{tokens}[-1]{type} // 'EOL'; - } - - return 'EOL'; -} - sub next_token { my $self = shift; return unless defined $self->{source} && $self->{position} < $self->{last_position}; - if (!@{ $self->{tokens} }) { - my $root = {type => 'table', pos => 0, line => 1, value => []}; - $self->push_token($root); - return $root; + if (!$self->{last_token}) { + return $self->{last_token} = {type => 'table', pos => 0, line => 1, value => []}; } # Update the regex engine's position marker in case some other regex @@ -70,7 +58,7 @@ sub next_token { # More complex matches with regexps while ($self->{position} < $self->{last_position} && !defined($type)) { - my $prev = $self->prev_token_type; + my $prev = $self->{last_token} ? $self->{last_token}{type} : 'EOL'; my $newline = !!($prev eq 'EOL' || $prev eq 'table' || $prev eq 'array_table'); for ($self->{source}) { @@ -133,14 +121,12 @@ sub next_token { } if ($type) { - $token = { + $token = $self->{last_token} = { line => $self->{line}, pos => $self->{pos}, type => $type, value => $self->can("tokenize_$type") ? $self->can("tokenize_$type")->($self, $value) : $value, }; - - $self->push_token($token); } $self->update_position; @@ -149,16 +135,6 @@ sub next_token { return $token; } -sub push_token { - my $self = shift; - @_ && push @{$self->{tokens}}, @_; -} - -sub pop_token { - my $self = shift; - pop @{$self->{tokens}}; -} - sub current_line { my $self = shift; my $rest = substr $self->{source}, $self->{position}; -- 2.30.2