예제 #1
0
def p_expresion_numerica(t):
    '''expresion_numerica   :   primitiva MAS primitiva 
                            |   primitiva MENOS primitiva 
                            |   primitiva POR primitiva
                            |   primitiva DIVIDIDO primitiva
                            |   primitiva RESTO primitiva'''

    op = Operacion()
    if(t.slice[2].type == 'MAS'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.SUMA,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_numerica ->  primitiva MAS primitiva','expresion_numerica.val = primitiva1.val + primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'MENOS'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.RESTA,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_numerica ->  primitiva MENOS primitiva','expresion_numerica.val = primitiva1.val - primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'POR'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.MULTIPLICACION,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_numerica ->  primitiva MULT primitiva','expresion_numerica.val = primitiva1.val * primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'DIVIDIDO'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.DIVISION,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_numerica ->  primitiva DIV primitiva','expresion_numerica.val = primitiva1.val / primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'RESTO'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.MODULO,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_numerica ->  primitiva RESTO primitiva','expresion_numerica.val = primitiva1.val % primitiva2.val;',lista)
        func(0,gramatical)
    t[0] = op
예제 #2
0
def p_expresion_bit_bit(t):
    '''expresion_bit_bit  : primitiva PAND primitiva 
                          | primitiva BOR primitiva
                          | primitiva XORR primitiva 
                          | primitiva SHIFTI primitiva
                          | primitiva SHIFTD primitiva'''
                          
    op = Operacion()
    if(t.slice[2].type == 'PAND'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.PAND,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_bit_bit ->  primitiva PAND primitiva','expresion_bit_bit.val = primitiva1.val & primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'BOR'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.BOR,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_bit_bit ->  primitiva BOR primitiva','expresion_bit_bit.val = primitiva1.val | primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'XORR'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.XORR,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_bit_bit ->  primitiva XORR primitiva','expresion_bit_bit.val = primitiva1.val ^ primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'SHIFTI'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.SHIFTI,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_bit_bit ->  primitiva SHIFTI primitiva','expresion_bit_bit.val = primitiva1.val << primitiva2.val;',lista)
        func(0,gramatical)
    elif(t.slice[2].type == 'SHIFTD'):
        op.Operacion(t[1],t[3],TIPO_OPERACION.SHIFTD,t.slice[2].lineno,1)
        lista = func(1,None).copy()
        gramatical = G.ValorAscendente('expresion_bit_bit ->  primitiva SHIFTD primitiva','expresion_bit_bit.val = primitiva1.val >> primitiva2.val;',lista)
        func(0,gramatical)
    t[0] = op
예제 #3
0
def p_expresion_logica(t):
    '''expresion_logica   : primitiva AND primitiva 
                          | primitiva OR primitiva
                          | primitiva XOR primitiva '''

    op = Operacion()
    if (t.slice[2].type == 'AND'):
        op.Operacion(t[1], t[3], TIPO_OPERACION.AND, t.slice[2].lineno, 1)
        lista = func(1, None).copy()
        gramatical = G.ValorAscendente(
            'expresion_logica ->  primitiva AND primitiva',
            'expresion_logica.val = primitiva1.val && primitiva2.val;', lista)
        func(0, gramatical)
    elif (t.slice[2].type == 'OR'):
        op.Operacion(t[1], t[3], TIPO_OPERACION.OR, t.slice[2].lineno, 1)
        lista = func(1, None).copy()
        gramatical = G.ValorAscendente(
            'expresion_logica ->  primitiva OR primitiva',
            'expresion_logica.val = primitiva1.val || primitiva2.val;', lista)
        func(0, gramatical)
    elif (t.slice[2].type == 'XOR'):
        op.Operacion(t[1], t[3], TIPO_OPERACION.XOR, t.slice[2].lineno, 1)
        lista = func(1, None).copy()
        gramatical = G.ValorAscendente(
            'expresion_logica ->  primitiva XOR primitiva',
            'expresion_logica.val = primitiva1.val xor primitiva2.val;', lista)
        func(0, gramatical)
    t[0] = op
예제 #4
0
def p_tipo_dato(t):
    '''tipo_dato : INT 
                | FLOAT 
                | CHAR '''
    t[0] = t[1]
    gramatical = G.ValorAscendente('tipo_dato -> '+str(t[1]),'tipo_dato.val = '+str(t[1])+';',None)
    func(2,gramatical)
예제 #5
0
def p_acceso(t):
    'acceso : CORIZQ primitiva CORDER'
    t[0] = t[2]
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente('acceso -> CORIZQ primitiva CORDER',
                                   'acceso.val = primitiva.val;', lista)
    func(0, gramatical)
예제 #6
0
def p_etiquetas_lista(t) :
    'etiquetas    : etiquetas etiqueta'
    t[1].append(t[2])
    t[0] = t[1]
    #lista = func(1,None).copy()
    gramatical = G.ValorAscendente('etiquetas -> etiquetas etiqueta','etiquetas.lista = etiquetas1.lista; </hr> etiquetas.lista.add(etiqueta)',None)
    func(2,gramatical)
예제 #7
0
def p_instrucciones_lista(t) :
    'instrucciones    : instrucciones instruccion'
    t[1].append(t[2])
    t[0] = t[1]
    #lista = func(1,None).copy()
    gramatical = G.ValorAscendente('instrucciones -> instrucciones instruccion','instrucciones.lista = instrucciones1.lista; </hr> instrucciones.lista.add(instruccion);',[])
    func(2,gramatical)#func(0,gramatical)
예제 #8
0
def p_read(t):
    'read : tipo_var IGUAL READ PARIZQ PARDER PTCOMA'
    t[0] = Read(t[1], t.slice[2].lineno, 1)
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente('read -> tipo_var IGUAL read() PTCOMA',
                                   'read.instr = Read(tipo_var.val);', lista)
    func(0, gramatical)
예제 #9
0
def p_go_to(t):
    'go_to : GOTO ID PTCOMA'
    t[0] = GoTo(t[2], t.slice[1].lineno, find_column(t.slice[1]))
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente('go_to ->GOTO ID PTCOMA',
                                   'go_to.instr = GoTO(ID);', lista)
    func(0, gramatical)
예제 #10
0
def p_exit(t):
    'exit : EXIT PTCOMA'
    t[0] = Exit(t.slice[1].lineno, find_column(t.slice[1]))
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente('exit -> EXIT PTCOMA',
                                   'exit.instr = Exit();', lista)
    func(0, gramatical)
예제 #11
0
def p_etiqueta(t):
    'etiqueta    : ID DOSP instrucciones '

    if (not band(0, True)):
        list2 = func(1, None).copy()
        gramatical2 = G.ValorAscendente('instrucciones -> epsilon',
                                        'instrucciones.lista = []', list2)
        func(0, gramatical2)
        band(1, True)

    lista = func(1, None).copy()
    t[0] = Etiqueta(t[1], t[3], t.slice[1].lineno, find_column(t.slice[1]))
    gramatical = G.ValorAscendente(
        'etiqueta -> ID DOSP instrucciones',
        'etiqueta.instrucciones.lista = []; </hr> etiqueta.instrucciones.lista = instrucciones.lista;',
        lista)
    func(0, gramatical)
예제 #12
0
def p_absoluto(t):
    'absoluto : ABS PARIZQ primitiva PARDER '
    op = Operacion()
    op.ValorAbsoluto(t[3],t.slice[1].lineno,find_column(t.slice[1]))
    t[0] = op
    lista = func(1,None).copy()
    gramatical = G.ValorAscendente('absoluto ->  ABS PARIZQ primitiva PARDER','absoluto.val = Math.ABS(primitiva.val);',lista)
    func(0,gramatical)
예제 #13
0
def p_puntero(t):
    'puntero : tipo_var IGUAL PAND  tipo_var PTCOMA '
    op = Operacion()
    op.Indentficador(t[4],t.slice[2].lineno,find_column(t.slice[3])+1)
    t[0] = Asignacion(t[1],op,t.slice[2].lineno,1,True)
    lista = func(1,None).copy()
    gramatical = G.ValorAscendente('puntero -> tipo_var IGUAL PAND  tipo_var PTCOMA','puntero.instr = Puntero(tipo_var1.val,tipo_var2.val);',lista)
    func(0,gramatical)
예제 #14
0
def p_expresion_negacion_bit(t):
    'expresion_bit_bit   :   NOTR primitiva %prec NOTR' 
    op = Operacion()
    op.OperacionNotBit(t[2],t.slice[1].lineno,find_column(t.slice[1]))
    lista = func(1,None).copy()
    gramatical = G.ValorAscendente('expresion_bit_bit ->  NOTR primitiva %prec NOTR','expresion_bit_bit.val = ~primitiva.val;',lista)
    func(0,gramatical)
    t[0] = op   
예제 #15
0
def p_instruccion_imprimir_acceso(t):
    'imprimir_instr     : IMPRIMIR PARIZQ acceso_lista PARDER PTCOMA'
    t[0] = Imprimir(t[3], t.slice[1].lineno, find_column(t.slice[1]))
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'imprimir_instr ->IMPRIMIR PARIZQ acceso_lista  PARDER PTCOMA',
        'imprimir_instr.instr = Print(acceso_lista.val);', lista)
    func(0, gramatical)
예제 #16
0
def p_if(t):
    'if_instruccion : IF PARIZQ expresion PARDER go_to '
    t[0] = If(t[3], t[5], t.slice[1].lineno, find_column(t.slice[1]))
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'if_instruccion -> IF PARIZQ expresion PARDER go_to',
        'if_instruccion.instr = If(expresion.val,go_to.instr);', lista)
    func(0, gramatical)
