Lendo palavra por palavra de um JTextArea

6 respostas
FabricioPJ

Olá a todos. Estou tentando fazer um projeto para a faculdade que, entre outras coisas, deve ler palavra por palavra de um JTextArea. Só que só estou conseguindo ler a 1º palavra... Vejam o código:

String[] pascal = {"begin", "end", "read", "write"}; 

String palavrasCampo = campo.getText();
for(int i = 0; i <= pascal.length; i++){
       if(palavrasCampo.equals(pascal[i])){
             JOptionPane.showMessageDialog(null, "Compilado");
       }
break;

}

O que esse código deveria fazer: Amazenar o conteúdo do JTextArea "campo" dentro da String "palavrasCampo". Feito isso, dentro do for, deve-se ser comparado tudo que foi digitado com o array de String "pascal".

Só que só funciona quando eu digito a 1º palavra do array... no caso "begin". Se eu digitar "begin", der Enter, e digitar "end", não funciona.

Onde estou errando?

Grato pela atenção.

6 Respostas

rafachies

Cara, se eu entendi o seu problema, você está errando ao comparar cada indice do seu vetor “pascal” como todo o conteúdo existente no seu textarea diretamente.
Pegue o seu textarea e quebre o seu conteudo palavra por palavra, ai vc faz um “for” dentro de outro “for” fazendo a combinacao de todas as palavras do vetor e do textarea.

Mais ou menos assim…

palavrasDoTextArea = campo.quebrarEmPalavras() para cada palvra do vetor pascal para cada palavra do vetor palavrasDoTextArea se palavraDoPascal == palavraDoTextArea JOptionPane.showMessageDialog(null, "Compilado");

FabricioPJ

Obrigado pela dice. Entendi e apliquei o que você me indicou, e o resultado já melhorou.

Veja o novo código:

String[] pascal = {"begin", "end", "read", "write"}; String x = campo.getText(); String[] novoX = x.split("\s"); for(int j = 0; j < pascal.length; j++){ for(int i = 0; i < novoX.length; i++){ if(pascal[j].equals(novoX[i])) JOptionPane.showMessageDialog(null, "Compilado!!!"); else JOptionPane.showMessageDialog(null, "Não compilado!!!"); break; } break; }

Agora se eu digitar:

begin write read end

…o programa compila corretamente, mas se eu colocar uma palavra maluca que não foi declarada em nenhum array, o programa também compila.
Outra sugestão será bem-vinda

rafachies

Cara…tente inverter a ordem dos “for’s” …colque primeiro o que itera nas palavras retiradass do textarea, e no segundo (“for” interno) coloque o das palavras chaves (vetor pascal).
Pois, pelo que entendi, voce quer pegar todas palavras digitadas por um individuo (primeiro “for”) e comparar elas com cada palavra do vetor de palavras reservadas (segundo for).

=o)

[]'s

GustavoLaguna

Exato!

Assim a cada palavra do TextArea voce irá percorrer o de palavras “restritas” do seu array pascal, caso a palavra não esteja lá, vai voltar “não compilado”.

FabricioPJ

Valeu pessoal… Quando sair do trabalho, irei testar isso.

Muito obrigado.

maior_abandonado

olha kra…

a algum tempo eu fiz um analisador lexico (o que acredito que vc esteja fazendo), e tive problemas com o split…

digitando varias vezes o espaço por exemplo, (se eu bem melembro) ele separava o primeiro espaço e botava os proximos na proxima palavra, o mesmo com o enter ou os outros separadores que devem determinar que terminou a palavra…

o que eu fiz foi algo assim:

primeiro determinar quais são os caracteres que devem fazer uma palavra terminar:

espaço
\n
operadores (matematicos, logicos, atribuição e comparação) + - * / = == && || …enfim…

se vc ta fazendo de pascal procure o q mais tem…no meu caso eu tava fazendo de portugues estruturado…

tendo isso em mãos, euaconselho vc a pegar o conteudo do jtextarea inteiro e:

cria um inteiro comecoToken=0;

bota num for = suaString.length()

ir lendo cada caractere da sua String e ver se é igual a um dos separadores anteriormente falados

se for vc marca em um array de tokens a substring de comecoToken até o caractere atual, e seta o comecoToken igual ao indice da proxima letra

bom…ai vc vai ter umas complicações, como por exemplo dois separadores seguidos tb (2 espaços por exemplo, ao pega o primeiro vc vai por o comecoToken no segundo, eu resolvi isso com um outro loop dentro desse de ver cada caractere, verificando se o proximo caractere é um separador tb e se não for, eu ponho ocomecotoken la, caso contrario eu subo um caractere denvoo)

bom…mesmo o lexico ja é um belo tanto complicado, vc tendo uma boa base de automatos o sintatico não fica “tão” mais complicado assim… boa sorte…

Criado 19 de abril de 2008
Ultima resposta 28 de abr. de 2008
Respostas 6
Participantes 4