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_lexica(expressao): def digitos(param): return param in "(){.}[]+-*/" """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais digitos são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ cont = 0 fila = Fila() pilha = Pilha() while cont != len(expressao): if not (digitos(expressao[cont]) or numero(expressao[cont])): raise ErroLexico elif digitos(expressao[cont]): if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) fila.enfileirar(expressao[cont]) if numero(expressao[cont]): if pilha.vazia(): pilha.empilhar(expressao[cont]) else: final = pilha.desempilhar() pilha.empilhar(final + expressao[cont]) cont = cont + 1 if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) return fila
def analise_lexica(expressao): """ Executa analise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres sao validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ conta = Fila() adicionar = '' for pedacoExpressao in expressao: for i in pedacoExpressao: if i != '1' and i != '2' and i != '3' and i != '4'and i != '5'and i != '6'and i != '7'and i != '8' and i != '9'and i != '0'and \ i != '(' and i != ')' and i != '[' and i != ']'and i != '{'and i != '}'and i != '+'and i != '-' and i != '*'and i != '/'and \ i != '.': raise ErroLexico if i not in '()[]{}/*-+.': adicionar+=i else: if adicionar!= '': conta.enfileirar(adicionar) conta.enfileirar(i) adicionar = '' if adicionar!='': conta.enfileirar(adicionar) return conta
def analise_lexica(expressao): def digitos(param): return param in "(){.}[]+-*/" """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais digitos são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ cont = 0 fila = Fila() pilha = Pilha() while cont != len(expressao): if not (digitos(expressao[cont]) or numero(expressao[cont])): raise ErroLexico elif digitos(expressao[cont]): if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) fila.enfileirar(expressao[cont]) if numero(expressao[cont]): if pilha.vazia(): pilha.empilhar(expressao[cont]) else: final = pilha.desempilhar() pilha.empilhar(final + expressao[cont]) cont= cont + 1 if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) return fila
def analise_sintatica(fila): novafila = Fila() if fila.vazia(): raise ErroSintatico guard = '' while not fila.vazia(): item = fila.desenfileirar() if numero(item): guard = int(item) if fila.vazia(): novafila.enfileirar(guard) return novafila if fila.primeiro() != '.': novafila.enfileirar(guard) else: if item == '.': item = fila.desenfileirar() guard = float(guard) guard += (float(item)) / (10**(len(item))) novafila.enfileirar(guard) else: novafila.enfileirar(item) return novafila
def analise_sintatica(fila): novafila = Fila() if fila.vazia(): raise ErroSintatico; guard = '' while not fila.vazia(): item = fila.desenfileirar() if numero(item): guard = int(item) if fila.vazia(): novafila.enfileirar(guard) return novafila if fila.primeiro() != '.': novafila.enfileirar(guard) else: if item == '.': item = fila.desenfileirar() guard = float(guard) guard += (float(item)) / (10 ** (len(item))) novafila.enfileirar(guard) else: novafila.enfileirar(item) return novafila
def analise_sintatica(fila): """ Funcao que realiza analise sintatica de tokens produzidos por analise lexica. Executa validacoes sintaticas e se nao houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de analise lexica :return: fila_sintatica com elementos tokens de numeros """ fila = analise_lexica(e for e in fila) if fila.vazia(): raise ErroSintatico conta = Fila() numero = '' for token in fila: if token in '(){}[]/*-+': if '.' in numero: conta.enfileirar(float(numero)) elif numero!='': conta.enfileirar((int(numero))) conta.enfileirar(token) numero = '' elif token == '.': numero+=token else: numero+=token if '.' in numero: conta.enfileirar(float(numero)) elif numero != '': conta.enfileirar(int(numero)) return conta
def test_fila_vazia(self): fila = Fila() self.assertRaises(ErroSintatico, analise_sintatica, fila)