Category: | Text Processing |
Author/Contact Info | rob_au |
Description: | The following two patches can be used to add bitwise AND and XOR operators for use in Template Toolkit templates using the & and ^ tokens respectively. These patches are to be applied to the parser/Grammar.pm.skel and parser/Parser.yp files in the Template Toolkit source. Following the application of these patches, the parser/yc script will need to be run to merge these changes into the installation files - When doing this, expect an inconsequential shift/reduce conflict and reduce/reduce conflict. Bitwise OR and NOT operations have not also been incorporated as the corresponding tokens, | and ! respectively, have already been assigned roles within the Template Toolkit grammar. Alternatively a complete patch for Template Toolkit can be found here for application on the version 2.08 Template Toolkit source. |
diff -Naur Template-Toolkit-2.08/parser/Grammar.pm.skel Template-Toolk +it-2.08-bitop/parser/Grammar.pm.skel --- Template-Toolkit-2.08/parser/Grammar.pm.skel Fri Jun 7 19: +29:08 2002 +++ Template-Toolkit-2.08-bitop/parser/Grammar.pm.skel Wed Nov 27 21: +36:36 2002 @@ -106,10 +106,11 @@ my @cmpop = keys %CMPOP; # my @binop = qw( + - * % ); # '/' above, in @tokens my @binop = qw( - * % ); # '+' and '/' above, in @t +okens + my @bitop = qw( & ^ ); # fill lexer table, slice by slice, with reserved words and opera +tors - @$LEXTABLE{ @RESERVED, @cmpop, @binop, @tokens } - = ( @RESERVED, ('CMPOP') x @cmpop, ('BINOP') x @binop, @tokens + ); + @$LEXTABLE{ @RESERVED, @cmpop, @binop, @bitop, @tokens } + = ( @RESERVED, ('CMPOP') x @cmpop, ('BINOP') x @binop, ('BITOP +') x @bitop, @tokens ); }
diff -Naur Template-Toolkit-2.08/parser/Parser.yp Template-Toolkit-2.0 +8-bitop/parser/Parser.yp --- Template-Toolkit-2.08/parser/Parser.yp Fri Jul 19 23:22:57 20 +02 +++ Template-Toolkit-2.08-bitop/parser/Parser.yp Wed Nov 27 21: +34:19 2002 @@ -50,6 +50,7 @@ %left DOT %left CMPOP %left BINOP +%left BITOP %left '+' %left '/' %left DIV @@ -358,6 +359,7 @@ ; expr: expr BINOP expr { "$_[1] $_[2] $_[3]" + } + | expr BITOP expr { "$_[1] $_[2] $_[3]" + } | expr '/' expr { "$_[1] $_[2] $_[3]" + } | expr '+' expr { "$_[1] $_[2] $_[3]" + } | expr DIV expr { "int($_[1] / $_[3])" + } |
Back to
Code Catacombs