Comparar arrays em java

1 resposta
java
G

Olá boa noite, sou iniciante em programação java, e em um projeto ta faculdade o professor pediu para fazer um analisador lexico. Estou tendo dificuldade em fazer as comparações entre os arrays para determinar se uma palavra é reservada ou não. Gostaria de uma ajuda para resolver este problema. Obrigado.

Segue o codigo do programa:

package compilador;

import java.util.<em>;

import <a href="http://java.io">java.io</a>.</em>;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Lexico {

public static void main(String args[]) throws IOException {

    String entrada;

    int tam = 0;

    String[] reservadas = {"begin", "end", "int", "String"};
    String[] operadores = {"+", "-", "/", "*"};
    String[] separadores = {" ", "'", "\"", ",", ".", ";"};

    String aux1 = "";
    String aux2 = "";
    Scanner scanf = new Scanner(System.in);

    ArrayList<String> guardatxt = new ArrayList<String>();
    String guardastring = "";

    try {
        Reader read = new FileReader("C:\\Users\\aluno.COMPUTACAO\\Desktop\\Nova pasta\\teste.txt");
        BufferedReader buffer = new BufferedReader(read);

        while (buffer.ready()) {
            guardastring += buffer.readLine();
        }

        for (int i = 0; i < guardastring.length(); i++) {
            StringBuilder str1 = new StringBuilder();

            if (Character.isLetterOrDigit(guardastring.charAt(i))) {
                str1.append(guardastring.charAt(i));
                i++;
               
                while (Character.isLetterOrDigit(guardastring.charAt(i))) {
                    str1.append(guardastring.charAt(i));
                    i++;
                    
                    if(i == guardastring.length()){
                    break;
                    }
                    
                }

            } else if (Character.isWhitespace(guardastring.charAt(i))) {
                continue;
            } else {
                str1.append(guardastring.charAt(i));
            }

            guardatxt.add(str1.toString());
          
        }

    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexico.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    for(int i =0; i < guardatxt.size()-1 ;i++){
        
        for(int j = 0;j <reservadas[j].length()-1; j++){
            
             if(reservadas[j].equals(guardatxt.get(i))){
            
                System.out.println("é reservada: "+ reservadas[j]); 
                
            }else{
                 
                 System.out.println("é variavel ");
                 
             }}
    }
    
}

}

1 Resposta

F

@Gracocrz vi a sua solução e é bem comum no início fazermos o código tudo no início. O que eu te aconselharia é o seguinte:

1 - Deixar dentro da sua classe public static void main apenas a leitura das linhas.
2 - Criar métodos para cada tipo reservadas operadores e separadores
3 - Trate uma linha por vez e ponha a apresentação da mensagem de erro dentro dos métodos que criou.

Sei que de início e bem complexo, entender. Vou tentar deixar um exemplo aqui e qualquer coisa você fala.

Deixei alguns métodos para você implementar.

EXEMPLO:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Lexico {
	//Criarndo variáveis globais (opcional. Você tambem pode colocar dentro de cada método)
	 static String[] reservadas = {"begin", "end", "int", "String"};
	 static String[] operadores = {"+", "-", "/", "*"};
	 static String[] separadores = {" ", "'", "\"", ",", ".", ";"};
	 
	 static String linhaAtual;

	public static void main(String args[]) throws IOException {
		BufferedReader buffer = null;
		try {
	        Reader read = new FileReader("C:\\Users\\aluno.COMPUTACAO\\Desktop\\Nova pasta\\teste.txt");
	        buffer = new BufferedReader(read);
	        
	        //Lendo linha a linha
	        while(buffer.ready()){
	        	 linhaAtual = buffer.readLine(); 
	        	//Chamar o método de palavras reservadas
	        	funcaoReservadas(linhaAtual);
	        	//Chama o método para operadores
	        	funcaoOperadores(linhaAtual);
	        	//Chama o método para separadores
	        	funcaoSeparadores(linhaAtual);
	        }
	        
	        //Lanco um erro caso o arquivo nao senha encontrado!
	        }catch(NullPointerException e){
	        	System.out.println("Ops! O arquivo não foi encontrado!");
	        //Lanco um erro generico por conta de quaisquer outros erros
	        }catch(IOException e){
	        	System.out.println("Ops! Algum outro erro aconteceu!");
	        }finally{
	        	//Verifico se o buffer nao e nulo pois, como o finally sempre e executado, pode ocorrer
	        	//algum problema no programa e o mesmo continuar com seu valor inicial, nulo. Isso poderia
	        	//causar mais confusão na investigação de um erro
	        	if(buffer != null) buffer.close();
	        }
	}

	private static void funcaoSeparadores(String readLine) {
		System.out.println("\n--- Analizando os Separadores ---");
		//Crio um array com todas as palavras da linha lido
		String[] linhaAtual = readLine.split(" ");
		int quantidadeEncontrado = 0;
		//faco um loop para interagir com cada caracter
		for(int i = 0 ; i < linhaAtual.length ; i++){
			//lanco o caracter tratado no momento para outra funcao assim, deixa o codigo mais limpo
			//e simples de entender
			if(containsFuncao(linhaAtual[i],separadores)){
				//caso seja encontrado o caracter, será apresentada a mensagem abaixo e o contador será acrescido
				quantidadeEncontrado++;
				System.out.println("Encontrado o SEPARADOR => "+linhaAtual[i]);
			}
		}
		//Apresenta o resultado final
		System.out.println("--------------------------------------");
		System.out.println("Quantidade de SEPARADORES encontrados = " + quantidadeEncontrado);
		
	}

	private static void funcaoOperadores(String readLine) {
		// TODO Trata tudo referente a operadores aqui!
		
	}

	private static void funcaoReservadas(String readLine) {
		// TODO Trata tudo referente a reservadas aqui!
		
	}
	
	private static boolean containsFuncao(String caracterAtual,String[] comparadores) {
		boolean contain = false;
		for(int i = 0 ; i < comparadores.length ; i++){
				if(caracterAtual.contains(comparadores[i].toString())){
					contain = true;
				}
		}
		return contain;
	}
}
Criado 5 de abril de 2016
Ultima resposta 5 de abr. de 2016
Respostas 1
Participantes 2