def p_primary_expression_11(p): '''primary_expression : postfix_expression DEC_OP''' p[0] = {} res, tmp1 = cg.load(p[1]['id'], "post_decrement") res2 = cg.binary_operation(p[1], {'code': '', 'const': '', 'val': '1', 'type': m._type_int}, '-') res3 = cg.assign(res2, p[1]['id'], "post_increment") p[0]['code'] = tmp1 + res2['code'] + res3 p[0]['id'] = res
def p_unary_expression_4(p): '''unary_expression : unary_operator unary_expression''' p[0] = {} if p[1] == '&': p[0]['id'] = p[2]['id'] p[0]['code'] = '' elif p[1] == '*': p[0]['id'], l = cg.load(p[2]['id'], "unary_expression") p[0]['code'] = p[2]['code'] + l #TODO complete global last_var_seen if 'id' in p[1]: if not arguments: last_var_seen = p[1]['id']
def p_jump_statement_2(p): '''jump_statement : RETURN expression ';' ''' # print m.symbols p[0] = {} if 'const' in p[2] : l = "ret {0} {1}".format(p[2]['type'], p[2]['val']) p[0]['code'] = cg.indent(l) elif not m.symbols.is_pointer(p[2]['id']) : l = "ret {0} {1}".format(m.symbols.type(p[2]['id']), m.symbols.var(p[2]['id'])) p[0]['code'] = p[2]['code'] + cg.indent(l) else : p[0]['id'], l1 = cg.load(p[2]['id'], "jump_statement") l2 = "ret {0} {1}".format(m.symbols.dereference(p[2]['id']), m.symbols.var(p[0]['id'])) p[0]['code'] = p[2]['code'] + l1 + cg.indent(l2) m.new_label()
def p_postfix_expression_2(p): '''postfix_expression : postfix_expression '[' expression ']' ''' p[0] = {} if 'const' in p[3]: index = p[3]['val'] l1 = '' else: tmp_var, tmp = cg.load(p[3]['id'], "postfix_expression") var_id = m.new_reg() m.symbols.add(var_id, 'i64') l1 = "{0} = sext {1} {2} to {3}".format(m.symbols.var(var_id), m.symbols.type(tmp_var), m.symbols.var(tmp_var), m.symbols.primary_type(var_id)) l1 = tmp + cg.indent(l1) index = m.symbols.var(var_id) p[0]['id'], l2 = cg.getelementptr(p[1]['id'], index) p[0]['code'] = p[1]['code'] + l1 + l2
def p_argument_expression_list_2(p): '''argument_expression_list : argument_expression_list ',' expression''' p[0] = {} if 'const' in p[3]: var = p[3]['const'] l = '' elif m.symbols.is_constant(p[3]['id']) : var = "{0}* getelementptr inbounds ({1} {2}, i32 0, i32 0)".format(m.symbols.primary_type(p[3]['id']), m.symbols.type(p[3]['id']), m.symbols.var(p[3]['id'])) l = '' elif m.symbols.is_array(p[3]['id']) : new, l = cg.getelementptr(p[3]['id'], 0, 'argument_expression_list') var = "{0} {1}".format(m.symbols.type(new), m.symbols.var(new)) elif not m.symbols.is_pointer(p[3]['id']) : var = "{0} {1}".format(m.symbols.type(p[3]['id']), m.symbols.var(p[3]['id'])) l = '' else: var, l = cg.load(p[3]['id'], "argument_expression_list") var = "{0} {1}".format(m.symbols.type(var), m.symbols.var(var)) p[0]['alloc'] = p[3]['code'] + p[1]['alloc'] + l p[0]['code'] = "{0}, {1}".format(p[1]['code'], var)
def p_argument_expression_list_1(p): '''argument_expression_list : barg expression earg''' p[0] = {} p[0] = p[2] if 'const' in p[2]: var = p[2]['const'] l = '' elif m.symbols.is_constant(p[2]['id']) : var = "{0}* getelementptr inbounds ({1} {2}, i32 0, i32 0)".format(m.symbols.primary_type(p[2]['id']), m.symbols.type(p[2]['id']), m.symbols.var(p[2]['id'])) l = '' elif m.symbols.is_array(p[2]['id']) : var, l = cg.getelementptr(p[2]['id'], 0, 'argument_expression_list') p[0]['id'] = var var = "{0} {1}".format(m.symbols.type(p[2]['id']), m.symbols.var(p[2]['id'])) elif not m.symbols.is_pointer(p[2]['id']) : var = "{0} {1}".format(m.symbols.type(p[2]['id']), m.symbols.var(p[2]['id'])) l = '' else: var, l = cg.load(p[2]['id'], "argument_expression_list") p[0]['id'] = var var = "{0} {1}".format(m.symbols.type(var), m.symbols.var(var)) p[0]['alloc'] = p[2]['code'] + l p[0]['code'] = var