From b287985d5a389c4f5598e3f862604c36f587133e Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 5 Oct 2012 19:16:35 -0500 Subject: simplify the parsing logic significanly by redefining expression the handlebars language isn't a typical infix-style thing, so it makes sense that expressions will have differerent meanings here --- lib/Text/Xslate/Syntax/Handlebars.pm | 75 ++++++++++++------------------------ 1 file changed, 25 insertions(+), 50 deletions(-) diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index fb59658..4bc57ba 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -231,7 +231,6 @@ sub init_symbols { for my $type (qw(name variable literal)) { my $symbol = $self->symbol("($type)"); - $symbol->set_led($self->can("led_$type")); $symbol->lbp(10); } @@ -241,7 +240,6 @@ sub init_symbols { $symbol->id('.'); $symbol->lbp(10); $symbol->set_nud($self->can('nud_variable')); - $symbol->set_led($self->can('led_variable')); } for my $field_access (qw(. /)) { @@ -317,12 +315,6 @@ sub nud_name { return $call; } -sub led_name { - my $self = shift; - - $self->_unexpected("a variable or literal", $self->token); -} - sub nud_variable { my $self = shift; my ($symbol) = @_; @@ -332,47 +324,6 @@ sub nud_variable { return $self->check_lambda($var); } -sub led_variable { - my $self = shift; - my ($symbol, $left) = @_; - - if ($left->arity ne 'call') { - $self->_error("Unexpected variable found", $symbol); - } - - my $var = $symbol; - my $rbp = $var->lbp - 1; # right-associative - - # was this actually supposed to be an expression? - # for instance, {{foo bar baz.quux blorg}} - # if we get here for baz, we need to make sure we end up with all of - # baz.quux - # this basically just reimplements $self->expression, except starting - # partway through - while ($rbp < $self->token->lbp) { - my $token = $self->token; - $self->advance; - $var = $token->led($self, $var); - } - - push @{ $left->second }, $self->check_lambda($var); - - return $left; -} - -sub led_literal { - my $self = shift; - my ($symbol, $left) = @_; - - if ($left->arity ne 'call') { - $self->_error("Unexpected literal found", $symbol); - } - - push @{ $left->second }, $symbol; - - return $left; -} - sub led_dot { my $self = shift; my ($symbol, $left) = @_; @@ -585,7 +536,6 @@ sub define_function { for my $name (@names) { my $symbol = $self->symbol($name); $symbol->set_nud($self->can('nud_name')); - $symbol->set_led($self->can('led_name')); $symbol->lbp(10); } @@ -632,6 +582,31 @@ sub is_valid_field { return; } +sub expression { + my $self = shift; + my ($rbp) = @_; + + my $token = $self->token; + $self->advance; + my $left = $token->nud($self); + + while ($rbp < $self->token->lbp) { + $token = $self->token; + if ($token->has_led) { + $self->advance; + $left = $token->led($self, $left); + } + else { + if ($left->arity ne 'call') { + $self->_error("Unexpected " . $token->arity, $left); + } + push @{ $left->second }, $self->expression($token->lbp); + } + } + + return $left; +} + sub make_field_lookup { my $self = shift; my ($var, $field, $dot) = @_; -- cgit v1.2.3-54-g00ecf