diff --git a/PBot/VERSION.pm b/PBot/VERSION.pm index 97dd2f4a..62c26d9e 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 => 475, - BUILD_DATE => "2013-11-27", + BUILD_REVISION => 476, + BUILD_DATE => "2013-12-01", }; 1; diff --git a/modules/paren/paren.py b/modules/paren/paren.py index 9c4aeaf3..6ec0a860 100755 --- a/modules/paren/paren.py +++ b/modules/paren/paren.py @@ -12,10 +12,9 @@ with open("paren/stddef") as f: class CParser(c_parser.CParser): def __init__(self, *a, **kw): super(CParser, self).__init__(*a, **kw) - self.p_expression_hack = self._expression_hack self.cparser = yacc.yacc( module=self, - start='expression_hack', + start='expression', debug=kw.get('yacc_debug', False), errorlog=yacc.NullLogger(), optimize=kw.get('yacc_optimize', True), @@ -33,12 +32,6 @@ class CParser(c_parser.CParser): input=text, lexer=self.clex, debug=debuglevel) - - def _expression_hack(self, p): - """ expression_hack : translation_unit expression - | expression - """ - p[0] = c_ast.ExprList([p[2] if len(p) == 3 else p[1]]) class CGenerator(c_generator.CGenerator): @@ -49,25 +42,35 @@ class CGenerator(c_generator.CGenerator): return 'sizeof (%s)' % self.visit(n.expr) else: return 'sizeof %s' % self._parenthesize_unless_simple(n.expr) - return super(CGenerator, self).visit_UnaryOp(n) + else: + operand = self.visit(n.expr) + if isinstance(n.expr, c_ast.ArrayRef) or not self._is_simple_node(n.expr): + operand = '(%s)' % operand + if n.op in ('p++', 'p--'): + return operand + n.op[1:] + else: + return n.op + operand def visit_Assignment(self, n): return '%s %s %s' % (self.visit(n.lvalue), n.op, self._parenthesize_unless_simple(n.rvalue)) -def translate_to_c(input): + +def parenthesize(source): parser = CParser(yacc_optimize=False) try: - ast = parser.parse(input, '') + ast = parser.parse(source, '') except plyparser.ParseError as e: - print(sys.argv[1] + ': ' + "Error: {0}".format(e.args[0])) + print("{0}: Error: {1}".format(sys.argv[1], e.args[0])) return generator = CGenerator() - print(sys.argv[1] + ': ' + generator.visit(ast)) + print("{0}: {1}".format(sys.argv[1], generator.visit(ast))) if __name__ == "__main__": if len(sys.argv) > 2: - translate_to_c(' '.join(sys.argv[2:])) + parenthesize(' '.join(sys.argv[2:])) + elif len(sys.argv) == 2: + print(sys.argv[1] + ': ' + "Usage: paren ") else: - print(sys.argv[1] + ': ' + "Usage: paren ") + print('error')