Ir para conteúdo
Fórum Script Brasil
  • 0

Analisador Léxico


kitsune

Pergunta

Tenho um analisador léxico, que deveria pegar um comando SQL padrão para analisar, mas ele não executa do jeito que eu espero, não entendo o que acontece

public class Analise

{

 

  char temporario= ' ';

  String conversor = " ";

 

  public void analisar(String palavra)

  {

  for (int contador = 0; contador<palavra.length(); contador++)

  {

      temporario += palavra.charAt(contador);

        System.out.println("Esta sendo armazenado");

           

    if(palavra.charAt(contador) == ' '||palavra.charAt(contador) == ';'|| palavra.charAt(contador)== ',')

    {

     

      System.out.println("Dentro da condição a palavra também está sendo armazenada");

      conversor = String.valueOf(temporario);

      System.out.println("Foi convertido para String");

     

      AutomatoTeste teste = new AutomatoTeste();

            teste.possui(palavra);

    }

    }

  }

  public static void main(String args[])

  {

  Analise analise = new Analise();

  analise.analisar("select;");

  }

  }

O meu problema é que ao usar o ";" ou espaço em branco, ou ", " ele armazena junto com a palavra e o meu Automato não reconhece haja visto que ele só reconhece letras e dígitos, mas não espaços em branco e pontuação, mas este espaço em branco deveria fazer com que ao chegar nele, deveria-se tipo assim, pular e depois armazenar o ponto como uma nova palavra, uma outra palavra qualquer, mas outro problema é que ele não parte as palavras e daí reconhece como se ao digitar duas palavras ele reconhecesse uma só e por isso o autômato mais uma vez não reconhece, acho até que é o mesmo problema com relação a pontuação, será que podem me ajuda?

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Uma verificação do tipo...

    if(palavra.charAt(contador) == ' '||palavra.charAt(contador) == ';'|| palavra.charAt(contador)== ',')
... não deveria vir antes de...
temporario += palavra.charAt(contador);

... ? unsure.gif

Pois, do jeito que está, o caracter está sendo concatenado ao "temporario" indiscriminadamente. Ou seja, ele está adicionando o ";" ao temporário e só depois verificando se o caracter atual é o ";". Sacou? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Olha só, tenho esse código que resolve parcialmente os meus problemas

public class AnaliseTeste

{

    public void analisar(String comando)

    {

        AutomatoTeste teste = new AutomatoTeste();

       

        String temporario = "";

        for (int contador = 0; contador<comando.length(); contador++)

        {

        char ch = comando.charAt(contador);

           

            if(ch == ' '||ch == ';'|| ch == ',')

            {

                if (temporario.length() > 0)

                    teste.possui(temporario);

                if (ch != ' ')

                    teste.possui(Character.toString(ch));

                temporario = "";

            }

            else

                temporario += ch;

        }

        if (temporario.length() > 0)

            teste.possui(temporario);

    }

    public static void main(String args[])

    {

        AnaliseTeste analise = new AnaliseTeste();

       

        analise.analisar("select coluna Afrom tabela;");

    }

}

O código funciona, mas não analisa todo o comando, eu não entendo o porque, ele só pega a primeira palavra, mas analisa, podem me ajudar? ohmy.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz um teste assim:

public class AnaliseTeste
{
    public void analisar(String comando)
    {
        // AutomatoTeste teste = new AutomatoTeste();
       
        String temporario = "";
        for (int contador = 0; contador<comando.length(); contador++)
        {
        	char ch = comando.charAt(contador);
           
            if(ch == ' '||ch == ';'|| ch == ',')
            {
                if (temporario.length() > 0)
                    // teste.possui(temporario);
                    System.out.println(temporario);
                    
                if (ch != ' ')
                    // teste.possui(Character.toString(ch));
                    System.out.println(Character.toString(ch));
                temporario = "";
            }
            else
                temporario += ch;
        }
        if (temporario.length() > 0)
            // teste.possui(temporario);
            System.out.println(temporario);
    }
    public static void main(String args[])
    {
        AnaliseTeste analise = new AnaliseTeste();
       
        analise.analisar("select coluna Afrom tabela;");
    }
}

