def p_direct_declarator(p): '''direct_declarator : IDENTIFIER | '(' declarator ')' | direct_declarator '[' constant_expression ']' | direct_declarator '[' ']' | direct_declarator '(' parameter_type_list ')' | direct_declarator '(' identifier_list ')' | direct_declarator '(' ')' ''' 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[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_identifier_list(p): '''identifier_list : IDENTIFIER | identifier_list ',' 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_struct_declarator(p): '''struct_declarator : declarator | ':' constant_expression | declarator ':' constant_expression ''' if p[1] == ':': p[0] = cdeclarations.Declarator() else: p[0] = p[1] # Bitfield support if len(p) == 4: p[0].bitfield = p[3]
def p_abstract_declarator(p): '''abstract_declarator : pointer | direct_abstract_declarator | pointer direct_abstract_declarator ''' if len(p) == 2: p[0] = p[1] if type(p[0]) == cdeclarations.Pointer: 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() else: p[0] = p[1] ptr = p[0] while ptr.pointer: ptr = ptr.pointer ptr.pointer = p[2]