def analizaRestoTerm(self, hered):
     if self.componente.cat == "OpMult":
         op = self.componente.valor
         self.avanza()
         fact = self.analizaFactor()
         nodoMult = AST.NodoAritmetico(hered, fact, self.lexico.nlinea, op)
         return self.analizaRestoTerm(nodoMult)
     elif self.componente.cat == "PR" and self.componente.valor == "Y":
         self.avanza()
         fact = self.analizaFactor()
         nodoCuasiMult = AST.NodoAritmetico(hered, fact, self.lexico.nlinea,
                                            "Y")
         return self.analizaRestoTerm(nodoCuasiMult)
     elif (
             self.componente.cat == "PR" and self.componente.valor
             in ["ENTONCES", "HACER", "SINO", "O"]
     ) or self.componente.cat == "ParentCi" or self.componente.cat == "CorCi" or self.componente.cat == "OpRel" or self.componente.cat == "PtoComa" or self.componente.cat == "OpAdd":
         return hered
     else:
         print "Error: SE ESPERABA Resto de Termino en linea " + str(
             self.lexico.nlinea)
         while not ((self.componente.cat == "PR" and self.componente.valor
                     in ["O", "ENTONCES", "HACER", "SINO"])
                    or self.componente.cat == "OpRel" or self.componente.cat
                    == "OpAdd" or self.componente.cat == "CorCi"
                    or self.componente.cat == "ParentCi"
                    or self.componente.cat == "PtoComa"):
             self.avanza()
         return
 def analizaInstES(self):
     if self.componente.cat == "PR" and self.componente.valor == "LEE":
         self.avanza()
         self.comprueba("ParentAp")
         # RESTRICCION SEMANTICA: el argumento de LEE solo puede ser entero o real
         if (self.tablaSim[self.componente.valor] not in ["ENTERO",
                                                          "REAL"]):
             print "Error: el tipo a leer solo puede ser entero o real (instruccion LEE en linea " + str(
                 self.componente.linea) + ")"
         var = self.componente.valor
         tipo = self.tablaSim[var]
         nodoVar = AST.NodoAccesoVariable(var, self.lexico.nlinea, tipo)
         nodoLee = AST.NodoLee(nodoVar, self.lexico.nlinea)
         self.comprueba("Identif")
         self.comprueba("ParentCi")
         return nodoLee
     elif self.componente.cat == "PR" and self.componente.valor == "ESCRIBE":
         self.avanza()
         self.comprueba("ParentAp")
         expr = self.analizaExprSimple()
         self.comprueba("ParentCi")
         nodoEscribe = AST.NodoEscribe(expr, self.lexico.nlinea)
         return nodoEscribe
     else:
         print "Error: SE ESPERABA LEE O ESCRIBE en linea " + str(
             self.lexico.nlinea)
         while not ((self.componente.cat == "PR" and self.componente.valor
                     == "SINO") or self.componente.cat == "PtoComa"):
             self.avanza()
         return
 def analizaRestoExprSimple(self, hered):
     if self.componente.cat == "OpAdd":
         op = self.componente.valor
         self.avanza()
         term = self.analizaTermino()
         nodoSuma = AST.NodoAritmetico(hered, term, self.lexico.nlinea, op)
         return self.analizaRestoExprSimple(nodoSuma)
     elif self.componente.cat == "PR" and self.componente.valor == "O":
         self.avanza()
         term = self.analizaTermino()
         nodoCuasiSuma = AST.NodoAritmetico(hered, term, self.lexico.nlinea,
                                            "O")
         return self.analizaRestoExprSimple(nodoCuasiSuma)
     elif (
             self.componente.cat == "PR"
             and self.componente.valor in ["ENTONCES", "HACER", "SINO"]
     ) or self.componente.cat == "ParentCi" or self.componente.cat == "CorCi" or self.componente.cat == "OpRel" or self.componente.cat == "PtoComa":
         return hered
     else:
         print "Error: SE ESPERABA Comienzo de Resto Expresion Simple en linea " + str(
             self.lexico.nlinea)
         while not ((self.componente.cat == "PR" and self.componente.valor
                     in ["ENTONCES", "HACER", "SINO"])
                    or self.componente.cat == "OpRel" or self.componente.cat
                    == "CorCi" or self.componente.cat == "ParentCi"
                    or self.componente.cat == "PtoComa"):
             self.avanza()
         return
    def analizaVariable(self):
        if self.componente.cat == "Identif":
            # RESTRICCION SEMANTICA: definir variables antes de usarlas
            if (self.componente.valor not in self.tablaSim):
                print "Error: variable no definida: '" + self.componente.valor + "' en linea " + str(
                    self.componente.linea)

            var = self.componente.valor
            tipo = self.tablaSim[var]
            self.avanza()
            dcha = self.analizaRestoVar()

            if (dcha is None):
                return AST.NodoAccesoVariable(var, self.lexico.nlinea, tipo)

            else:
                return AST.NodoAccesoVector(var, dcha, self.lexico.nlinea)
        else:
            print "Error: SE ESPERABA IDENTIFICADOR en linea " + str(
                self.lexico.nlinea)
            while not ((self.componente.cat == "PR" and self.componente.valor
                        in ["Y", "O", "ENTONCES", "HACER", "SINO"])
                       or self.componente.cat == "OpRel" or self.componente.cat
                       == "OpAdd" or self.componente.cat == "OpMult"
                       or self.componente.cat == "CorCi" or self.componente.cat
                       == "ParentCi" or self.componente.cat == "PtoComa"):
                self.avanza()
            return
 def analizaRestoInstSimple(self, var):
     if self.componente.cat == "OpAsigna":
         self.avanza()
         accVar = AST.NodoAccesoVariable(var.valor, self.lexico.nlinea,
                                         self.tablaSim[var.valor])
         expr = self.analizaExpresion()
         return AST.NodoAsignacion(accVar, expr, self.lexico.nlinea)
     elif self.componente.cat == "CorAp":
         self.avanza()
         exprVect = self.analizaExprSimple()
         self.comprueba("CorCi")
         self.comprueba("OpAsigna")
         expr = self.analizaExpresion()
         nodoVect = AST.NodoAccesoVector(var.valor, exprVect,
                                         self.lexico.nlinea,
                                         self.tablaSim[var.valor])
         return AST.NodoAsignacion(nodoVect, expr, self.lexico.nlinea)
     elif (self.componente.cat == "PR" and self.componente.valor
           in ["SINO"]) or self.componente.cat == "PtoComa":
         pass
     else:
         print "Error: SE ESPERABA OPASIGNA O CORAP en linea " + str(
             self.lexico.nlinea)
         while not ((self.componente.cat == "PR" and self.componente.valor
                     == "SINO") or self.componente.cat == "PtoComa"):
             self.avanza()
         return