E vi que ele escreve todas as palavras. Ou seja, ele está obtendo todas corretamente. Nesse caso, o problema não poderia estar em AutomatoTeste?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Se tu quiseres eu mando a classe, mas vou logo avisando ela só analisa uma palavra de cada vez, eu já testei e ela não só valida palavras pertencentes a tabela de símbolos como também valida palavras do dicionario de palavras reservadas.

Valeu sad.gifbiggrin.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Olha só mais uma coisa, sobre a classe AnaliseTeste, eu não entendo o porquê que ela não envia uma palavra de cada vez para a classe automato, eu queria que funcionasse de modo a enviar uma palavra de cada vez, já que meu automato reconhece uma de cada vez, tipo, se eu tenho um comando deste tipo: "SELECT COLUNA FROM TABELA;"

Eu não deveria criar um laço while, que dissesse que enquanto o contador fosse menor que o tamanho da palavra a ser analisada, deveria-se armazena-la e quando encontrasse espaços em branco, deveria-se verificar se há a incidência de uma virgula que foi armazenada junto com a palavra ou ponto-e-virgula.

Quando isso acontecesse eu deveria colocar apenas a o que estiver antes do ponto em uma String e o ponto em outra String diferente.

Daí uma de cada vez poderia ser analisada pelo automato eu pensei no seguinte algoritmo, mas não sei se dá certo:

public class Teste

{

public void testar(String texto)

{

  int i = 0;

  String receptora = " ";

  String palavra = " ";

  String ponto = " ";

  AutomatoTeste automato = new AutomatoTeste();

  while(i<texto.length())

  {

  receptora+=String.valueOf(texto.charAt(i));

  if(texto.charAt(i)==' ')

  {

    if(receptora.substring(receptora.length()-1)==";")

    {

    palavra=receptora.substring(0,receptora.length()-2);

    automato.possui(palavra);

    palavra = " ";

    ponto = receptora.substring(receptora.length()-1);

    automato.possui(ponto);

    ponto = " ";

    receptora = " ";

    }

    else

    {

    automato.possui(receptora);

    receptora = " ";

    }

    i++;

  }

  }

}

É mais ou menos assim; aqui eu também mando a classe automatoteste, que envia logo as palavras para a cadeia de tokens.

public class AutomatoTeste

{

int contautomato = 0;

char temporario = ' ';

String simbolo= " ";

String identificador = " ";

String constante = " ";

Dicionario dic = new Dicionario();

Letra let = new Letra ();

Digito dig = new Digito();

TabelaSimbolo tab = new TabelaSimbolo();

Especial caracter = new Especial();

public boolean possui(String palavra)

{

while(contautomato < palavra.length())

{

  temporario = palavra.charAt(contautomato);

  simbolo = String.valueOf(temporario);

 

   

  if(let.existeLetra(simbolo)||caracter.existeCaracter(simbolo))

  {

  identificador+=simbolo;

  System.out.println(identificador);

 

  if(identificador.length()-1 == palavra.length())

  {

  if(dic.existirDicionario(palavra))

  {

  tab.addDicToken(identificador);

    System.out.println("Inseriu como palavraDicionario:"+identificador);

       

    }

   

    else

    {

    tab.adicionarIdentificador(identificador); 

    System.out.println("Inseriu como identificador:" +identificador);

    }

  }

  }

else if(dig.existeDigito(simbolo))

{

  constante+=simbolo;

  System.out.println(constante);

  if(constante.length()== palavra.length())

  {

    tab.adicionarConstante(constante); 

    System.out.println("Inseriu como constante:"+constante);

  }

}

else System.out.println("Não há ocorrencias desta palavra ou caracter");

      temporario = ' ';

      simbolo = " ";

      contautomato++;

  }

 

 

  return true;

}

public static void main(String args[])

{

  AutomatoTeste aut = new AutomatoTeste();

  aut.possui("");

}

}

Eu espero sinceramente a sua ajuda, descobri também que como minha classe automato reconhece uma palavra de cada vez, não posso em um laço tentar verificar se metade de uma palavra é reconhecida pelo automato, porque ele armazena.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...