summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-05 19:16:35 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-05 19:16:35 -0500
commitb287985d5a389c4f5598e3f862604c36f587133e (patch)
treece86d99fe4e651fdceb735b23558c6f9cd2e408c
parent4274b4f60eb88018f7d0bf6d9c3c5d206231f05b (diff)
downloadtext-handlebars-b287985d5a389c4f5598e3f862604c36f587133e.tar.gz
text-handlebars-b287985d5a389c4f5598e3f862604c36f587133e.zip
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
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm75
1 files 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) = @_;