def p_expresion_2(t): ''' expresion : BBNOT expresion | NOT expresion | MENOS expresion | INCREMENTO IDENTIFICADOR | DECREMENTO IDENTIFICADOR | BBAND expresion ''' reporte_gramatical.append([ ' expresion -> ' + t[1] + ' expresion', 't[0] = Expresion(t[2],None,' + t[1] + ',t.lineno(1),find_column(entrada, t.slice[1]),t[1])' ]) if t[1] == '!': t[0] = Expresion(t[2], None, TIPO_OPERACION.NOT, t.lineno(1), find_column(entrada, t.slice[1]), t[1]) if t[1] == '~': t[0] = Expresion(t[2], None, TIPO_OPERACION.BBNOT, t.lineno(1), find_column(entrada, t.slice[1]), t[1]) if t[1] == '-': t[0] = Expresion(t[2], None, TIPO_OPERACION.MENOS_UNARIO, t.lineno(1), find_column(entrada, t.slice[1]), t[1]) if t[1] == '++': t[0] = Expresion(t[2], None, TIPO_OPERACION.PRE_INC, t.lineno(1), find_column(entrada, t.slice[1]), '+') if t[1] == '--': t[0] = Expresion(t[2], None, TIPO_OPERACION.PRE_DEC, t.lineno(1), find_column(entrada, t.slice[1]), '-') if t[1] == '&': t[0] = t[2]
def p_expresion_2_post(t): ''' expresion : IDENTIFICADOR INCREMENTO | IDENTIFICADOR DECREMENTO ''' reporte_gramatical.append([ ' expresion -> expresion ' + t[2], 't[0] = Expresion(t[1],None,' + t[2] + ',t.lineno(1),find_column(entrada, t.slice[1]),t[1])' ]) if t[2] == '++': t[0] = Expresion(t[1], None, TIPO_OPERACION.POST_INC, t.lineno(1), find_column(entrada, t.slice[1]), '+') if t[2] == '--': t[0] = Expresion(t[1], None, TIPO_OPERACION.POST_DEC, t.lineno(1), find_column(entrada, t.slice[1]), '-')
def p_ins_dec_post(t): 'inc_dec : IDENTIFICADOR DECREMENTO' reporte_gramatical.append([ 'inc_dec -> IDENTIFICADOR DECREMENTO', 'exp = Expresion(t[1],Expresion(1,None,TIPO_OPERACION.ENTERO,t.lineno(1),find_column(entrada, t.slice[1])),TIPO_OPERACION.RESTA,t.lineno(1),find_column(entrada, t.slice[1]))\nt[0] = Asignacion(t[1],None,\'=\',exp,t.lineno(1),find_column(entrada, t.slice[1]))' ]) exp_id = Expresion(t[1], None, TIPO_OPERACION.IDENTIFICADOR, t.lineno(1), find_column(entrada, t.slice[1])) exp_1 = Expresion(1, None, TIPO_OPERACION.ENTERO, t.lineno(1), find_column(entrada, t.slice[1])) exp = Expresion(exp_id, exp_1, TIPO_OPERACION.RESTA, t.lineno(1), find_column(entrada, t.slice[1]), '-') t[0] = Asignacion(t[1], None, '=', exp, t.lineno(1), find_column(entrada, t.slice[1]))
def p_sizeof_TIPO(t): ' expresion : SIZEOF PIZQ tipo PDER' reporte_gramatical.append([ ' expresion -> SIZEOF PIZQ tipo PDER', 't[0] = Expresion(tam,None,TIPO_OPERACION.ENTERO,t.lineno(1),find_column(entrada, t.slice[1]))' ]) if t[3] == 'int' or t[1] == 'float': t[0] = Expresion(4, None, TIPO_OPERACION.ENTERO, t.lineno(1), find_column(entrada, t.slice[1])) elif t[3] == 'double': t[0] = Expresion(8, None, TIPO_OPERACION.ENTERO, t.lineno(1), find_column(entrada, t.slice[1])) elif t[3] == 'char': t[0] = Expresion(1, None, TIPO_OPERACION.ENTERO, t.lineno(1), find_column(entrada, t.slice[1]))
def p_expresion_1_llamada(t): 'expresion : llamada ' reporte_gramatical.append([ ' expresion -> llamada', 't[0] = Expresion(t[1],None,TIPO_OPERACION.LLAMADA,0,0)' ]) t[0] = Expresion(t[1], None, TIPO_OPERACION.LLAMADA, 0, 0)
def p_sizeof(t): ' expresion : SIZEOF PIZQ expresion PDER' reporte_gramatical.append([ ' expresion -> SIZEOF PIZQ expresion PDER', 't[0] = Expresion(4,None,TIPO_OPERACION.ENTERO,t.lineno(1),find_column(entrada, t.slice[1]))' ]) t[0] = Expresion(4, None, TIPO_OPERACION.ENTERO, t.lineno(1), find_column(entrada, t.slice[1]))
def p_expresion_1_identificador(t): 'expresion : IDENTIFICADOR ' reporte_gramatical.append([ ' expresion -> IDENTIFICADOR', 't[0] = Expresion(t[1],None,TIPO_OPERACION.IDENTIFICADOR,t.lineno(1),find_column(entrada, t.slice[1]))' ]) t[0] = Expresion(t[1], None, TIPO_OPERACION.IDENTIFICADOR, t.lineno(1), find_column(entrada, t.slice[1]))
def p_expresion_1_caracter(t): 'expresion : CARACTER' reporte_gramatical.append([ ' expresion -> CARACTER', 't[0] = Expresion(t[1],None,TIPO_OPERACION.CARACTER,t.lineno(1),find_column(entrada, t.slice[1]))' ]) t[0] = Expresion(t[1], None, TIPO_OPERACION.CARACTER, t.lineno(1), find_column(entrada, t.slice[1]))
def p_expresion_1_decimal(t): 'expresion : DECIMAL ' reporte_gramatical.append([ ' expresion -> DECIMAL', 't[0] = Expresion(t[1],None,TIPO_OPERACION.DECIMAL,t.lineno(1),find_column(entrada, t.slice[1]))' ]) t[0] = Expresion(t[1], None, TIPO_OPERACION.DECIMAL, t.lineno(1), find_column(entrada, t.slice[1]))
def p_expresion_1_entero(t): ''' expresion : ENTERO ''' reporte_gramatical.append([ ' expresion -> ENTERO', 't[0] = Expresion(t[1],None,TIPO_OPERACION.ENTERO,t.lineno(1),find_column(entrada, t.slice[1]))' ]) t[0] = Expresion(t[1], None, TIPO_OPERACION.ENTERO, t.lineno(1), find_column(entrada, t.slice[1]))
def p_expresion_2_accesos(t): 'expresion : IDENTIFICADOR accesos_generales' reporte_gramatical.append([ ' expresion -> IDENTIFICADOR accesos_generales', 't[0] = Acceso(t[1],t[2],t.lineno(1),find_column(entrada, t.slice[1]))' ]) val = Acceso(t[1], t[2], t.lineno(1), find_column(entrada, t.slice[1])) t[0] = Expresion(val, None, TIPO_OPERACION.ACCESO_ARREGLO, t.lineno(1), find_column(entrada, t.slice[1]))
def p_casteos(t): ' expresion : PIZQ tipo PDER expresion' reporte_gramatical.append([ ' expresion -> PIZQ tipo PDER expresion', 't[0] = Expresion(t[4],None,tipo,t.lineno(1),find_column(entrada, t.slice[1]))' ]) if t[2] == 'int': tipo = TIPO_OPERACION.CASTEO_ENTERO elif t[2] == 'double' or t[2] == 'float': tipo = TIPO_OPERACION.CASTEO_DECIMAL elif t[2] == 'char': tipo = TIPO_OPERACION.CASTEO_CARACTER t[0] = Expresion(t[4], None, tipo, t.lineno(1), find_column(entrada, t.slice[1]), t[2])
def p_expresion_3(t): ''' expresion : expresion MAS expresion | expresion MENOS expresion | expresion POR expresion | expresion DIVIDIDO expresion | expresion MODULO expresion | expresion AND expresion | expresion OR expresion | expresion BBAND expresion | expresion BBOR expresion | expresion BBXOR expresion | expresion BBIZQ expresion | expresion BBDER expresion | expresion IGUAL_QUE expresion | expresion DESIGUAL_QUE expresion | expresion MENOR_QUE expresion | expresion MAYOR_QUE expresion | expresion MENOR_IGUAL_QUE expresion | expresion MAYOR_IGUAL_QUE expresion ''' reporte_gramatical.append([ ' expresion -> expresion ' + t[2] + ' expresion', 't[0] = Expresion(t[1],t[3],' + t[2] + ',t.lineno(2),find_column(entrada, t.slice[2]),t[2])' ]) if t[2] == '+': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.SUMA, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '-': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.RESTA, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '*': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.MULTIPLICACION, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '/': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.DIVISION, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '%': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.RESIDUO, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '<': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.MENOR_QUE, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '>': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.MAYOR_QUE, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '<=': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.MENOR_IGUAL_QUE, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '>=': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.MAYOR_IGUAL_QUE, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '==': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.IGUAL_QUE, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '!=': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.DISTINTO_QUE, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '&&': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.AND, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '||': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.OR, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '&': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.BBAND, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '|': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.BBOR, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '^': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.BBXOR, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '<<': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.BBIZQ, t.lineno(2), find_column(entrada, t.slice[2]), t[2]) if t[2] == '>>': t[0] = Expresion(t[1], t[3], TIPO_OPERACION.BBDER, t.lineno(2), find_column(entrada, t.slice[2]), t[2])