From 936d45e04e6e255c18324472bf8715f21ead43ad Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Thu, 14 Nov 2013 15:21:52 +0000 Subject: [PATCH] Improve verbosity of parenthesized precedence in parens module --- PBot/VERSION.pm | 4 ++-- modules/paren/paren.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/PBot/VERSION.pm b/PBot/VERSION.pm index 9413bf91..7fb647d4 100644 --- a/PBot/VERSION.pm +++ b/PBot/VERSION.pm @@ -13,8 +13,8 @@ use warnings; # These are set automatically by the build/commit script use constant { BUILD_NAME => "PBot", - BUILD_REVISION => 466, - BUILD_DATE => "2013-11-13", + BUILD_REVISION => 467, + BUILD_DATE => "2013-11-14", }; 1; diff --git a/modules/paren/paren.py b/modules/paren/paren.py index 97691986..20f48e14 100755 --- a/modules/paren/paren.py +++ b/modules/paren/paren.py @@ -42,6 +42,13 @@ class CParser(c_parser.CParser): class CGenerator(c_generator.CGenerator): + def visit_BinaryOp(self, n): + lval_str = self._parenthesize_if(n.left, + lambda d: not self._is_simple_node(d)) + rval_str = self._parenthesize_if(n.right, + lambda d: not self._is_simple_node(d)) + return '(%s %s %s)' % (lval_str, n.op, rval_str) + def visit_UnaryOp(self, n): # don't parenthesize an operand to sizeof if it's not a type if n.op == 'sizeof': @@ -51,6 +58,12 @@ class CGenerator(c_generator.CGenerator): return 'sizeof %s' % self._parenthesize_unless_simple(n.expr) return super(CGenerator, self).visit_UnaryOp(n) + def _is_simple_node(self, n): + """ Returns True for nodes that are "simple" - i.e. nodes that always + have higher precedence than operators. + """ + return isinstance(n,( c_ast.Constant, c_ast.ID, c_ast.ArrayRef, + c_ast.StructRef, c_ast.FuncCall, c_ast.BinaryOp)) def translate_to_c(input): parser = CParser(yacc_optimize=False)