Example #1
0
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
Example #2
0
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']
Example #3
0
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()
Example #4
0
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
Example #5
0
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)
Example #6
0
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