コード例 #1
0
def p_idp(p): 
    '''idp : '[' sexp ']' 
            | '(' idpp ')'
            | empty''' 
    global pilao
    global funcParams 
    elmt= p[1]
    if elmt == '[':
        aux=pilao.pop()
        if(aux[1] != 'int'): #validar si la superexp es id para marcar error
            print errors['TYPE_MISMATCH']
            exit(-1)
        res1=validate_arr(p[-1]) #por ser sexp se hace pop
        quadruplo.append(['ver', aux[0],0,int(res1[2])-1])
        res =mem_temps.add_type('int',1)
        quadruplo.append(['+', aux[0],res1[0],res])
        pilao.append([[res], res1[1]]) # el quadruplo cuando es arreglo lo ponemos diferente para identificar que hay que checar onruntime
    elif elmt == '(':
        if func_is_repeated(p[-1]):
            tempparams=[]
            for x in range(0,funcParams):
                tempparams.append(pilao.pop())
            if validate_func_params(p[-1],deepcopy(tempparams)):
                quadruplo.append(['era', get_func_vars(p[-1]),p[-1],'-1'])
                for x in tempparams:
                    quadruplo.append(['param',x[0],'-1', funcParams ])
                    funcParams= funcParams-1
                quadruplo.append(['gosub', get_func_quad(p[-1]),p[-1],'-1'])
                if get_func_return_type(p[-1]) != 'void':
                    res =mem_temps.add_type(get_func_return_type(p[-1]),1)
                    quadruplo.append(['=', p[-1],'-1',res])
                    pilao.append([res, get_func_return_type(p[-1]) ])
                pp.pprint(pilao)
                pp.pprint(constant_dict)
            else:
                print errors['PARAMS_FUNC_BADQUANT']
                exit(-1)

        else: 
            print errors['NOT_DECLARED_FUNCTION']
            exit(-1)
    else:
        res=get_var(p[-1])
        pilao.append([res[0], res[1]])
コード例 #2
0
def p_asignp(p): 
    '''asignp : '=' sexp ';'
              | '[' sexp ']' '=' sexp ';' '''
    if p[1] == '[':
        aux1=pilao.pop() # por la forma de la sintaxis este es el valor a igualar
        aux=pilao.pop()
        if(aux[1] != 'int'): #validar si la superexp es id para marcar error
            print errors['TYPE_MISMATCH']
            exit(-1)
        res1=validate_arr(p[-1]) #por ser sexp se hace pop
        quadruplo.append(['ver', aux[0],0,int(res1[2])-1])
        res =mem_temps.add_type('int',1)
        if str(res1[0]) not in constant_dict:
            constant_dict[str(res1[0])] = mem_constants.add_type('int',1)
        quadruplo.append(['+', aux[0],constant_dict[str(res1[0])],res])
        quadruplo.append(['=',  aux1[0], '-1', res])
        pp.pprint(constant_dict)
    else:
        pp.pprint(pilao)
        quadruplo.append(['=',  pilao.pop()[0], '-1', pilao.pop()[0] ])