예제 #1
0
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)
예제 #2
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)
예제 #3
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)
예제 #4
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)
예제 #5
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)
예제 #6
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)
예제 #7
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)
예제 #8
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)
예제 #9
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)
예제 #10
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)
예제 #11
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)
예제 #12
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)
예제 #13
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)
예제 #14
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)
예제 #15
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)
예제 #16
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)
예제 #17
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)
예제 #18
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)
예제 #19
0
def p_expr_unaria(p):
    """expresion : '-' expresion %prec UMINUS"""
    p[0] = Nodo('menos', [p[1]])
    p[0].linea = p.lineno(0)
예제 #20
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)
예제 #21
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)
예제 #22
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)
예제 #23
0
def p_modificador_nota(p):
    """modificador_nota : MODIFICADOR elemento"""
    p[0] = Nodo('modificador', [p[2]])
    p[0].linea = p.lineno(0)
예제 #24
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)
예제 #25
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)
예제 #26
0
def p_tempo(p):
    """tempo : CONSTANTE_ENTERA
             | ID"""
    p[0] = Nodo('tempo')
    p[0].val = p[1]
    p[0].linea = p.lineno(0)
예제 #27
0
def p_cuerpo(p):
    """cuerpo : LLAVE_IZQ lista_declaraciones LLAVE_DER"""
    p[0] = Nodo('cuerpo', [p[2]])
    p[0].linea = p.lineno(0)
예제 #28
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)
예제 #29
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)
예제 #30
0
def p_arreglo(p):
    """arreglo : CORCHETE_IZQ lista_arreglos CORCHETE_DER"""
    p[0] = Nodo('arreglo', [p[2]])
    p[0].linea = p.lineno(0)