예제 #17
0
def p_expresion_negacion(t):
    'expresion_logica   :   NOT primitiva %prec NOT' 
    op = Operacion()
    op.OperacionNot(t[2],t.slice[1].lineno,find_column(t.slice[1]))
    t[0] = op    
    lista = func(1,None).copy()
    gramatical = G.ValorAscendente('expresion_logica ->  NOT primitiva %prec NOT','expresion_logica.val = !primitiva.val;',lista)
    func(0,gramatical)
예제 #18
0
def p_asingacion_array(t):
    'asignacion : tipo_var IGUAL ARRAY PARIZQ PARDER PTCOMA '
    t[0] = Asignacion(t[1], {}, t.slice[2].lineno, 1, False)
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'asignacion -> tipo_var IGUAL ARRAY PARIZQ PARDER PTCOMA',
        'asignacion.instr = Asignar(tipo_var.val,new Array());', lista)
    func(0, gramatical)
예제 #19
0
def p_expresion_primitiva(t):
    '''primitiva : ENTERO
                 | DECIMAL
                 | CADENA
                 | CADENA2
                 | TEMP 
                 | PARAM
                 | RET
                 | PILA 
                 | RA
                 | PUNTERO 
                 | acceso_lista'''
    op = Operacion()
    if (t.slice[1].type == 'CADENA' or t.slice[1].type == 'CADENA2'):
        op.Primitivo(
            Primitivo(str(t[1]), t.slice[1].lineno, find_column(t.slice[1])))
        gramatical = G.ValorAscendente('primitiva -> CADENA',
                                       'primitiva.val = str(CADENA);', None)
        func(2, gramatical)
    elif (t.slice[1].type == 'DECIMAL'):
        op.Primitivo(
            Primitivo(float(t[1]), t.slice[1].lineno, find_column(t.slice[1])))
        gramatical = G.ValorAscendente('primitiva -> FLOAT',
                                       'primitiva.val = float(FLOAT);', None)
        func(2, gramatical)
    elif (t.slice[1].type == 'ENTERO'):
        op.Primitivo(
            Primitivo(int(t[1]), t.slice[1].lineno, find_column(t.slice[1])))
        gramatical = G.ValorAscendente('primitiva -> ENTERO',
                                       'primitiva.val = int(ENTERO);', None)
        func(2, gramatical)
    elif (t.slice[1].type == 'TEMP') or (t.slice[1].type == 'PARAM') or (
            t.slice[1].type == 'RET') or (t.slice[1].type == 'PILA') or (
                t.slice[1].type == 'RA') or (t.slice[1].type == 'PUNTERO'):
        op.Indentficador(t[1], t.slice[1].lineno, find_column(t.slice[1]))
        gramatical = G.ValorAscendente('primitiva -> tipo_var',
                                       'primitiva.val = tipo_var.val;', None)
        func(2, gramatical)
    elif (t.slice[1].type == 'acceso_lista'):
        op.AccesoLista(t[1], t.lexer.lineno, 1)
        lista = func(1, None).copy()
        gramatical = G.ValorAscendente('primitiva ->  acceso_lista',
                                       'primitiva.val = acceso_lista.val;',
                                       lista)
        func(0, gramatical)
    t[0] = op
