summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Bendersky <eliben@users.noreply.github.com>2014-09-20 06:27:38 -0700
committerEli Bendersky <eliben@users.noreply.github.com>2014-09-20 06:27:38 -0700
commit2c5114f6fc4004408cfef17ace30f5ecdb362aec (patch)
tree33d749ac027d6c9363fc64cdf5bc87073d2a3348
parent0fce7cd1bedc02118e33097d914d9029b4def29e (diff)
parent52f255685640f0f5a3c7a15a4ca44d8608c3a646 (diff)
downloadpycparser-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.py33
-rw-r--r--tests/test_c_generator.py7
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()