From cf6ad41c12a84256acd34016ea833a05518a974b Mon Sep 17 00:00:00 2001 From: vitalif Date: Thu, 27 Nov 2014 22:51:14 +0000 Subject: [PATCH] Fix bugs in perl VMXTemplate --- VMXTemplate.pm | 22 +- VMXTemplate/Compiler.pm | 1 + VMXTemplate/Lexer.pm | 2 +- VMXTemplate/Options.pm | 2 +- VMXTemplate/Parser.pm | 3194 +++++++++++++++++++-------------------- template.yp | 4 +- 6 files changed, 1616 insertions(+), 1609 deletions(-) diff --git a/VMXTemplate.pm b/VMXTemplate.pm index a638c4e..d29bff2 100644 --- a/VMXTemplate.pm +++ b/VMXTemplate.pm @@ -32,8 +32,9 @@ use strict; use Digest::MD5 qw(md5_hex); use POSIX; +use VMXTemplate::Utils; use VMXTemplate::Options; -use VMXTemplate::Compiler; +use VMXTemplate::Parser; # Version of code classes, saved into compiled files use constant CODE_VERSION => 4; @@ -97,7 +98,7 @@ sub vars sub parse { my ($self, $fn, $vars) = @_; - return $self->parse_real($fn, undef, '_main', $vars); + return $self->parse_real($fn, undef, undef, $vars); } # Call named block/function from a template @@ -112,7 +113,7 @@ sub exec_from sub parse_inline { my ($self, $code, $vars) = @_; - return $self->parse_real(undef, $_[1], '_main', $vars); + return $self->parse_real(undef, $_[1], undef, $vars); } # Call function from a string parsed as a template @@ -141,7 +142,7 @@ sub parse_real # Load code if ($filename) { - $filename = $self->{root}.$filename if $filename !~ m!^/!so; + $filename = $self->{options}->{root}.$filename if $filename !~ m!^/!so; unless ($text = $self->loadfile($filename)) { $self->{options}->error("couldn't load template file '$filename'"); @@ -178,14 +179,19 @@ sub _run my ($code, $is_outer, $function, $filename, $vars) = @_; $function ||= ':main'; my $str = $code->{$function}; + if (!defined $str) + { + $self->{options}->error("template function '$function' not found in '".($filename || 'inline template')."'"); + return $is_outer ? $self->{options}->get_errors : ''; + } # a template function is just a constant if not a coderef - if (ref $str eq 'CODE') + elsif (ref $str eq 'CODE') { local $self->{tpldata} = $vars if $vars; $str = eval { &$str($self) }; if ($@) { - $self->{options}->error("error running '".($filename || 'inline template').'::'."$function': $@"); + $self->{options}->error("error running function '$function' from '".($filename || 'inline template')."': $@"); return $is_outer ? $self->{options}->get_errors : ''; } } @@ -296,7 +302,7 @@ sub compile # call Compiler $self->{options}->{input_filename} = $fn; - $self->{compiler} ||= VMXTemplate::Compiler->new($self->{options}); + $self->{compiler} ||= VMXTemplate::Parser->new($self->{options}); $code = $self->{compiler}->compile($code); # write compiled code to file @@ -319,7 +325,7 @@ sub compile $self->{compiled_code}->{$key} = eval $code; if ($@) { - $self->error("error compiling '$fn': [$@] in CODE:\n$code"); + $self->{options}->error("error compiling '$fn': [$@] in CODE:\n$code"); return (); } diff --git a/VMXTemplate/Compiler.pm b/VMXTemplate/Compiler.pm index 4e693c9..cf8ac6e 100644 --- a/VMXTemplate/Compiler.pm +++ b/VMXTemplate/Compiler.pm @@ -233,6 +233,7 @@ sub compile_function sub fmop { my $op = shift; + my $self = shift; return "((" . join(") $op (", @_) . "))"; } diff --git a/VMXTemplate/Lexer.pm b/VMXTemplate/Lexer.pm index 70cd035..dab7bad 100644 --- a/VMXTemplate/Lexer.pm +++ b/VMXTemplate/Lexer.pm @@ -106,7 +106,7 @@ sub read_token { my $r; my $code_pos = index($self->{code}, $self->{options}->{begin_code}); - my $subst_pos = index($self->{code}, $self->{options}->{begin_subst}); + my $subst_pos = $self->{options}->{begin_subst} ne '' ? index($self->{code}, $self->{options}->{begin_subst}) : -1; if ($code_pos == -1 && $subst_pos == -1) { # No more directives diff --git a/VMXTemplate/Options.pm b/VMXTemplate/Options.pm index fced8e1..93d7e39 100644 --- a/VMXTemplate/Options.pm +++ b/VMXTemplate/Options.pm @@ -77,7 +77,7 @@ sub get_errors { return '
'. 'VMXTemplate errors:'; } return ''; diff --git a/VMXTemplate/Parser.pm b/VMXTemplate/Parser.pm index 95b71d1..79c6f97 100644 --- a/VMXTemplate/Parser.pm +++ b/VMXTemplate/Parser.pm @@ -27,1471 +27,1500 @@ sub new {#State 0 DEFAULT => -2, GOTOS => { - 'chunks' => 2, - 'template' => 1 + 'chunks' => 1, + 'template' => 2 } }, {#State 1 ACTIONS => { - '' => 3 + '' => -1, + 'literal' => 3, + "{{" => 5, + 'error' => 4, + "" => 69 + } }, {#State 24 DEFAULT => -9 }, {#State 25 - DEFAULT => -10 + DEFAULT => -8 }, {#State 26 - DEFAULT => -29 + ACTIONS => { + "-->" => 70, + "=" => 71 + } }, {#State 27 - DEFAULT => -25 + DEFAULT => -29 }, {#State 28 ACTIONS => { - 'name' => 71 - }, - GOTOS => { - 'varref' => 70 + 'name' => 72 } }, {#State 29 ACTIONS => { - "-->" => 73, - "=" => 72 - } - }, - {#State 30 - ACTIONS => { - "!" => 20, - 'name' => 19, - 'literal' => 18, - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16 - }, - GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'nonbrace' => 9, - 'exp' => 74, - 'varref' => 15 - } - }, - {#State 31 - DEFAULT => -26 - }, - {#State 32 - ACTIONS => { - "-->" => 75 - } - }, - {#State 33 - DEFAULT => -27 - }, - {#State 34 - ACTIONS => { - ">=" => 60, - "&&" => 62, - ".." => 61, - "OR" => 63, - "%" => 58, - "&" => 59, - "AND" => 65, - "!=" => 64, - "||" => 53, - "+" => 49, - "<" => 48, - "/" => 47, - "XOR" => 51, - "-" => 50, - ">" => 52, - "*" => 55, - "<=" => 57, - "==" => 54 + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "XOR" => 54, + "<=" => 55, + ">" => 56 }, DEFAULT => -12 }, - {#State 35 + {#State 30 ACTIONS => { - 'name' => 71 + 'name' => 74 }, GOTOS => { - 'varref' => 76 + 'varref' => 73 } }, + {#State 31 + ACTIONS => { + 'name' => 74 + }, + GOTOS => { + 'varref' => 75 + } + }, + {#State 32 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 76, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } + }, + {#State 33 + DEFAULT => -28 + }, + {#State 34 + DEFAULT => -11 + }, + {#State 35 + DEFAULT => -10 + }, {#State 36 - DEFAULT => -8 + DEFAULT => -25 }, {#State 37 - ACTIONS => { - "}" => 77 - } + DEFAULT => -53 }, {#State 38 ACTIONS => { - "AND" => 65, - "!=" => 64, - "OR" => 63, - ".." => 61, - "&&" => 62, - ">=" => 60, - "&" => 59, - "%" => 58, - "<=" => 57, - "*" => 55, - "==" => 54, - "," => 79, - "||" => 53, - "-" => 50, - ">" => 52, - "XOR" => 51, - "=>" => 78, - "<" => 48, - "+" => 49, - "/" => 47 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 77, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 39 - DEFAULT => -76 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 78, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 40 ACTIONS => { - "," => 80 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, - DEFAULT => -70 + GOTOS => { + 'exp' => 79, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 41 - DEFAULT => -57 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 80, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 42 - DEFAULT => -53 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 81, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 43 ACTIONS => { - "!" => 20, - 'name' => 19, - 'literal' => 18, - "-" => 12, - "(" => 16, - "{" => 10, - "NOT" => 11 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'varref' => 15, - 'exp' => 81, - 'nonbrace' => 9 + 'exp' => 82, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 44 ACTIONS => { - 'name' => 82 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 83, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 45 - DEFAULT => -79 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 84, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 46 - ACTIONS => { - "!=" => 64, - "AND" => 65, - "%" => 58, - "&" => 59, - "&&" => 62, - ">=" => 60, - ".." => 61, - "OR" => 63, - "==" => 54, - ")" => 83, - "*" => 55, - "<=" => 57, - "/" => 47, - "<" => 48, - "+" => 49, - ">" => 52, - "XOR" => 51, - "-" => 50, - "||" => 53 - } + DEFAULT => -6 }, {#State 47 ACTIONS => { - "(" => 16, - "NOT" => 11, - "{" => 10, - "-" => 12, - 'literal' => 18, - 'name' => 19, - "!" => 20 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'varref' => 15, - 'exp' => 84, - 'nonbrace' => 9 + 'exp' => 85, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 48 ACTIONS => { - "-" => 12, - "(" => 16, - "NOT" => 11, - "{" => 10, - "!" => 20, - 'name' => 19, - 'literal' => 18 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'nonbrace' => 9, - 'exp' => 85, - 'varref' => 15 + 'exp' => 86, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 49 ACTIONS => { - "!" => 20, - 'literal' => 18, - 'name' => 19, - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'nonbrace' => 9, - 'exp' => 86, - 'varref' => 15, - 'p11' => 14, - 'p10' => 13 + 'exp' => 87, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 50 ACTIONS => { - 'name' => 19, - 'literal' => 18, - "!" => 20, - "(" => 16, - "NOT" => 11, - "{" => 10, - "-" => 12 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'exp' => 87, - 'nonbrace' => 9, - 'varref' => 15 + 'exp' => 88, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 51 ACTIONS => { - "-" => 12, - "{" => 10, - "NOT" => 11, - "(" => 16, - "!" => 20, - 'literal' => 18, - 'name' => 19 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'varref' => 15, - 'exp' => 88, - 'nonbrace' => 9, - 'p11' => 14, - 'p10' => 13 + 'exp' => 89, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 52 ACTIONS => { - "(" => 16, - "{" => 10, - "NOT" => 11, - "-" => 12, - 'name' => 19, - 'literal' => 18, - "!" => 20 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'exp' => 89, - 'nonbrace' => 9, - 'varref' => 15 + 'exp' => 90, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 53 ACTIONS => { - "{" => 10, - "NOT" => 11, - "(" => 16, - "-" => 12, - 'name' => 19, - 'literal' => 18, - "!" => 20 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'nonbrace' => 9, - 'exp' => 90, - 'varref' => 15 + 'exp' => 91, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 54 ACTIONS => { - "(" => 16, - "{" => 10, - "NOT" => 11, - "-" => 12, - 'literal' => 18, - 'name' => 19, - "!" => 20 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'exp' => 91, - 'nonbrace' => 9, - 'varref' => 15, - 'p10' => 13, - 'p11' => 14 + 'exp' => 92, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 55 ACTIONS => { - "!" => 20, - 'name' => 19, - 'literal' => 18, - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'nonbrace' => 9, - 'exp' => 92, - 'varref' => 15 + 'exp' => 93, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 56 - DEFAULT => -6 - }, - {#State 57 ACTIONS => { - 'literal' => 18, - 'name' => 19, - "!" => 20, - "{" => 10, - "NOT" => 11, - "(" => 16, - "-" => 12 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'exp' => 93, - 'nonbrace' => 9, - 'varref' => 15 + 'exp' => 94, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, + {#State 57 + DEFAULT => -64 + }, {#State 58 ACTIONS => { - 'name' => 19, - 'literal' => 18, - "!" => 20, - "{" => 10, - "NOT" => 11, - "(" => 16, - "-" => 12 + "-" => 9, + "{" => 13, + 'name' => 12, + 'literal' => 15, + "!" => 18, + "(" => 17, + "NOT" => 20, + ")" => 95 }, GOTOS => { - 'nonbrace' => 9, - 'exp' => 94, - 'varref' => 15, - 'p10' => 13, - 'p11' => 14 + 'exp' => 97, + 'nonbrace' => 11, + 'gtpair' => 98, + 'varref' => 14, + 'p11' => 16, + 'p10' => 19, + 'gthash' => 99, + 'list' => 96 } }, {#State 59 ACTIONS => { - "-" => 12, - "(" => 16, - "{" => 10, - "NOT" => 11, - "!" => 20, - 'name' => 19, - 'literal' => 18 + "," => 100 }, - GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'exp' => 95, - 'nonbrace' => 9, - 'varref' => 15 - } + DEFAULT => -70 }, {#State 60 ACTIONS => { - "NOT" => 11, - "{" => 10, - "(" => 16, - "-" => 12, - 'name' => 19, - 'literal' => 18, - "!" => 20 - }, - GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'varref' => 15, - 'exp' => 96, - 'nonbrace' => 9 + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "," => 101, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "XOR" => 54, + "=>" => 102, + "<=" => 55, + ">" => 56 } }, {#State 61 - ACTIONS => { - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16, - "!" => 20, - 'name' => 19, - 'literal' => 18 - }, - GOTOS => { - 'nonbrace' => 9, - 'exp' => 97, - 'varref' => 15, - 'p10' => 13, - 'p11' => 14 - } + DEFAULT => -76 }, {#State 62 ACTIONS => { - "-" => 12, - "(" => 16, - "NOT" => 11, - "{" => 10, - "!" => 20, - 'literal' => 18, - 'name' => 19 - }, - GOTOS => { - 'varref' => 15, - 'nonbrace' => 9, - 'exp' => 98, - 'p10' => 13, - 'p11' => 14 + "}" => 103 } }, {#State 63 ACTIONS => { - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16, - "!" => 20, - 'name' => 19, - 'literal' => 18 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'varref' => 15, - 'nonbrace' => 9, - 'exp' => 99, - 'p10' => 13, - 'p11' => 14 + 'exp' => 104, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 64 ACTIONS => { - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16, - "!" => 20, - 'name' => 19, - 'literal' => 18 - }, - GOTOS => { - 'varref' => 15, - 'exp' => 100, - 'nonbrace' => 9, - 'p10' => 13, - 'p11' => 14 + 'name' => 105 } }, {#State 65 - ACTIONS => { - "(" => 16, - "NOT" => 11, - "{" => 10, - "-" => 12, - 'literal' => 18, - 'name' => 19, - "!" => 20 - }, - GOTOS => { - 'p11' => 14, - 'p10' => 13, - 'varref' => 15, - 'exp' => 101, - 'nonbrace' => 9 - } + DEFAULT => -79 }, {#State 66 - DEFAULT => -64 + ACTIONS => { + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + ")" => 106, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "XOR" => 54, + "<=" => 55, + ">" => 56 + } }, {#State 67 - ACTIONS => { - "{" => 10, - "NOT" => 11, - "-" => 12, - "(" => 16, - ")" => 105, - 'name' => 19, - 'literal' => 18, - "!" => 20 - }, - GOTOS => { - 'gtpair' => 102, - 'list' => 103, - 'p10' => 13, - 'p11' => 14, - 'nonbrace' => 9, - 'gthash' => 104, - 'exp' => 106, - 'varref' => 15 - } - }, - {#State 68 DEFAULT => -56 }, + {#State 68 + DEFAULT => -57 + }, {#State 69 - ACTIONS => { - "(" => 107 - } + DEFAULT => -5 }, {#State 70 - ACTIONS => { - "[" => 43, - "=" => 108, - "." => 44 - }, + DEFAULT => -2, GOTOS => { - 'varpart' => 45 + 'chunks' => 107 } }, {#State 71 - DEFAULT => -78 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 108, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 72 ACTIONS => { - "!" => 20, - 'name' => 19, - 'literal' => 18, - "-" => 12, - "(" => 16, - "{" => 10, - "NOT" => 11 - }, - GOTOS => { - 'varref' => 15, - 'exp' => 109, - 'nonbrace' => 9, - 'p10' => 13, - 'p11' => 14 + "(" => 109 } }, {#State 73 - DEFAULT => -2, + ACTIONS => { + "-->" => 110, + "[" => 63, + "." => 64, + "=" => 111 + }, GOTOS => { - 'chunks' => 110 + 'varpart' => 65 } }, {#State 74 - ACTIONS => { - "||" => 53, - "XOR" => 51, - "-" => 50, - ">" => 52, - "-->" => 111, - "/" => 47, - "<" => 48, - "+" => 49, - "<=" => 57, - "*" => 55, - "==" => 54, - "OR" => 63, - ".." => 61, - "&&" => 62, - ">=" => 60, - "&" => 59, - "%" => 58, - "AND" => 65, - "!=" => 64 - } + DEFAULT => -78 }, {#State 75 - DEFAULT => -5 + ACTIONS => { + "[" => 63, + "." => 64, + "=" => 112 + }, + GOTOS => { + 'varpart' => 65 + } }, {#State 76 ACTIONS => { - "." => 44, - "-->" => 112, - "=" => 113, - "[" => 43 - }, - GOTOS => { - 'varpart' => 45 + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "-->" => 113, + "XOR" => 54, + "<=" => 55, + ">" => 56 } }, {#State 77 - DEFAULT => -58 - }, - {#State 78 ACTIONS => { - "-" => 12, - "{" => 10, - "NOT" => 11, - "(" => 16, - "!" => 20, - 'literal' => 18, - 'name' => 19 - }, - GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'exp' => 114, - 'nonbrace' => 9, - 'varref' => 15 - } - }, - {#State 79 - ACTIONS => { - 'name' => 19, - 'literal' => 18, - "!" => 20, - "NOT" => 11, - "{" => 10, - "(" => 16, - "-" => 12 - }, - GOTOS => { - 'varref' => 15, - 'exp' => 115, - 'nonbrace' => 9, - 'p10' => 13, - 'p11' => 14 - } - }, - {#State 80 - ACTIONS => { - "(" => 16, - "!" => 20, - 'name' => 19, - 'literal' => 18, - "-" => 12, - "{" => 10, - "NOT" => 11 - }, - DEFAULT => -72, - GOTOS => { - 'gtpair' => 39, - 'p11' => 14, - 'p10' => 13, - 'nonbrace' => 9, - 'pair' => 40, - 'hash' => 116, - 'exp' => 38, - 'varref' => 15 - } - }, - {#State 81 - ACTIONS => { - "%" => 58, - "&" => 59, - "&&" => 62, - ">=" => 60, - ".." => 61, - "OR" => 63, - "!=" => 64, - "AND" => 65, - "<" => 48, - "+" => 49, - "]" => 117, - "/" => 47, - "XOR" => 51, - ">" => 52, - "-" => 50, - "||" => 53, - "==" => 54, - "*" => 55, - "<=" => 57 - } - }, - {#State 82 - ACTIONS => { - "(" => 118 - }, - DEFAULT => -80 - }, - {#State 83 - DEFAULT => -84, - GOTOS => { - 'varpath' => 119 - } - }, - {#State 84 - DEFAULT => -49 - }, - {#State 85 - ACTIONS => { - "==" => undef, - "*" => 55, - "<=" => undef, - "+" => 49, - "<" => undef, - "/" => 47, - "-" => 50, - ">" => undef, - "!=" => undef, - "%" => 58, - "&" => 59, - ">=" => undef - }, - DEFAULT => -41 - }, - {#State 86 - ACTIONS => { - "%" => 58, - "&" => 59, - "*" => 55, - "/" => 47 - }, - DEFAULT => -45 - }, - {#State 87 - ACTIONS => { - "/" => 47, - "*" => 55, - "&" => 59, - "%" => 58 + "%" => 43, + "*" => 47, + "&" => 52, + "/" => 53 }, DEFAULT => -46 }, - {#State 88 + {#State 78 ACTIONS => { - "==" => 54, - "*" => 55, - "<=" => 57, - "+" => 49, - "<" => 48, - "/" => 47, - ">" => 52, - "-" => 50, - "!=" => 64, - "AND" => 65, - "%" => 58, - "&" => 59, - ">=" => 60, - "&&" => 62 + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "XOR" => 54, + "<=" => 55, + ">" => 56 }, - DEFAULT => -36 + DEFAULT => -33 }, - {#State 89 + {#State 79 ACTIONS => { - "<=" => undef, - "*" => 55, - "==" => undef, - "-" => 50, - ">" => undef, - "/" => 47, - "+" => 49, + "-" => 38, "<" => undef, - "!=" => undef, - ">=" => undef, - "&" => 59, - "%" => 58 - }, - DEFAULT => -42 - }, - {#State 90 - ACTIONS => { - "&" => 59, - "%" => 58, - "&&" => 62, - ">=" => 60, - "!=" => 64, - "AND" => 65, - ">" => 52, - "-" => 50, - "/" => 47, - "+" => 49, - "<" => 48, - "==" => 54, - "<=" => 57, - "*" => 55 - }, - DEFAULT => -34 - }, - {#State 91 - ACTIONS => { - "*" => 55, - "<=" => undef, + "+" => 42, + "%" => 43, "==" => undef, - "/" => 47, - "+" => 49, - "<" => undef, - ">" => undef, - "-" => 50, - "!=" => undef, ">=" => undef, - "%" => 58, - "&" => 59 + "*" => 47, + "!=" => undef, + "&" => 52, + "/" => 53, + "<=" => undef, + ">" => undef + }, + DEFAULT => -41 + }, + {#State 80 + ACTIONS => { + "-" => 38, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "&" => 52, + "/" => 53, + "<=" => 55, + ">" => 56 + }, + DEFAULT => -35 + }, + {#State 81 + ACTIONS => { + "%" => 43, + "*" => 47, + "&" => 52, + "/" => 53 + }, + DEFAULT => -45 + }, + {#State 82 + DEFAULT => -50 + }, + {#State 83 + ACTIONS => { + "-" => 38, + "<" => undef, + "+" => 42, + "%" => 43, + "==" => undef, + ">=" => undef, + "*" => 47, + "!=" => undef, + "&" => 52, + "/" => 53, + "<=" => undef, + ">" => undef }, DEFAULT => -39 }, - {#State 92 + {#State 84 + ACTIONS => { + "-" => 38, + "<" => undef, + "+" => 42, + "%" => 43, + "==" => undef, + ">=" => undef, + "*" => 47, + "!=" => undef, + "&" => 52, + "/" => 53, + "<=" => undef, + ">" => undef + }, + DEFAULT => -44 + }, + {#State 85 DEFAULT => -48 }, + {#State 86 + ACTIONS => { + "-" => 38, + "<" => undef, + "+" => 42, + "%" => 43, + "==" => undef, + ">=" => undef, + "*" => 47, + "!=" => undef, + "&" => 52, + "/" => 53, + "<=" => undef, + ">" => undef + }, + DEFAULT => -40 + }, + {#State 87 + ACTIONS => { + "-" => 38, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "&" => 52, + "/" => 53, + "<=" => 55, + ">" => 56 + }, + DEFAULT => -38 + }, + {#State 88 + ACTIONS => { + "-" => 38, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "&" => 52, + "/" => 53, + "<=" => 55, + ">" => 56 + }, + DEFAULT => -37 + }, + {#State 89 + ACTIONS => { + "-" => 38, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "&" => 52, + "/" => 53, + "<=" => 55, + ">" => 56 + }, + DEFAULT => -34 + }, + {#State 90 + ACTIONS => { + "%" => 43, + "*" => 47, + "/" => 53 + }, + DEFAULT => -47 + }, + {#State 91 + DEFAULT => -49 + }, + {#State 92 + ACTIONS => { + "-" => 38, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "&" => 52, + "/" => 53, + "<=" => 55, + ">" => 56 + }, + DEFAULT => -36 + }, {#State 93 ACTIONS => { - "&" => 59, - "%" => 58, - ">=" => undef, - "!=" => undef, - ">" => undef, - "-" => 50, - "/" => 47, - "+" => 49, + "-" => 38, "<" => undef, + "+" => 42, + "%" => 43, "==" => undef, + ">=" => undef, + "*" => 47, + "!=" => undef, + "&" => 52, + "/" => 53, "<=" => undef, - "*" => 55 + ">" => undef }, DEFAULT => -43 }, {#State 94 - DEFAULT => -50 + ACTIONS => { + "-" => 38, + "<" => undef, + "+" => 42, + "%" => 43, + "==" => undef, + ">=" => undef, + "*" => 47, + "!=" => undef, + "&" => 52, + "/" => 53, + "<=" => undef, + ">" => undef + }, + DEFAULT => -42 }, {#State 95 - ACTIONS => { - "*" => 55, - "/" => 47, - "%" => 58 - }, - DEFAULT => -47 + DEFAULT => -61 }, {#State 96 ACTIONS => { - "<=" => undef, - "*" => 55, - "==" => undef, - ">" => undef, - "-" => 50, - "/" => 47, - "<" => undef, - "+" => 49, - "!=" => undef, - ">=" => undef, - "&" => 59, - "%" => 58 - }, - DEFAULT => -44 + ")" => 114 + } }, {#State 97 ACTIONS => { - "<=" => 57, - "*" => 55, - "==" => 54, - "||" => 53, - "XOR" => 51, - "-" => 50, - ">" => 52, - "+" => 49, - "<" => 48, - "/" => 47, - "AND" => 65, - "!=" => 64, - "OR" => 63, - "&&" => 62, - ">=" => 60, - "&" => 59, - "%" => 58 - }, - DEFAULT => -33 - }, - {#State 98 - ACTIONS => { - "==" => 54, - "*" => 55, - "<=" => 57, - "+" => 49, - "<" => 48, - "/" => 47, - ">" => 52, - "-" => 50, - "!=" => 64, - "%" => 58, - "&" => 59, - ">=" => 60 - }, - DEFAULT => -37 - }, - {#State 99 - ACTIONS => { - "AND" => 65, - "!=" => 64, - "&&" => 62, - ">=" => 60, - "%" => 58, - "&" => 59, - "*" => 55, - "<=" => 57, - "==" => 54, - "<" => 48, - "+" => 49, - "/" => 47, - "-" => 50, - ">" => 52 - }, - DEFAULT => -35 - }, - {#State 100 - ACTIONS => { - "!=" => undef, - ">=" => undef, - "&" => 59, - "%" => 58, - "<=" => undef, - "*" => 55, - "==" => undef, - ">" => undef, - "-" => 50, - "/" => 47, - "<" => undef, - "+" => 49 - }, - DEFAULT => -40 - }, - {#State 101 - ACTIONS => { - "*" => 55, - "<=" => 57, - "==" => 54, - "<" => 48, - "+" => 49, - "/" => 47, - ">" => 52, - "-" => 50, - "!=" => 64, - ">=" => 60, - "%" => 58, - "&" => 59 - }, - DEFAULT => -38 - }, - {#State 102 - ACTIONS => { - "," => 120 - }, - DEFAULT => -73 - }, - {#State 103 - ACTIONS => { - ")" => 121 - } - }, - {#State 104 - ACTIONS => { - ")" => 122 - } - }, - {#State 105 - DEFAULT => -61 - }, - {#State 106 - ACTIONS => { - "==" => 54, - "*" => 55, - "<=" => 57, - "/" => 47, - "<" => 48, - "+" => 49, - "=>" => 78, - "XOR" => 51, - "-" => 50, - ">" => 52, - "||" => 53, - "," => 123, - "!=" => 64, - "AND" => 65, - "%" => 58, - "&" => 59, - ">=" => 60, - ".." => 61, - "&&" => 62, - "OR" => 63 + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "," => 115, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "XOR" => 54, + "=>" => 102, + "<=" => 55, + ">" => 56 }, DEFAULT => -65 }, + {#State 98 + ACTIONS => { + "," => 116 + }, + DEFAULT => -73 + }, + {#State 99 + ACTIONS => { + ")" => 117 + } + }, + {#State 100 + ACTIONS => { + "-" => 9, + "{" => 13, + 'name' => 12, + 'literal' => 15, + "!" => 18, + "(" => 17, + "NOT" => 20 + }, + DEFAULT => -72, + GOTOS => { + 'exp' => 60, + 'nonbrace' => 11, + 'gtpair' => 61, + 'varref' => 14, + 'hash' => 118, + 'p11' => 16, + 'pair' => 59, + 'p10' => 19 + } + }, + {#State 101 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 119, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } + }, + {#State 102 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'exp' => 120, + 'varref' => 14, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } + }, + {#State 103 + DEFAULT => -58 + }, + {#State 104 + ACTIONS => { + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "]" => 121, + "!=" => 48, + "AND" => 49, + "&&" => 50, + "||" => 51, + "&" => 52, + "/" => 53, + "XOR" => 54, + "<=" => 55, + ">" => 56 + } + }, + {#State 105 + ACTIONS => { + "(" => 122 + }, + DEFAULT => -80 + }, + {#State 106 + DEFAULT => -84, + GOTOS => { + 'varpath' => 123 + } + }, {#State 107 + ACTIONS => { + 'literal' => 3, + "{{" => 5, + 'error' => 4, + "" => 140, - ">" => 52, - "-" => 50, - "*" => 55, - "<=" => 57, - "==" => 54 + ")" => 140 } }, {#State 127 ACTIONS => { - "SET" => 35, - "(" => 16, - "FUNCTION" => 27, - "FOREACH" => 26, - 'literal' => 18, - 'name' => 19, - "MACRO" => 33, - "!" => 20, - "FOR" => 23, - "{" => 10, - "NOT" => 11, - "BLOCK" => 31, - "-" => 12, - "END" => 141, - "IF" => 30 + 'literal' => 3, + "{{" => 5, + 'error' => 4, + "" => 142, + "XOR" => 54, + "<=" => 55, + ">" => 56 } }, {#State 130 ACTIONS => { - "<=" => 57, - "*" => 55, - "==" => 54, - "||" => 53, - ">" => 52, - "-" => 50, - "XOR" => 51, - "/" => 47, - "+" => 49, - "<" => 48, - "AND" => 65, - "!=" => 64, - "OR" => 63, - ">=" => 60, - ".." => 61, - "&&" => 62, - "&" => 59, - "%" => 58 + 'literal' => 3, + "{{" => 5, + 'error' => 4, + "" => 158, - "IF" => 157 - } + DEFAULT => -31 }, {#State 151 DEFAULT => -13 @@ -1818,73 +1808,98 @@ sub new }, {#State 153 ACTIONS => { - 'literal' => 8, - "" => 158 } }, {#State 154 - DEFAULT => -20 + ACTIONS => { + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 + }, + GOTOS => { + 'varref' => 14, + 'exp' => 159, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 + } }, {#State 155 ACTIONS => { - "(" => 16, - "SET" => 35, - "FUNCTION" => 27, - "FOREACH" => 26, - 'name' => 19, - 'literal' => 18, - "MACRO" => 33, - "!" => 20, - "FOR" => 23, - "{" => 10, - "BLOCK" => 31, - "NOT" => 11, - "-" => 12, + "SET" => 30, "END" => 160, - "IF" => 30 + "-" => 9, + "MACRO" => 21, + "{" => 13, + 'name' => 12, + "BLOCK" => 22, + 'literal' => 15, + "IF" => 32, + "(" => 17, + "!" => 18, + "FOR" => 33, + "NOT" => 20, + "FOREACH" => 27, + "FUNCTION" => 36 }, GOTOS => { - 'c_if' => 36, - 'varref' => 15, - 'c_fn' => 25, - 'exp' => 34, + 'exp' => 29, + 'nonbrace' => 11, + 'for' => 31, + 'code_chunk' => 23, + 'varref' => 14, + 'p11' => 16, 'c_set' => 24, - 'p10' => 13, - 'p11' => 14, - 'code_chunk' => 32, - 'c_for' => 22, - 'nonbrace' => 9, - 'fn' => 21, - 'fn_def' => 29, - 'for' => 28 + 'p10' => 19, + 'c_if' => 25, + 'fn_def' => 26, + 'c_for' => 34, + 'c_fn' => 35, + 'fn' => 28 } }, {#State 156 ACTIONS => { - "<=" => 57, - "*" => 55, - "==" => 54, - "||" => 53, - "XOR" => 51, - "-->" => 161, - ">" => 52, - "-" => 50, - "/" => 47, - "+" => 49, - "<" => 48, - "AND" => 65, - "!=" => 64, - "OR" => 63, - ".." => 61, - "&&" => 62, - ">=" => 60, - "&" => 59, - "%" => 58 + "-" => 9, + "MACRO" => 21, + "BLOCK" => 22, + "ELSIF" => 150, + 'literal' => 15, + "!" => 18, + "ELSE" => 162, + "FOREACH" => 27, + "END" => 161, + "SET" => 30, + "{" => 13, + 'name' => 12, + "ELSEIF" => 152, + "IF" => 32, + "(" => 17, + "FOR" => 33, + "NOT" => 20, + "FUNCTION" => 36 + }, + GOTOS => { + 'exp' => 29, + 'nonbrace' => 11, + 'for' => 31, + 'code_chunk' => 23, + 'varref' => 14, + 'p11' => 16, + 'c_set' => 24, + 'p10' => 19, + 'c_if' => 25, + 'fn_def' => 26, + 'c_for' => 34, + 'elseif' => 163, + 'c_fn' => 35, + 'fn' => 28 } }, {#State 157 @@ -1893,203 +1908,188 @@ sub new {#State 158 DEFAULT => -2, GOTOS => { - 'chunks' => 162 + 'chunks' => 164 } }, {#State 159 ACTIONS => { - "MACRO" => 33, - 'literal' => 18, - "ELSIF" => 149, - "(" => 16, - "SET" => 35, - "IF" => 30, - "BLOCK" => 31, - "!" => 20, - "ELSEIF" => 152, - 'name' => 19, - "FOREACH" => 26, - "FUNCTION" => 27, - "END" => 164, - "ELSE" => 165, - "-" => 12, - "{" => 10, - "NOT" => 11, - "FOR" => 23 - }, - GOTOS => { - 'c_if' => 36, - 'varref' => 15, - 'c_fn' => 25, - 'exp' => 34, - 'elseif' => 163, - 'c_set' => 24, - 'code_chunk' => 32, - 'nonbrace' => 9, - 'c_for' => 22, - 'p10' => 13, - 'p11' => 14, - 'for' => 28, - 'fn_def' => 29, - 'fn' => 21 + ".." => 39, + "-" => 38, + "OR" => 41, + "<" => 40, + "+" => 42, + "%" => 43, + "==" => 44, + ">=" => 45, + "*" => 47, + "!=" => 48, + "AND" => 49, + "||" => 51, + "&&" => 50, + "&" => 52, + "-->" => 165, + "/" => 53, + "XOR" => 54, + "<=" => 55, + ">" => 56 } }, {#State 160 DEFAULT => -24 }, {#State 161 - DEFAULT => -17 + DEFAULT => -15 }, {#State 162 ACTIONS => { - 'literal' => 8, - 'error' => 7, - "" => 166 } }, {#State 163 ACTIONS => { - "-" => 12, - "NOT" => 11, - "{" => 10, - "(" => 16, - "!" => 20, - 'literal' => 18, - 'name' => 19 + 'literal' => 15, + "-" => 9, + "(" => 17, + "!" => 18, + "NOT" => 20, + "{" => 13, + 'name' => 12 }, GOTOS => { - 'p10' => 13, - 'p11' => 14, - 'varref' => 15, - 'nonbrace' => 9, - 'exp' => 167 + 'varref' => 14, + 'exp' => 167, + 'p11' => 16, + 'nonbrace' => 11, + 'p10' => 19 } }, {#State 164 - DEFAULT => -15 - }, - {#State 165 ACTIONS => { - "IF" => 157, - "-->" => 168 - } - }, - {#State 166 - ACTIONS => { - "FOREACH" => 26, - "FUNCTION" => 27, - "SET" => 35, - "(" => 16, - "!" => 20, - "MACRO" => 33, - 'literal' => 18, - 'name' => 19, - "-" => 12, - "BLOCK" => 31, - "NOT" => 11, - "{" => 10, - "FOR" => 23, - "IF" => 30, - "END" => 169 + 'literal' => 3, + 'error' => 4, + "{{" => 5, + "" => 170, - "XOR" => 51, - ">" => 52, - "-" => 50, - "||" => 53, - "==" => 54, - "*" => 55, - "<=" => 57 + "/" => 53, + "XOR" => 54, + "<=" => 55, + ">" => 56 } }, {#State 168 - DEFAULT => -2, + ACTIONS => { + "SET" => 30, + "END" => 171, + "-" => 9, + "MACRO" => 21, + "{" => 13, + 'name' => 12, + "BLOCK" => 22, + 'literal' => 15, + "IF" => 32, + "(" => 17, + "!" => 18, + "FOR" => 33, + "NOT" => 20, + "FOREACH" => 27, + "FUNCTION" => 36 + }, GOTOS => { - 'chunks' => 171 + 'exp' => 29, + 'nonbrace' => 11, + 'for' => 31, + 'code_chunk' => 23, + 'varref' => 14, + 'p11' => 16, + 'c_set' => 24, + 'p10' => 19, + 'c_if' => 25, + 'fn_def' => 26, + 'c_for' => 34, + 'c_fn' => 35, + 'fn' => 28 } }, {#State 169 - DEFAULT => -14 + ACTIONS => { + 'literal' => 3, + 'error' => 4, + "{{" => 5, + "' chunks '