예제 #20
0
def p_asignacion(t):
    'asignacion : tipo_var IGUAL expresion PTCOMA '
    t[0] = Asignacion(t[1], t[3], t.slice[2].lineno, 1, False)
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'asignacion -> tipo_var IGUAL expresion PTCOMA',
        'asignacion.instr = Asignar(tipo_var.val,expresion.val);', lista)
    func(0, gramatical)
예제 #21
0
def p_expresion_unaria(t):
    'expresion_unaria   :   MENOS primitiva %prec UMENOS' 
    op = Operacion()
    op.OperacionUnaria(t[2],t.slice[1].lineno,find_column(t.slice[1]))
    t[0] = op
    lista = func(1,None).copy()
    gramatical = G.ValorAscendente('expresion_unaria ->  MENOS primitiva %prec UMENOS','expresion_unaria.val = -primitiva.val;',lista)
    func(0,gramatical)
예제 #22
0
def p_accesos(t):
    'accesos :  accesos acceso'
    t[1].append(t[2])
    t[0] = t[1]
    gramatical = G.ValorAscendente(
        'accesos -> accesos acceso',
        'accesos.lista = accesos1.lista; </hr> accesos.lista.add(acceso.val);',
        [])
    func(2, gramatical)
예제 #23
0
def p_acceso_lista_asigna_array(t):
    'acceso_lista_asigna : tipo_var accesos IGUAL ARRAY PARIZQ PARDER PTCOMA'
    t[0] = AccesoLista(t[1], t[2], t[4], t.slice[3].lineno, 1, True)
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'acceso_lista_asigna ->  tipo_var accesos IGUAL ARRAY PARIZQ PARDER PTCOMA',
        'acceso_lista_asigna.inst = AccesoLista(tipovar.val,accesos.lista,new Array());',
        lista)
    func(0, gramatical)
