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
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
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
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