diff options
author | Eli Bendersky <eliben@users.noreply.github.com> | 2014-09-20 06:27:38 -0700 |
---|---|---|
committer | Eli Bendersky <eliben@users.noreply.github.com> | 2014-09-20 06:27:38 -0700 |
commit | 2c5114f6fc4004408cfef17ace30f5ecdb362aec (patch) | |
tree | 33d749ac027d6c9363fc64cdf5bc87073d2a3348 | |
parent | 0fce7cd1bedc02118e33097d914d9029b4def29e (diff) | |
parent | 52f255685640f0f5a3c7a15a4ca44d8608c3a646 (diff) | |
download | pycparser-2c5114f6fc4004408cfef17ace30f5ecdb362aec.tar.gz |
Merge pull request #57 from akiradeveloper/feature/comma-op-in-ternary
fix: comma operator in ternary operator
-rw-r--r-- | pycparser/c_generator.py | 33 | ||||
-rw-r--r-- | tests/test_c_generator.py | 7 |
2 files changed, 21 insertions, 19 deletions
diff --git a/pycparser/c_generator.py b/pycparser/c_generator.py index 66d42d9..997a97c 100644 --- a/pycparser/c_generator.py +++ b/pycparser/c_generator.py @@ -83,6 +83,14 @@ class CGenerator(object): def visit_IdentifierType(self, n): return ' '.join(n.names) + def _visit_expr(self, n): + if isinstance(n, c_ast.InitList): + return '{' + self.visit(n) + '}' + elif isinstance(n, c_ast.ExprList): + return '(' + self.visit(n) + ')' + else: + return self.visit(n) + def visit_Decl(self, n, no_type=False): # no_type is used when a Decl is part of a DeclList, where the type is # explicitly only for the first delaration in a list. @@ -90,12 +98,7 @@ class CGenerator(object): s = n.name if no_type else self._generate_decl(n) if n.bitsize: s += ' : ' + self.visit(n.bitsize) if n.init: - if isinstance(n.init, c_ast.InitList): - s += ' = {' + self.visit(n.init) + '}' - elif isinstance(n.init, c_ast.ExprList): - s += ' = (' + self.visit(n.init) + ')' - else: - s += ' = ' + self.visit(n.init) + s += ' = ' + self._visit_expr(n.init) return s def visit_DeclList(self, n): @@ -118,21 +121,13 @@ class CGenerator(object): def visit_ExprList(self, n): visited_subexprs = [] for expr in n.exprs: - if isinstance(expr, c_ast.ExprList): - visited_subexprs.append('(' + self.visit(expr) + ')') - else: - visited_subexprs.append(self.visit(expr)) + visited_subexprs.append(self._visit_expr(expr)) return ', '.join(visited_subexprs) def visit_InitList(self, n): visited_subexprs = [] for expr in n.exprs: - if isinstance(expr, c_ast.ExprList): - visited_subexprs.append('(' + self.visit(expr) + ')') - elif isinstance(expr, c_ast.InitList): - visited_subexprs.append('{' + self.visit(expr) + '}') - else: - visited_subexprs.append(self.visit(expr)) + visited_subexprs.append(self._visit_expr(expr)) return ', '.join(visited_subexprs) def visit_Enum(self, n): @@ -195,9 +190,9 @@ class CGenerator(object): return 'continue;' def visit_TernaryOp(self, n): - s = self.visit(n.cond) + ' ? ' - s += self.visit(n.iftrue) + ' : ' - s += self.visit(n.iffalse) + s = self._visit_expr(n.cond) + ' ? ' + s += self._visit_expr(n.iftrue) + ' : ' + s += self._visit_expr(n.iffalse) return s def visit_If(self, n): diff --git a/tests/test_c_generator.py b/tests/test_c_generator.py index b2b3199..a21a0b1 100644 --- a/tests/test_c_generator.py +++ b/tests/test_c_generator.py @@ -201,5 +201,12 @@ class TestCtoC(unittest.TestCase): int main(void) { f((1, 2)); return 0; } ''') + def test_comma_op_in_ternary(self): + self._assert_ctoc_correct(r''' + void f() { + (0, 0) ? (0, 0) : (0, 0); + } + ''') + if __name__ == "__main__": unittest.main() |