示例#6
0
def p_expression(p):
    '''expression :  NUMBER
                    | ID
                    | expression OPBIN expression'''
    try:
        if len(p) > 2:
            p[0] = ASTree.AST("OPBIN", p[2])
            p[0].sons = [p[1], p[3]]
        else:
            if type(p[1]) == str:
                p[0] = ASTree.AST("ID", p[1])
            else:
                p[0] = ASTree.AST("NUMBER", p[1])
    except:
        pass
示例#7
0
def p_programme(p):
    '''programme : MAIN LPAREN enum RPAREN LACO commande FINISH PRINT LPAREN expression RPAREN RACO
    '''
    try:
        p[0] = ASTree.AST("programme", "main")
        p[0].sons = [p[3], p[6], p[10]]
    except:
        pass
示例#8
0
def p_commande(p):
    '''commande : ID AFFECT expression
                  | commande END commande
                  | WHILE LPAREN expression RPAREN LACO commande RACO'''
    try:
        if len(p) == 8:
            p[0] = ASTree.AST("commande", "while")
            p[0].sons = [p[3], p[6]]
        else:
            if p[2] == "=":
                p[0] = ASTree.AST("AFFECT", "=")
                p[0].sons = [p[1], p[3]]
            else:
                p[0] = ASTree.AST("END", ";")
                p[0].sons = [p[1], p[3]]
    except:
        pass
    def analizaFactor(self):
        if self.componente.cat == "Identif":
            return self.analizaVariable()
        elif self.componente.cat == "Numero":
            nodo = None
            if self.componente.tipo is "ENTERO":
                nodo = AST.NodoEntero(self.componente.valor,
                                      self.lexico.nlinea)
            else:
                nodo = AST.NodoReal(self.componente.valor, self.lexico.nlinea)
            self.avanza()
            return nodo
        elif self.componente.cat == "ParentAp":
            self.avanza()
            nodo = self.analizaExpresion()
            self.comprueba("ParentCi")
            return nodo
        elif self.componente.cat == "PR" and self.componente.valor == "NO":
            self.avanza()
            fact = self.analizaFactor()
            return AST.NodoAritmetico(None, fact, self.lexico.nlinea, "NO")
        elif self.componente.cat == "PR" and self.componente.valor == "CIERTO":
            self.avanza()
            return AST.NodoBooleano("CIERTO", self.lexico.nlinea)
        elif self.componente.cat == "PR" and self.componente.valor == "FALSO":
            self.avanza()
            return AST.NodoBooleano("FALSO", self.lexico.nlinea)

        else:
            print "Error: SE ESPERABA Factor en linea " + str(
                self.lexico.nlinea)
            while not ((self.componente.cat == "PR" and self.componente.valor
                        in ["Y", "O", "ENTONCES", "HACER", "SINO"])
                       or self.componente.cat == "OpRel" or self.componente.cat
                       == "OpAdd" or self.componente.cat == "OpMult"
                       or self.componente.cat == "CorCi" or self.componente.cat
                       == "ParentCi" or self.componente.cat == "PtoComa"):
                self.avanza()
            return
 def analizaExpresion(self):
     if (
             self.componente.cat == "PR"
             and self.componente.valor in ["NO", "CIERTO", "FALSO"]
     ) or self.componente.cat == "Identif" or self.componente.cat == "Numero" or self.componente.cat == "ParentAp" or self.componente.cat == "OpAdd":
         izd = self.analizaExprSimple()
         dcha = self.analizaExpresionPrima()
         if dcha is None:
             return izd
         else:
             nodoComp = AST.NodoComparacion(izd, dcha[0],
                                            self.lexico.nlinea, dcha[1])
             return nodoComp
     else:
         print "Error: SE ESPERABA Comienzo de Expresion Simple en linea " + str(
             self.lexico.nlinea)
         while not ((self.componente.cat == "PR" and self.componente.valor
                     in ["ENTONCES", "HACER", "SINO"])
                    or self.componente.cat == "PtoComa"):
             self.avanza()
         return
 def analizaExprSimple(self):
     if (
             self.componente.cat == "PR"
             and self.componente.valor in ["NO", "CIERTO", "FALSO"]
     ) or self.componente.cat == "ParentAp" or self.componente.cat == "Identif" or self.componente.cat == "Numero":
         term = self.analizaTermino()
         return self.analizaRestoExprSimple(term)
     elif self.componente.cat == "OpAdd":
         signo = self.componente.valor
         self.analizaSigno()
         term = self.analizaTermino()
         dcha = self.analizaRestoExprSimple(term)
         return AST.NodoAritmetico(None, dcha, self.lexico.nlinea, signo)
     else:
         print "Error: SE ESPERABA Comienzo de Expresion Simple en linea " + str(
             self.lexico.nlinea)
         while not ((self.componente.cat == "PR" and self.componente.valor
                     in ["ENTONCES", "HACER", "SINO"])
                    or self.componente.cat == "OpRel" or self.componente.cat
                    == "CorCi" or self.componente.cat == "ParentCi"
                    or self.componente.cat == "PtoComa"):
             self.avanza()
         return
 def analizaInstruccion(self):
     if self.componente.cat == "PR" and self.componente.valor == "INICIO":
         self.avanza()
         linst = self.analizaListaInst()
         if self.componente.cat == "PR" and self.componente.valor == "FIN":
             self.avanza()
             return AST.NodoCompuesta(linst, self.lexico.nlinea)
         else:
             while not ((self.componente.cat == "PR"
                         and self.componente.valor == "SINO")
                        or self.componente.cat == "PtoComa"):
                 self.avanza()
             return
     elif self.componente.cat == "Identif":
         return self.analizaInstSimple()
     elif self.componente.cat == "PR" and self.componente.valor in [
             "LEE", "ESCRIBE"
     ]:
         return self.analizaInstES()
     elif self.componente.cat == "PR" and self.componente.valor == "SI":
         self.avanza()
         expr = self.analizaExpresion()
         if self.componente.cat == "PR" and self.componente.valor == "ENTONCES":
             self.avanza()
         else:
             print "Error: SE ESPERABA ENTONCES en linea " + str(
                 self.lexico.nlinea)
             while not ((self.componente.cat == "PR"
                         and self.componente.valor == "SINO")
                        or self.componente.cat == "PtoComa"):
                 self.avanza()
             return
         instSi = self.analizaInstruccion()
         if self.componente.cat == "PR" and self.componente.valor == "SINO":
             self.avanza()
         else:
             print "Error: SE ESPERABA SINO en linea " + str(
                 self.lexico.nlinea)
             while not ((self.componente.cat == "PR"
                         and self.componente.valor == "SINO")
                        or self.componente.cat == "PtoComa"):
                 self.avanza()
             return
         instSino = self.analizaInstruccion()
         return AST.NodoSi(expr, instSi, instSino, self.lexico.nlinea)
     elif self.componente.cat == "PR" and self.componente.valor == "MIENTRAS":
         self.avanza()
         expr = self.analizaExpresion()
         if self.componente.cat == "PR" and self.componente.valor == "HACER":
             self.avanza()
         else:
             print "Error: SE ESPERABA HACER en linea " + str(
                 self.lexico.nlinea)
             while not ((self.componente.cat == "PR"
                         and self.componente.valor == "SINO")
                        or self.componente.cat == "PtoComa"):
                 self.avanza()
             return
         inst = self.analizaInstruccion()
         return AST.NodoMientras(expr, inst, self.lexico.nlinea)
     else:
         print "Error: Instruccion invalida"
         while not ((self.componente.cat == "PR" and self.componente.valor
                     == "SINO") or self.componente.cat == "PtoComa"):
             self.avanza()
         return