def __parse_unary_expression__(self, symbol_node: jcmuta.SymbolNode, code: int): """ :param symbol_node: negative, bit_not, logic_not, address_of, dereference :param code: :return: """ operator = symbol_node.get_content().get_token_value() operand = symbol_node.get_child(1) if operator == "negative": u_operand = self.__parse__(operand, code) return -self.__cast_to_numb__(u_operand) elif operator == "bit_not": u_operand = self.__parse__(operand, self.__s_code__) return ~self.__cast_to_bits__(u_operand) elif operator == "logic_not": u_operand = self.__parse__(operand, code) return z3.Not(self.__cast_to_bool__(u_operand)) elif operator == "address_of": return z3.Const(self.__unique_name__(symbol_node), z3.IntSort()) else: name = self.__unique_name__(symbol_node) name = self.__normal_name__(name, symbol_node.get_data_type()) return self.__new_reference__(name, symbol_node.get_data_type(), code)
def __parse_list_expression__(self, symbol_node: jcmuta.SymbolNode, code: int): elements = list() for child in symbol_node.get_children(): elements.append(self.__parse__(child, code)) name = self.__unique_name__(symbol_node) return self.__new_reference__(name, symbol_node.get_data_type(), code)
def __parse_identifier__(self, symbol_node: jcmuta.SymbolNode, code: int): """ :param symbol_node: :param code: :return: """ name = symbol_node.get_content().get_token_value() data_type = symbol_node.get_data_type() name = self.__normal_name__(name, data_type) return self.__new_reference__(name, data_type, code)
def __parse_call_expression__(self, symbol_node: jcmuta.SymbolNode): function = symbol_node.get_child(0) if function.get_class_name() == "Identifier": func_name = function.get_content().get_token_value() else: func_name = self.__new_default_name__(function) arguments = symbol_node.get_child(1).get_children() for k in range(0, len(arguments)): arg = self.__parse__(arguments[k]) self.__save__("{}#{}".format(func_name, k), arg) return self.__parse_by_name__( "{}_{}".format(func_name, symbol_node.get_class_id()), symbol_node.get_data_type())
def __parse_call_expression__(self, symbol_node: jcmuta.SymbolNode, code: int): """ :param symbol_node: :param code: :return: """ function = symbol_node.get_child(0) if function.get_class_name() == "Identifier": func_name = function.get_content().get_token_value() else: func_name = self.__unique_name__(function) arguments = symbol_node.get_child(1).get_children() for k in range(0, len(arguments)): arg = self.__parse__(arguments[k], 0) self.__save_state__("{}#{}".format(func_name, k), arg) return self.__new_reference__(func_name, symbol_node.get_data_type(), code)
def __parse_unary_expression__(self, symbol_node: jcmuta.SymbolNode): """ :param symbol_node: :return: neg, rsv, not, adr, der """ operator = symbol_node.get_content().get_token_value() u_operand = self.__parse__(symbol_node.get_child(1)) if operator == "negative": return -u_operand elif operator == "bit_not": if isinstance(u_operand, z3.IntNumRef) or isinstance( u_operand, z3.ArithRef): return -u_operand - 1 else: return ~u_operand elif operator == "logic_not": return z3.Not(self.__cast_to_bool__(u_operand)) elif operator == "address_of": return z3.Const(self.__new_default_name__(symbol_node), z3.IntSort()) else: return self.__parse_by_name__( self.__new_default_name__(symbol_node), symbol_node.get_data_type())
def __parse_field_expression__(self, symbol_node: jcmuta.SymbolNode, code: int): name = self.__unique_name__(symbol_node) name = self.__normal_name__(name, symbol_node.get_data_type()) return self.__new_reference__(name, symbol_node.get_data_type(), code)
def __parse_list_expression__(self, symbol_node: jcmuta.SymbolNode): elements = list() for child in symbol_node.get_children(): elements.append(self.__parse__(child)) return self.__parse_by_name__(self.__new_default_name__(symbol_node), symbol_node.get_data_type())
def __parse_field_expression__(self, symbol_node: jcmuta.SymbolNode): return self.__parse_by_name__(self.__new_default_name__(symbol_node), symbol_node.get_data_type())
def __parse_identifier__(self, symbol_node: jcmuta.SymbolNode): return self.__parse_by_name__( symbol_node.get_content().get_token_value(), symbol_node.get_data_type())