Пример #1
0
    def __init__(self, producoes, nao_terminais, terminais, simbolo_inicial):
        """
    Construtor
    @param producoes: conjunto de producoes da gramatica.
    @param nao_terminais: conjunto de nao terminais (Vn).
    @param terminais: conjunto de terminais (Vt).
    @param simbolo_inicial: simbolo inicial da gramatica (S).
    @attention: Sao inseridos espacos nas producoes para manter compatibilidade com as demais gramaticas
                que necessitam de espacos entre os nao-terminais e terminais para resolver ambiguidades e realizar 
                verificacoes. Os espacos depois sao removidos pois nao eh necessario espaco para resolver ambiguidades 
                jah que gramaticas regulares soh podem comecar com UM terminal que pode ser seguido de UM nao-terminal.
    """
        GramaticaLivreContexto.__init__(
            self, self.__obter_producoes_com_separador(producoes), nao_terminais, terminais, simbolo_inicial
        )
        self.__remover_separador_producoes()
        self.__verificar_epsilon_producoes()

        for prod in self._producoes:
            beta = prod.obterBeta()
            alpha = prod.obterAlpha()

            if not alpha in nao_terminais:
                raise ErroConstruindoGramaticaRegular("Producao [{0}] invalida!!".format(str(prod)))

            if not beta[0] in self._terminais:
                if beta[0] != EPSILON:
                    raise ErroConstruindoGramaticaRegular("Producao [{0}] invalida!!".format(str(prod)))

            if len(beta) >= 2:
                if not beta[1:] in self._nao_terminais:
                    raise ErroConstruindoGramaticaRegular("Producao [{0}] invalida!!".format(str(prod)))
 def testDadoUmTerminalSeEleNaoExisteNaGramaticaOFirstRetornaNone(self):
   vn = set(['S'])
   vt = set(['a', 'b'])
   s = 'S'
 
   producoes = set()
   producoes.add(Producao('S', 'a b'))
   glc = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(None, glc.obterFirst('c'))
   self.assertEqual(None, glc.obterFirst('d')) 
 def testDadoUmaProducaoDaGramaticaSabeInformarQuaisSaoOsNaoTerminaisExistentesNoBeta(self):
   vn = set(['S', 'V'])
   vt = set(['a', 'b', 'c'])
   s = 'S'
 
   producoes = set()
   producoes.add(Producao('S', 'a S V b'))
   producoes.add(Producao('S', EPSILON))
   
   glc1 = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(set(['S','V']), glc1.obterNaoTerminaisDoBeta(Producao('S', 'a S V b')))
 def testDadoUmaProducaoQueNaoEhDaGramaticaRetornaNoneAoTentarObterNaoTerminaisDoBeta(self):
   vn = set(['S', 'V'])
   vt = set(['a', 'b', 'c'])
   s = 'S'
 
   producoes = set()
   producoes.add(Producao('S', 'a S V b'))
   producoes.add(Producao('S', EPSILON))
   
   glc1 = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(None, glc1.obterNaoTerminaisDoBeta(Producao('S', 'S V b')))
 def testDadoUmaProducaoDaGramaticaSeNaoPossuiNaoTerminaisNoBetaRetornaVazioAoTentarObtelos(self):
   vn = set(['S', 'V'])
   vt = set(['a', 'b', 'c'])
   s = 'S'
 
   producoes = set()
   producoes.add(Producao('S', 'a S V b'))
   producoes.add(Producao('S', EPSILON))
   
   glc1 = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(set(), glc1.obterNaoTerminaisDoBeta(Producao('S', EPSILON)))
 def testCriaUmaCopiaDoConjuntoDeProducoesInformados(self):
   vn = set(['S', 'V'])
   vt = set(['a', 'b', 'c'])
   s = 'S'
   producoes = set()
   producoes.add(Producao('S', 'a V c a b V'))
   producoes.add(Producao('V', 'b'))
   g1 = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(producoes, g1.obterProducoes())
   producoes.pop()
   self.assertNotEqual(producoes, g1.obterProducoes())
 def testSabeQuaisNaoTerminaisDerivamEpsilonDiretamente(self):
   vn = set(['S'])
   vt = set(['a', 'b'])
   s = 'S'
 
   producoes = set()
   producoes.add(Producao('S', 'a S b'))
   producoes.add(Producao('S', EPSILON))
   producoes.add(Producao('S', 'b S a'))
   
   glc = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(set(['S']), glc.obterNaoTerminaisQueDerivamEpsilon())
 def testDadoUmNaoTerminalQueNaoExisteNaGramaticaSeTentarObterProducoesRetornaConjuntoVazio(self):
   vn = set(['S', 'V'])
   vt = set(['a', 'b', 'c'])
   s = 'S'
   producoes_s = set([Producao('S', 'a V'), Producao('S', 'b')])
   producoes_v = set([Producao('V', 'a S'), Producao('V', 'c')])
   producoes = set()
   producoes.update(producoes_s)
   producoes.update(producoes_v)
   
   gramatica = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(set(), gramatica.obterProducoesDoAlpha('T'))
 def testDadoUmNaoTerminalSabeQuaisSaoAsProducoesDesseNaoTerminal(self):
   vn = set(['S', 'V'])
   vt = set(['a', 'b', 'c'])
   s = 'S'
   producoes_s = set([Producao('S', 'a V'), Producao('S', 'b')])
   producoes_v = set([Producao('V', 'a S'), Producao('V', 'c')])
   producoes = set()
   producoes.update(producoes_s)
   producoes.update(producoes_v)
   
   gramatica = GramaticaLivreContexto(producoes, vn,vt,s)
   self.assertEqual(producoes_s, gramatica.obterProducoesDoAlpha('S'))
   self.assertEqual(producoes_v, gramatica.obterProducoesDoAlpha('V'))