예제 #24
0
def p_acceso_lista(t):
    'acceso_lista : tipo_var accesos'
    t[0] = AccesoLista(t[1], t[2], None, t.lexer.lineno, 1, False)
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'acceso_lista ->  tipo_var accesos',
        'acceso_lista.val = AccesoLista(tipovar.val,accesos.lista,Null);',
        lista)
    func(0, gramatical)
예제 #25
0
def p_unset(t):
    '''unset : UNSET PARIZQ TEMP PARDER PTCOMA
             | UNSET PARIZQ PARAM PARDER PTCOMA
             | UNSET PARIZQ RET PARDER PTCOMA
             | UNSET PARIZQ PILA PARDER PTCOMA'''
    t[0] = Unset(t[3],t.slice[1].lineno,find_column(t.slice[1]))
    lista = func(1,None).copy()
    gramatical = G.ValorAscendente('unset -> UNSET PARIZQ tipo_var PARDER PTCOMA','unset.instr = Unset(tipo_var.val);',lista)
    func(0,gramatical)
예제 #26
0
def p_conversiones(t):
    'conversion : tipo_var IGUAL PARIZQ tipo_dato PARDER primitiva PTCOMA '
    t[0] = Conversion(t[1], t[6], t[4], t.slice[2].lineno, 1)
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'conversion -> tipo_var IGUAL  PARIZQ tipo_dato PARDER primitiva PTCOMA',
        'conversion.instr = Conversion(tipo_var.val,tipo_dato.val,primitiva.val);',
        lista)
    func(0, gramatical)
예제 #27
0
def p_instruccion_imprimir(t):
    'imprimir_instr     : IMPRIMIR PARIZQ tipo_var PARDER PTCOMA'
    op = Operacion()
    op.Indentficador(t[3], t.slice[1].lineno, find_column(t.slice[2]))
    t[0] = Imprimir(op, t.slice[1].lineno, find_column(t.slice[1]))
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'imprimir_instr ->IMPRIMIR PARIZQ tipo_var  PARDER PTCOMA',
        'imprimir_instr.instr = Print(tipo_var.val);', lista)
    func(0, gramatical)
예제 #28
0
def p_init(t):
    'init            : etiquetas'
    t[0] = t[1]
    lista = func(1, None)
    gramatical = G.ValorAscendente('etiquetas -> epsilon',
                                   'etiquetas.lista = []', [])
    try:
        lista[0].hijos.append(gramatical)
    except:
        pass
예제 #29
0
def p_etiquetas_lista(t):
    'etiquetas    : etiqueta etiquetas'
    t[0] = [t[1]]
    t[0] = t[0] + t[2]
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'etiquetas -> etiquetas etiqueta',
        'etiquetas.lista = [etiqueta]; </hr> etiquetas.lista = etiquetas.lista + etiquetas1.lista;',
        lista)
    func(0, gramatical)
예제 #30
0
def p_instrucciones_lista(t):
    'instrucciones    : instruccion instrucciones'
    t[0] = [t[1]]
    t[0] = t[0] + t[2]
    lista = func(1, None).copy()
    gramatical = G.ValorAscendente(
        'instrucciones -> instruccion instrucciones ',
        'instrucciones.lista = [instruccion]; </hr> instrucciones.lista = instrucciones.lista  + instrucciones1.lista;',
        lista)
    func(0, gramatical)  #func(0,gramatical)