def analise_lexica(expressao): """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ numeros = ["0123456789"] numeros2 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] ponto = ['.'] operacao = ["+-*/"] simbolos = ["()[]{}"] letras = ["abcdefghijklmnopqrstuvxz"] fila = Fila() for i in expressao: if expressao == '': fila.vazia() else: for j in i: if j in set(numeros) and j in set(ponto) and j in set( operacao) and j in set(simbolos): fila.enfileirar(j) fila.enfileirar(ponto) elif j not in set(letras): fila.enfileirar(j) else: raise ErroLexico return fila
def analise_sintatica(fila): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ novafila = Fila() if fila.vazia(): raise ErroSintatico save = '' while not fila.vazia(): item = fila.desenfileirar() if num(item): save = int(item) if fila.vazia(): novafila.enfileirar(save) return novafila if fila.primeiro() != '.': novafila.enfileirar(save) elif item == '.': item = fila.desenfileirar() save = float(save) save += (float(item)) / (10**(len(item))) novafila.enfileirar(save) else: novafila.enfileirar(item) return novafila
def analise_sintatica(expressao): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ expressao=analise_lexica(expressao) fila2=Fila() if len(expressao)!=0: for i in expressao: if i in set("{}[]()/+-*") or i in set("0123456789") : fila2.enfileirar(i) #elif i not in set("."): # fila2.enfileirar(float(i)) else: fila2.enfileirar(i) return fila2 else: raise ErroSintatico()
def test_float(self): fila = Fila() fila.enfileirar('1234567890') fila.enfileirar('.') fila.enfileirar('4') fila_sintatica = analise_sintatica(fila) self.assertEqual(1234567890.4, fila_sintatica.desenfileirar()) self.assertTrue(fila_sintatica.vazia())
def analise_sintatica(fila): #PRONTO PORÉM GRANDE """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ fila2 = Fila() car='' if (len(fila) == 0): raise ErroSintatico('erro') while (len(fila)!=0): c = fila.desenfileirar() if c in ('+-*/(){}[]'): if len(car)!=0: if '.' in car: fila2.enfileirar(float(car)) car = '' else: fila2.enfileirar(int(car)) car = '' fila2.enfileirar(c) else: car = car + c if len(car)>0: if '.' in car: car = float(car) else: car = int(car) fila2.enfileirar(car) return fila2
def analise_sintatica(fila): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ novafila = Fila() if fila.vazia(): raise ErroSintatico; save = '' while not fila.vazia(): item = fila.desenfileirar() if num(item): save = int(item) if fila.vazia(): novafila.enfileirar(save) return novafila if fila.primeiro() != '.': novafila.enfileirar(save) elif item == '.': item = fila.desenfileirar() save = float(save) save += (float(item)) / (10 ** (len(item))) novafila.enfileirar(save) else: novafila.enfileirar(item) return novafila
def analise_sintatica(fila): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ fil = Fila() char = "" if len(fila) == 0: raise ErroSintatico("erro") while (len(fila) != 0): df = fila.desenfileirar() if df in set("-+*/()[]{}"): if len(char) > 0: if "." in char: fil.enfileirar(float(char)) char = "" else: fil.enfileirar(int(char)) char = "" fil.enfileirar(df) else: char = char + df if len(char) != 0: if "." in char: char = float(char) else: char = int(char) fil.enfileirar(char) return fil pass
def analise_lexica(expressao): """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ def caracteres(param1): return param1 in "(){.}[]+-*/" fila = Fila() count = 0 pilha = Pilha() while count != len(expressao): if not (caracteres(expressao[count]) or num(expressao[count])): raise ErroLexico else: if caracteres(expressao[count]): if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) fila.enfileirar(expressao[count]) if num(expressao[count]): if pilha.vazia(): pilha.empilhar(expressao[count]) else: final = pilha.desempilhar() pilha.empilhar(final + expressao[count]) count += 1 if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) return fila
def analise_lexica(expressao): """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ fila = Fila() # numeros e tokens nt = r"0123456789.-+*/{}[]()" if expressao: valor = "" for i in expressao: if i in nt: if i in ".-+*/{}[]()": if valor: fila.enfileirar(valor) valor = "" fila.enfileirar(i) else: valor = valor + i else: raise ErroLexico() if valor: fila.enfileirar(valor) return fila
def analise_lexica(expressao): """ A função analisa um expreção e diz se está conforme os parametros passados,logo a função verifica se contem um caracter que nao seja alguns desses "0123456789.-+*/{}[]()" Tempo de execução O(n) Espaço de memoria O(n) :param expressao: recebe a expressao a ser analisada :return: fila com os caracteres indesejados """ fila = Fila() correto = R"0123456789.-+*/{}[]()" if expressao: valor = '' for n in expressao: if n in correto: if n in '(){}[].*/-+': if valor: fila.enfileirar(valor) valor = '' fila.enfileirar(n) else: valor = valor + n else: raise ErroLexico() if valor: fila.enfileirar(valor) return fila
def analise_lexica(expressao): fila = Fila() char = "" if len(expressao): for k in expressao: if k in ("1234567890"): char = char + k elif k in ("()[]{}-+*/."): if len(char) != 0: fila.enfileirar(char) char = "" fila.enfileirar(k) else: raise ErroLexico("Erro") if len(char) > 0: fila.enfileirar(char) return fila """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ pass
def analise_sintatica(fila): tokens = Fila () numValor = 0 point = False if len(fila) > 0: for elemento in fila: if elemento in set('{[()]}+-*/'): if not numValor == 0: tokens.enfileirar(numValor) numValor = 0 tokens.enfileirar(elemento) point = False else: if elemento == '.': point = True else: valor = float(elemento) if point: numValor += (valor / 10 ** len (elemento)) else: numValor += valor if not numValor == 0: tokens.enfileirar(numValor) return tokens else: raise ErroSintatico ('')
def analise_lexica(expressao): #PRONTO PORÉM FEIO """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ car = '' fila = Fila() if len(expressao): for c in expressao: if c in ('1234567890'): car = car+c elif c in ("+-*/(){}[]."): if len(car)!=0: fila.enfileirar(car) car = '' fila.enfileirar(c) else: raise ErroLexico('erro') if len(car)>0: fila.enfileirar(car) return fila
def analise_lexica(expressao): def caracteres(param1): return param1 in "(){.}[]+-*/" fila=Fila() count=0 pilha=Pilha() while count!=len(expressao): if not(caracteres(expressao[count]) or num(expressao[count])): raise ErroLexico else: if caracteres(expressao[count]): if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) fila.enfileirar(expressao[count]) if num(expressao[count]): if pilha.vazia(): pilha.empilhar(expressao[count]) else: final=pilha.desempilhar() pilha.empilhar(final+expressao[count]) count+=1 if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) return fila
def analise_lexica(expressao): fila=Fila() num="" if len(expressao): for t in expressao: if t in set("0123456789"): num=num+t else: if len(num)>0: fila.enfileirar(num) num="" if t in set("{}[]()/+-*."): fila.enfileirar(t) else: raise ErroLexico("Erro Léxico") if not len(num)==0: fila.enfileirar(num) return fila """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ pass
def analise_sintatica(fila): especiais = '+-*/(){}[]' filaObjeto = Fila() caracter = '' if not(len(fila)): raise ErroSintatico('') while len(fila): atual = fila.desenfileirar() if atual in especiais: if len(caracter):#Verificanto se é int ou float if '.' not in caracter: filaObjeto.enfileirar(int(caracter)) else: filaObjeto.enfileirar(float(caracter)) caracter = '' filaObjeto.enfileirar(atual) else: caracter += atual if len(caracter): if '.' not in caracter: caracter = int(caracter) else: caracter = float(caracter) filaObjeto.enfileirar(caracter) return filaObjeto
def analise_sintatica(fila): novafila=Fila() if fila.vazia(): raise ErroSintatico; save='' while not fila.vazia(): item=fila.desenfileirar() if num(item): save=int(item) if fila.vazia(): novafila.enfileirar(save) return novafila if fila.primeiro()!='.': novafila.enfileirar(save) elif item=='.': item=fila.desenfileirar() save=float(save) save+=(float(item))/(10**(len(item))) novafila.enfileirar(save) else: novafila.enfileirar(item) return novafila
def analise_lexica(expressao): """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ numeros= ["0123456789"] numeros2=["0","1","2","3","4","5","6","7","8","9" ] ponto =['.'] operacao=["+-*/"] simbolos=["()[]{}"] letras=["abcdefghijklmnopqrstuvxz"] fila = Fila() for i in expressao: if expressao == '': fila.vazia() else: for j in i: if j in set(numeros)and j in set(ponto) and j in set(operacao) and j in set(simbolos): fila.enfileirar(j) fila.enfileirar(ponto) elif j not in set(letras): fila.enfileirar(j) else: raise ErroLexico return fila
def analise_lexica(expressao): fila = Fila() especiais = '{[()]}+-*/.' quant = '' alfabeto = 'abcdefghijklmnopqrstuvwxyz' sequenciaNumerica = '0123456789' for caracter in expressao: if caracter in especiais: if len(quant): fila.enfileirar(quant) quant = '' fila.enfileirar(caracter) if caracter in set(sequenciaNumerica): quant = quant + caracter if caracter in set(alfabeto) or caracter == '': raise ErroLexico('') if len(quant): fila.enfileirar(quant) return fila
def analise_lexica(expressao): fila = Fila() token = R"0123456789.-+*/{}[]()" token2 = R".-+*/{}[]()" if expressao: num = '' for lex in expressao: if lex in token: if lex in token2: if num: fila.enfileirar(num) num = '' fila.enfileirar(lex) else: num = num + lex else: raise ErroLexico() if num: fila.enfileirar(num) return fila
def analise_lexica(expressao): letras = 'abcdefghijklmnopqrstuvwxyz' operadores = '+-*/' fila = Fila() num = '0123456789' numVar = '' for letra in expressao: if letra == '': raise ErroLexico ('') if letra in set(letras): raise ErroLexico ('') if letra in '{[()]}+-*/.': if len(numVar) > 0: fila.enfileirar(numVar) numVar = '' fila.enfileirar(letra) if letra in set(num): numVar += letra if len(numVar) > 0: fila.enfileirar(numVar) return fila
def analise_sintatica(fila): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ num=0 ponto=False tokens=Fila() if len(fila)>0: for t in fila: if t in set("{}[]()/+-*"): if not num==0: tokens.enfileirar(num) num=0 tokens.enfileirar(t) ponto=False else: if t in ("."): ponto=True else: val=int(t) if ponto: num=num+(val/10**len(t)) else: num=num+val if not num==0: tokens.enfileirar(num) return tokens else: raise ErroSintatico("erro")
def analise_sintatica(expressao): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ expressao = analise_lexica(expressao) fila2 = Fila() if len(expressao) != 0: for i in expressao: if i in set("{}[]()/+-*") or i in set("0123456789"): fila2.enfileirar(i) #elif i not in set("."): # fila2.enfileirar(float(i)) else: fila2.enfileirar(i) return fila2 else: raise ErroSintatico()
def analise_sintatica(fila): """ Analisa a fila e diz se está sintatica ou nao. Tempo de execução O(n) Espaço de memoria O(n) :param expressao: fila a ser analisada :return: fila """ if len(fila): fila_sintetica = Fila() valor = '' for n in range(len(fila)): if fila._deque[n] in '-+/*(){}[]': if valor: if '.' in valor: fila_sintetica.enfileirar(float(valor)) else: fila_sintetica.enfileirar(int(valor)) valor = '' fila_sintetica.enfileirar(fila._deque[n]) else: valor = valor + fila._deque[n] if valor: if '.' in valor: fila_sintetica.enfileirar(float(valor)) else: fila_sintetica.enfileirar(int(valor)) return fila_sintetica else: raise ErroSintatico
def analise_sintatica(fila): token = R"-+/*(){}[]" if fila.__len__(): fila_sintatica = Fila() num = '' num2 = '.' for lex in range(fila.__len__()): if fila._deque[lex] in token: if num: if num2 in num: fila_sintatica.enfileirar(float(num)) else: fila_sintatica.enfileirar(int(num)) num = '' fila_sintatica.enfileirar(fila._deque[lex]) else: num = num + fila._deque[lex] if num: if num2 in num: fila_sintatica.enfileirar(float(num)) else: fila_sintatica.enfileirar(int(num)) return fila_sintatica else: raise ErroSintatico
def analise_sintatica(fila): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ if fila.__len__(): # Cria um novo objeto fila para adicionar os valores fila_sintetica = Fila() # Variavel de apoio para juntar a string valor = "" for i in range(fila.__len__()): if fila._deque[i] in "-+/*(){}[]": if valor: if "." in valor: fila_sintetica.enfileirar(float(valor)) else: fila_sintetica.enfileirar(int(valor)) valor = "" fila_sintetica.enfileirar(fila._deque[i]) else: valor = valor + fila._deque[i] if valor: if "." in valor: fila_sintetica.enfileirar(float(valor)) else: fila_sintetica.enfileirar(int(valor)) return fila_sintetica else: raise ErroSintatico
def test_int(self): fila = Fila() fila.enfileirar("1234567890") fila_sintatica = analise_sintatica(fila) self.assertEqual(1234567890, fila_sintatica.desenfileirar()) self.assertTrue(fila_sintatica.vazia())
def test_fila_vazia(self): fila = Fila() self.assertRaises(ErroSintatico, analise_sintatica, fila)