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])"
+ }
|