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())
예제 #2
0
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
예제 #4
0
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
예제 #5
0
 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())
예제 #6
0
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
예제 #7
0
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
예제 #9
0
 def test_fila_vazia(self):
     fila = Fila()
     self.assertRaises(ErroSintatico, analise_sintatica, fila)