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
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)
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
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)
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)
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)
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)
def p_instruccion_imprimir_cadena(t): '''imprimir_instr : IMPRIMIR PARIZQ CADENA PARDER PTCOMA | IMPRIMIR PARIZQ CADENA2 PARDER PTCOMA''' op = Operacion() op.Primitivo(Primitivo(t[3], t.slice[1].lineno, 0)) 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 CADENA PARDER PTCOMA', 'imprimir_instr.instr = Print(CADENA);', lista) func(0, gramatical)
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
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
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
def p_expresion_relacional(t): '''expresion_relacional : primitiva MENQUE primitiva | primitiva MAYQUE primitiva | primitiva MEIQUE primitiva | primitiva MAIQUE primitiva | primitiva IGUALQUE primitiva | primitiva NIGUALQUE primitiva ''' op = Operacion() if(t.slice[2].type == 'MENQUE'): op.Operacion(t[1],t[3],TIPO_OPERACION.MENOR_QUE,t.slice[2].lineno,1) lista = func(1,None).copy() gramatical = G.ValorAscendente('expresion_relacional -> primitiva MENOR primitiva','expresion_relacional.val = primitiva1.val < primitiva2.val;',lista) func(0,gramatical) elif(t.slice[2].type == 'MAYQUE'): op.Operacion(t[1],t[3],TIPO_OPERACION.MAYOR_QUE,t.slice[2].lineno,1) lista = func(1,None).copy() gramatical = G.ValorAscendente('expresion_relacional -> primitiva MAYOR primitiva','expresion_relacional.val = primitiva1.val > primitiva2.val;',lista) func(0,gramatical) elif(t.slice[2].type == 'MEIQUE'): op.Operacion(t[1],t[3],TIPO_OPERACION.MENOR_IGUA_QUE,t.slice[2].lineno,1) lista = func(1,None).copy() gramatical = G.ValorAscendente('expresion_relacional -> primitiva MENORIGUAL primitiva','expresion_relacional.val = primitiva1.val <= primitiva2.val;',lista) func(0,gramatical) elif(t.slice[2].type == 'MAIQUE'): op.Operacion(t[1],t[3],TIPO_OPERACION.MAYOR_IGUA_QUE,t.slice[2].lineno,1) lista = func(1,None).copy() gramatical = G.ValorAscendente('expresion_relacional -> primitiva MAYORIGUAL primitiva','expresion_relacional.val = primitiva1.val >= primitiva2.val;',lista) func(0,gramatical) elif(t.slice[2].type == 'IGUALQUE'): op.Operacion(t[1],t[3],TIPO_OPERACION.IGUAL_IGUAL,t.slice[2].lineno,1) lista = func(1,None).copy() gramatical = G.ValorAscendente('expresion_relacional -> primitiva IGUAL IGUAL primitiva','expresion_relacional.val = primitiva1.val == primitiva2.val;',lista) func(0,gramatical) elif(t.slice[2].type == 'NIGUALQUE'): op.Operacion(t[1],t[3],TIPO_OPERACION.DIFERENTE_QUE,t.slice[2].lineno,1) lista = func(1,None).copy() gramatical = G.ValorAscendente('expresion_relacional -> primitiva DIFERENTE primitiva','expresion_relacional.val = primitiva1.val != primitiva2.val;',lista) func(0,gramatical) t[0] = op