Improve verbosity of parenthesized precedence in parens module

This commit is contained in:
Pragmatic Software 2013-11-14 15:21:52 +00:00
parent f618b29282
commit 936d45e04e
2 changed files with 15 additions and 2 deletions

View File

@ -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;

View File

@ -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)