From 6dec4a159db1687d3e70dccc8c0dd2ee570cb2b5 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sun, 27 Nov 2011 22:03:24 +0000 Subject: Support empty statements, update list of unimplemented types --- pp2cc.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/pp2cc.py b/pp2cc.py index 57c53f3..a73189d 100755 --- a/pp2cc.py +++ b/pp2cc.py @@ -880,20 +880,45 @@ class Parse(object): if not loop_node: raise RuntimeError("continue not in a loop") return [self.asm.branch_op("BRA", loop_node.continue_label)] + def parseEmptyStatement(self, linked_node): + """Returns an empty list for an "empty statement" (duh)""" + return [] def parseStatement(self, node, parent_linked_node, level_increment=False): linked_node = LinkedNode(node, parent_linked_node, level_increment=level_increment) self.asm.level = linked_node.level lines = [] - if isinstance(node, c_ast.FuncDecl): - raise RuntimeError("Not implemented for type " + repr(node)) - elif isinstance(node, c_ast.PtrDecl): + if (isinstance(node, c_ast.FuncDecl) or + isinstance(node, c_ast.ArrayDecl) or + isinstance(node, c_ast.ArrayRef) or + isinstance(node, c_ast.Case) or + isinstance(node, c_ast.CompoundLiteral) or + isinstance(node, c_ast.DeclList) or + isinstance(node, c_ast.Default) or + isinstance(node, c_ast.EllipsisParam) or + isinstance(node, c_ast.Enum) or + isinstance(node, c_ast.Enumerator) or + isinstance(node, c_ast.EnumeratorList) or + isinstance(node, c_ast.FuncDecl) or + isinstance(node, c_ast.Goto) or + isinstance(node, c_ast.IdentifierType) or + isinstance(node, c_ast.Label) or + isinstance(node, c_ast.NamedInitializer) or + isinstance(node, c_ast.ParamList) or + isinstance(node, c_ast.PtrDecl) or + isinstance(node, c_ast.Struct) or + isinstance(node, c_ast.StructRef) or + isinstance(node, c_ast.Switch) or + isinstance(node, c_ast.TypeDecl) or + isinstance(node, c_ast.Typedef) or + isinstance(node, c_ast.Typename) or + isinstance(node, c_ast.Union)): raise RuntimeError("Not implemented for type " + repr(node)) else: for entry in ("Compound", "BinaryOp", "If", "Constant", "ID", "Return", "FuncCall", "UnaryOp", "Cast", "TernaryOp", "DoWhile", "While", "For", "ExprList", "Assignment", "Decl", "FuncDef", "Break", - "Continue"): + "Continue", "EmptyStatement"): if isinstance(node, getattr(c_ast, entry)): lines += getattr(self, "parse" + entry)(linked_node) break -- cgit v1.2.1