def p_direct_declarator(p): """ direct_declarator : IDENTIFIER | LPAREN gcc_attributes declarator RPAREN | direct_declarator LBRACKET constant_expression RBRACKET | direct_declarator LBRACKET RBRACKET | direct_declarator LPAREN parameter_type_list RPAREN | direct_declarator LPAREN identifier_list RPAREN | direct_declarator LPAREN RPAREN """ if isinstance(p[1], cdeclarations.Declarator): p[0] = p[1] if p[2] == "[": a = cdeclarations.Array() a.array = p[0].array p[0].array = a if p[3] != "]": a.size = p[3] else: if p[3] == ")": p[0].parameters = () else: p[0].parameters = p[3] elif p[1] == "(": p[0] = p[3] p[3].attrib.update(p[2]) else: p[0] = cdeclarations.Declarator() p[0].identifier = p[1] # Check parameters for (void) and simplify to empty tuple. if p[0].parameters and len(p[0].parameters) == 1: param = p[0].parameters[0] if param.type.specifiers == ["void"] and not param.declarator: p[0].parameters = ()
def p_abstract_declarator(p): """ abstract_declarator : pointer | direct_abstract_declarator gcc_attributes | pointer direct_abstract_declarator gcc_attributes """ if len(p) == 2: p[0] = p[1] ptr = p[0] while ptr.pointer: ptr = ptr.pointer # Only if doesn't already terminate in a declarator if type(ptr) == cdeclarations.Pointer: ptr.pointer = cdeclarations.Declarator() ptr.pointer.attrib.update(p[1].attrib) else: ptr.attrib.update(p[1].attrib) elif len(p) == 3: p[0] = p[1] p[1].attrib.update(p[2]) else: p[0] = p[1] ptr = p[0] while ptr.pointer: ptr = ptr.pointer ptr.pointer = p[2] p[2].attrib.update(p[1].attrib) p[2].attrib.update(p[3])
def p_identifier_list(p): """ identifier_list : IDENTIFIER | identifier_list COMMA IDENTIFIER """ param = cdeclarations.Parameter() param.declarator = cdeclarations.Declarator() if len(p) > 2: param.declarator.identifier = p[3] p[0] = p[1] + (param,) else: param.declarator.identifier = p[1] p[0] = (param,)
def p_member_declarator(p): """ member_declarator : declarator gcc_attributes | COLON constant_expression gcc_attributes | declarator COLON constant_expression gcc_attributes """ if p[1] == ":": p[0] = cdeclarations.Declarator() p[0].bitfield = p[2] else: p[0] = p[1] # Bitfield support if p[2] == ":": p[0].bitfield = p[3] p[0].attrib.update(p[len(p) - 1])