def p_indice_arreglo(p): """indice_arreglo : ID CORCHETE_IZQ CONSTANTE_ENTERA CORCHETE_DER""" p[0] = Nodo('indice_arreglo') p[0].val = p[1] p[0].interesante = p[3] p[0].linea = p.lineno(0)
def p_instrumento(p): """instrumento : PIANO | GUITARRA | FLAUTA""" p[0] = Nodo('instrumento') p[0].val = p[1].lower() p[0].linea = p.lineno(0)
def p_lista_notas(p): """lista_notas : lista_notas COMA nota | nota""" if (len(p) == 4): p[0] = Nodo('lista_notas', [p[1], p[3]]) else: p[0] = Nodo('lista_notas', [p[1]]) p[0].linea = p.lineno(0)
def p_lista_declaraciones(p): """lista_declaraciones : lista_declaraciones declaracion | declaracion""" if len(p) == 3: p[0] = Nodo('lista_declaraciones', [p[1], p[2]]) else: p[0] = Nodo('lista_declaraciones', [p[1]]) p[0].linea = p.lineno(0)
def p_lista_arreglos(p): """lista_arreglos : lista_arreglos COMA elemento_arreglo | elemento_arreglo""" if len(p) == 4: p[0] = Nodo('lista_arreglos', [p[1], p[3]]) else: p[0] = Nodo('lista_arreglos', [p[1]]) p[0].linea = p.lineno(0)
def p_tipo_dato(p): """tipo_dato : ENTERO | FLOTANTE | BOOL | NOTA""" p[0] = Nodo('tipo_dato') p[0].tipo = p[1].upper() p[0].linea = p.lineno(0)
def p_elementos_arreglo(p): """elemento_arreglo : elemento_tocar""" if type(p[1]) == Nodo: p[0] = p[1] else: p[0] = Nodo('booleano') p[0].val = p[1] p[0].tipo = 'BOOLEANO' p[0].linea = p.lineno(0)
def p_expr_binaria(p): """expresion : expresion OPERADOR_LOGICO expresion | expresion SUMA expresion | expresion RESTA expresion | expresion MULTI expresion | expresion DIVISION expresion | expresion OR expresion | expresion AND expresion""" p[0] = Nodo(p[2].lower(), [p[1], p[3]]) p[0].linea = p.lineno(0)
def p_elemento(p): """elemento : paren_notas | llaves_notas | nota | ID""" if type(p[1]) == Nodo: p[0] = p[1] else: p[0] = Nodo('id') p[0].val = p[1] p[0].linea = p.lineno(0)
def p_sinconizacion(p): """sincronizacion : COMA CONSTANTE_ENTERA | COMA CONSTANTE_FLOTANTE | COMA ID | vacio""" p[0] = Nodo('sincronizacion') if (p[1] == ','): p[0].val = p[2] else: p[0].val = 'nada' p[0].linea = p.lineno(0)
def p_nota(p): """nota : DO | RE | MI | FA | SOL | LA | SI""" p[0] = Nodo('nota') p[0].val = Nota() p[0].val.notas.append(p[1]) p[0].tipo = 'nota' p[0].linea = p.lineno(0)
def p_tipo_var(p): """tipo_var : ID | ID CORCHETE_IZQ CONSTANTE_ENTERA CORCHETE_DER""" if len(p) == 2: p[0] = Nodo('tipo_var') p[0].val = [p[1]] else: p[0] = Nodo('tipo_var') p[0].val = [p[1], p[3]] p[0].linea = p.lineno(0)
def p_expr_incremento(p): """expresion : expresion POST | PRE expresion""" if p[1] == '++' or p[1] == '--': p[0] = Nodo('pre', [p[2]]) p[0].interesante = p[1] else: p[0] = Nodo('post', [p[1]]) p[0].interesante = p[2] p[0].linea = p.lineno(0)
def p_lista_tocar(p): """lista_tocar : lista_tocar COMA elemento_tocar | elemento_tocar""" if len(p) == 4: p[0] = Nodo('lista_tocar', [p[1], p[3]]) else: p[0] = Nodo('lista_tocar', [p[1]]) p[0].tipo = 'nota' p[0].linea = p.lineno(0)
def p_numero(p): """numero : CONSTANTE_ENTERA | CONSTANTE_FLOTANTE""" p[0] = Nodo('numero') p[0].val = p[1] if type(p[1]) == int: p[0].tipo = 'ENTERO' else: p[0].tipo = 'FLOTANTE' p[0].linea = p.lineno(0)
def p_expresion(p): """expresion : PAREN_IZQ expresion PAREN_DER | ID | numero | BOOLEANO | indice_arreglo""" if len(p) == 2: if type(p[1]) != Nodo: if p[1] == 'verdadero' or p[1] == 'falso': p[0] = Nodo('booleano') p[0].tipo = 'BOOLEANO' else: p[0] = Nodo('id') p[0].val = p[1] else: p[0] = p[1] else: p[0] = p[2] p[0].linea = p.lineno(0)
def p_llaves_notas(p): """llaves_notas : LLAVE_IZQ lista_notas LLAVE_DER""" p[0] = Nodo('llaves_notas', [p[2]]) p[0].tipo = 'nota' p[0].linea = p.lineno(0)
def p_tiempo_nota(p): """tiempo_nota : numero elemento | numero modificador_nota""" p[0] = Nodo('tiempo_nota', [p[1], p[2]]) p[0].tipo = 'nota' p[0].linea = p.lineno(0)
def p_expr_unaria(p): """expresion : '-' expresion %prec UMINUS""" p[0] = Nodo('menos', [p[1]]) p[0].linea = p.lineno(0)
def p_potencia_nota(p): """potencia_nota : elemento_potencia POTENCIA numero""" p[0] = Nodo('potencia_nota', [p[1], p[3]]) p[0].tipo = 'nota' p[0].linea = p.lineno(0)
def p_asignacion(p): """asignacion : tipo_var ASIGNACION lista_variables""" p[0] = Nodo('asignacion', [p[1], p[3]]) p[0].linea = p.lineno(0)
def p_dec_asignacion(p): """dec_asignacion : tipo_dato asignacion""" p[0] = Nodo('dec_asignacion', [p[1], p[2]]) p[0].linea = p.lineno(0)
def p_modificador_nota(p): """modificador_nota : MODIFICADOR elemento""" p[0] = Nodo('modificador', [p[2]]) p[0].linea = p.lineno(0)
def p_tocar(p): """tocar : TOCAR PAREN_IZQ parametros_tocar PAREN_DER cuerpo_tocar""" p[0] = Nodo('tocar', [p[3], p[5]]) p[0].linea = p.lineno(0)
def p_parametros_tocar(p): """parametros_tocar : tempo COMA instrumento sincronizacion""" p[0] = Nodo('parametros_tocar', [p[1], p[3], p[4]]) p[0].linea = p.lineno(0)
def p_tempo(p): """tempo : CONSTANTE_ENTERA | ID""" p[0] = Nodo('tempo') p[0].val = p[1] p[0].linea = p.lineno(0)
def p_cuerpo(p): """cuerpo : LLAVE_IZQ lista_declaraciones LLAVE_DER""" p[0] = Nodo('cuerpo', [p[2]]) p[0].linea = p.lineno(0)
def p_declaracion_si_sino(p): """declaracion_si : SI PAREN_IZQ expresion PAREN_DER cuerpo SINO cuerpo""" p[0] = Nodo('si', [p[3], p[5], Nodo('sino', [p[7]])]) p[0].linea = p.lineno(0)
def p_declaracion_mientras(p): """declaracion_mientras : MIENTRAS PAREN_IZQ expresion PAREN_DER cuerpo""" p[0] = Nodo('mientras', [p[3], p[5]]) p[0].linea = p.lineno(0)
def p_arreglo(p): """arreglo : CORCHETE_IZQ lista_arreglos CORCHETE_DER""" p[0] = Nodo('arreglo', [p[2]]) p[0].linea = p.lineno(0)