Jump to content

Criar um compilador em java


sabing
 Share

Recommended Posts

Bom dia pessoal, eu tenho um trabalho de faculdade, que eu devo criar um analisador lexico, eu fiz um programa que criar arquivo .txt e inseri dados no arquivo .txt e le arquivo txt, eu estou com dificuldade em fazer um analisador lexico agora, bom eu crei uma classe para montar uma lista de palavras reservadas usando um arraylist não sei se é o certo, eu estou pensando em ler o arquivo .txt e ve se existe palavra reservada, operadores relacionais,delimitadores,e operadores logicos,e variaveis. bom em baixo eu vou colocar a classe metodo

package comp;

public class Metodos {

   public String Tokens(){

       Atributos sw = new Atributos();
       sw.Tokens.add("programa");
       sw.Tokens.add("se");
       sw.Tokens.add("entao");
       sw.Tokens.add("enquanto");
       sw.Tokens.add("inicio");
       sw.Tokens.add("para");
       sw.Tokens.add("ate");
       sw.Tokens.add("faz");
       sw.Tokens.add("fim");
       sw.Tokens.add("variaveis");
       sw.Tokens.add("inteiro");
       sw.Tokens.add("real");
       sw.Tokens.add("caracter");
       sw.Tokens.add("fimse");
       sw.Tokens.add("escreva");
       sw.Tokens.add("leia");
       sw.Tokens.add("repita");
       sw.Tokens.add("+");
       sw.Tokens.add("-");
       sw.Tokens.add("/");
       sw.Tokens.add("*");
       sw.Tokens.add("<");
       sw.Tokens.add(">");
       sw.Tokens.add("=>");
       sw.Tokens.add("<=");
       sw.Tokens.add("==");
       sw.Tokens.add("<>");
       sw.Tokens.add("e");
       sw.Tokens.add("ou");
       return sw.Tokens.toString();
   }

   public void Analizador(){

   }

}

classe atributo

package comp;

import java.util.ArrayList;

public class Atributos {

   public static String UrlArquivo;
   public String TextoArquivo;
   public int i;
   public ArrayList<String> Tokens = new ArrayList<>();


   public int getI() {
       return i;
   }
   public ArrayList<String> getTokens() {
       return Tokens;
   }
   public void setTokens(ArrayList<String> tokens) {
       Tokens = tokens;
   }
   public void setI(int i) {
       this.i = i;
   }
   public String getUrlArquivo() {
       return UrlArquivo;
   }
   public void setUrlArquivo(String urlArquivo) {
       UrlArquivo = urlArquivo;
   }
   public String getTextoArquivo() {
       return TextoArquivo;
   }
   public void setTextoArquivo(String textoArquivo) {
       TextoArquivo = textoArquivo;
   }


}

classe programa

package comp;

import java.awt.JobAttributes;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class Program extends JFrame{


   private static final long serialVersionUID = 1L;

   public Program() throws IOException{

       Metodos sw = new Metodos();
       Atributos sa = new Atributos();
       File arquivo = new File(Atributos.UrlArquivo);
       String str, txt = "";  
       final JTextArea Texto = new JTextArea();
       JPanel painel = new JPanel();
       JButton BotaoCria = new JButton();
       JButton BotaoSalvar = new JButton();
       JButton BotaoCompilar = new JButton();
       add(painel);
       BotaoCria.setText("Criar");
       BotaoSalvar.setText("Salvar");
       BotaoCompilar.setText("Compilar");
       getContentPane().setLayout(null);
       BotaoSalvar.setBounds(110, 10, 90, 40);
       BotaoCompilar.setBounds(210, 10, 100, 40);
       BotaoCria.setBounds(20,10,80,40);
       getContentPane().add(BotaoCria);
       getContentPane().add(BotaoSalvar);
       getContentPane().add(BotaoCompilar);
       getContentPane().add(Texto);
       Texto.setBounds(20, 60, 400, 400);
       if(arquivo.exists()){
           @SuppressWarnings("resource")
           BufferedReader in = new BufferedReader(new FileReader(Atributos.UrlArquivo));  
           while((str = in.readLine()) != null){
               txt += str+"\n";
               Texto.setText(txt);
           }  
       }
       this.setTitle("Compilador");
       this.setSize(200,300);
       this.setVisible(true);
       this.setDefaultCloseOperation(EXIT_ON_CLOSE);

       BotaoCria.addActionListener (new ActionListener(){       
               public void actionPerformed(ActionEvent e) {
                   try{
                       File arquivo = new File(Atributos.UrlArquivo);

                       if(arquivo.exists()){
                           JOptionPane.showMessageDialog(null, "O arquivo já existe");
                       }else{
                           arquivo.createNewFile();
                           JOptionPane.showMessageDialog(null, "Arquivo criado com sucesso!");
                       }
                   }catch(Exception erro){
                       JOptionPane.showMessageDialog(null, "Houve um erro: "+erro.getMessage());
                   }
               }   
             });  

       BotaoSalvar.addActionListener (new ActionListener(){       
           public void actionPerformed(ActionEvent e) {

               try{
                   FileWriter escrevendo = new FileWriter(Atributos.UrlArquivo);
                   escrevendo.append(Texto.getText());
                   escrevendo.close();
                   JOptionPane.showMessageDialog(null, "Salvo com sucesso!");

               }catch(Exception er){
                   JOptionPane.showMessageDialog(null, "Houve um erro: "+er.getMessage());
               }


           }   
         });

       BotaoCompilar.addActionListener (new ActionListener(){       
           public void actionPerformed(ActionEvent e) {

               try{




                   String str ="";
                   Metodos m = new Metodos();
                   Atributos s = new Atributos();
                   BufferedReader in = new BufferedReader(new FileReader(Atributos.UrlArquivo));

                   while((str=in.readLine())!=null){
                       if(str.equalsIgnoreCase(s.Tokens.get(1))){
                           JOptionPane.showMessageDialog(null, "Achou");
                       }
                   }

                   //for(int i=0;i<m.Tokens().length();i++){
                       //System.out.println(m.Tokens().indexOf(i));
                   //}
                   //System.out.println(m.Tokens());

                   in.close();


               JOptionPane.showMessageDialog(null, "Analizado com sucesso!");
               }
               catch(Exception erro){
                   JOptionPane.showMessageDialog(null,"Houve um erro: "+erro.getMessage());
               }

           }   
         });


   }


   private static void Menu(){
       try{

           Atributos.UrlArquivo = JOptionPane.showInputDialog("Digite o endereço: ");  
           File arquivo = new File(Atributos.UrlArquivo);
           if(arquivo.exists()){
               new Program();
           }else{
               JOptionPane.showMessageDialog(null, "Não existe esse endereço,deve cria-lo antes de salvar e compilar ");
               new Program();
           }

       }
       catch(Exception erro){
           JOptionPane.showMessageDialog(null, "Houve um erro: "+erro.getMessage());
       }
   }

   public static void main(String[] args) {

       Menu();

   }

}

Bom eu estou pensando em ler o arquivo .txt e fazer comparação com a classe Metodos com o metodo Tokens, o problema e que eu não estou conseguindo fazer a comparação usando o arraylist, e seria essa logica mesma?, e como eu vou saber indentificar variaveis?

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

existe uma ideia generalizada que para fazer este tipo de problemas é necessário tomar como primeiro passo o partir todo o conteúdo em tokens.

é muito mais simples fazer uma interpretação do conteúdo por expressões sendo que dessa forma tens uma lista muito restrita dos tokens que deverão aparecer no código (syntactic analysis on the fly ...)

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Já fiz um compilador em C, vais-te divertir à grande x)

para começar há 3 passos fundamentais para criar um compilador:

1) Criar o Lexer

2) Criar o Parser

3) Converter para Binário

(depois podes criar outros mecanismos, como verificação de erros, etc)

---------------------------------------------------------------

No primeiro passo (Lexer) é partires tudo em tokens. Os teus tokens é tudo aquilo que a linguagem suporta. É suposto lá estarem as palavras reservadas, o famoso ";" se a tua linguagem tiver, os operadores matemáticos se a tua linguagem tiver "+" "-", etc...

Para detetares uma variável vai ser algo deste género: [a-zA-Z_]+ , se definires desta forma a tua variável vai poder ser uma sequencia de 'a' até 'z' && 'A' - 'Z' && '_'. O + significa que a sequência tem de ter no mínimo um carácter. (se fosse um *, a sequencia podia ser eventualmente vazia, o que não dá muito jeito para uma variável 😛 )

Lê artigos sobre expressões regulares 🙂

  • Vote 1
Link to comment
Share on other sites

Como assim happyhippyhippo? me de exemplo de como fazer uma tabela de tokens? eu fiz um arraylist para armazenas as palavras reservadas

public String Tokens(){
	Atributos sw = new Atributos();
	sw.Tokens.add("programa");
	sw.Tokens.add("se");
	sw.Tokens.add("entao");
	sw.Tokens.add("enquanto");
	sw.Tokens.add("inicio");
	sw.Tokens.add("para");
	sw.Tokens.add("ate");
	sw.Tokens.add("faz");
	sw.Tokens.add("fim");
	sw.Tokens.add("variaveis");
	sw.Tokens.add("inteiro");
	sw.Tokens.add("real");
	sw.Tokens.add("caracter");
	sw.Tokens.add("fimse");
	sw.Tokens.add("escreva");
	sw.Tokens.add("leia");
	sw.Tokens.add("repita");
	sw.Tokens.add("+");
	sw.Tokens.add("-");
	sw.Tokens.add("/");
	sw.Tokens.add("*");
	sw.Tokens.add("<");
	sw.Tokens.add(">");
	sw.Tokens.add("=>");
	sw.Tokens.add("<=");
	sw.Tokens.add("==");
	sw.Tokens.add("<>");
	sw.Tokens.add("e");
	sw.Tokens.add("ou");
	return sw.Tokens.toString();
}

eu tenho que fazer agora uma comparação do arquivo txt com o arraylist as palavras reservadas?

Link to comment
Share on other sites

Bom dia,

Resumo : Utilise enum e Expressões Regulares Java para a análise lexical para obter os tokens. Depois utilize uma AST, Abstract Syntax Tree a ser percorrida pelo Design Pattern Visitor.

Como criar um compilador em java ?

Primeiro passo qual é a linguagem de origem e a linguagem alvo ?

O cdgramos deu boas indicações. Acho que com estes elementos podemos implementar as fases iniciais de um compilador. Pelo menos a análise lexical com os ENUM e Expressões Regulares do Java.

Lá há alguns anos atrás eu desenvolvi um compilador de um MiniJava em Java com o auxílio de um livro (ver link mais adiante). E também um interpretador Java (JVM : Java Virtual Machine) em Java no quadro de estudos de Engenharia de Software.

Eu vim a perceber o quão difícil é, desenvolver um compilador e interpretador.

O que se segue é um suplemento nível avançado :

Antes de prosseguir, é interessante entender a diferença entre compilador e intérprete/intérpretador.

Exemplo, Java é uma linguagem informatica compilada com o programa "javac " em ByteCode intermediário e depois interpretado com o programa "java " na JVM (Java Virtual Machine) que é uma máquina baseada numa pilha (Stack) .

Um compilador é um programa de computador que transforma o código-fonte escrito em uma linguagem de programação (o linguagem de origem) para outra linguagem de computador (a linguagem alvo).

Observação : a linguagem alvo não é necessariamente código binário. Geralmente, a transformação é uma linguagem de alto nível para uma linguagem de baixo nível, mas isso não é obrigatório.

A descrição de uma linguagem de programação é geralmente dividida em dois componentes da sintaxe (forma) e semântica (significado).

Sintaxe da linguagem de programação é geralmente definida usando uma combinação de expressões regulares (para a estrutura lexical, vocabulário) e Backus-Naur Form (para a estrutura gramatical).

Tal como o idioma Português contém vocabulário (léxico), gramática e semântica.

Quais são os passos para criar um compilador ?

Fase A- Definir a linguagem de origem : estrutura lexical (ou seja defenir o léxico, vocabulário, lemas, palavras do dicionário) e a estrutura gramatical com Backus-Naur Form (BNF).

About BNF : http://cui.unige.ch/db-research/Enseignement/analyseinfo/AboutBNF.html

Fase B- Definir a linguagem alvo resultado da compilação

Fase C- Escolha o linguagem informatica em que o compilador é escrito : JAVA é uma muito boa escolha :-)

Step 1- Análise Lexical : O objetivo é reduzir o código fonte para ser compilado em tokens da estrutura lexical: identificadores, números inteiros, operadores, parênteses, expressões etc

Existem ferramentas : Lex, Flex em C, JLex e JFLEX http://jflex.de/ para JAVA , ocamllex para Caml, etc...

Se você não usar as ferramentas utilize : ENUM e Expressões Regulares para defenir o dicionário com o vocabulário, léxico autorizado

Step 2- Análise Sintática : o objectivo é converter a sintaxe do código-fonte em árvore de sintaxe abstrata ( AST, Abstract Syntax Tree ) é muito mais fácil de usar estreturas de árvores :

Existem ferramentas : Yacc, Bison em C, CUP em Java, ocamlyacc em Caml , etc...

http://www2.cs.tum.edu/projects/cup/

Step 3- Análise semântica : Esta parte não tém padrão, exceto, talvez, para os tipos de controle, e ainda, que depende fortemente da linguagem a ser compilado.

A idéia é realizar transformações em sua árvore de sintaxe abstrata ( AST) para produzir uma outra árvore

AST é atravessada com o padrão Design Pattern Java chamado Visitor.

Step 4- [ opcional ] Geração de código intermediário , Otimização, geração de código, Linker ... etc.

Resumo em francês : http://upload.wikimedia.org/wikipedia/commons/e/e5/Cha%C3%AEne_de_compilation.svg

Resumo em Inglês : http://upload.wikimedia.org/wikipedia/commons/7/7f/Multi-passcompiler.png

Para saber mais leia o PDF em Inglês : Modern_Compiler... neste link : http://objetjava.online.fr/jlvre2/

Cordialmente

Ernest Duarte

Edited by Ernest Duarte
  • Vote 1
Link to comment
Share on other sites

eu fiz um simulador de lexica mais ou menos olha como fiz

package estudando;

import java.util.Scanner;


public class Program {

public static void main(String[] args) {

	Atributos entrada = new Atributos();
	Scanner lendo = new Scanner(System.in);
	System.out.println("Entrada: ");
	entrada.setEntrada(lendo.next());
	String[] separado = entrada.Entrada.split("");  


	for(int i=0;i<separado.length;i++){

		switch (separado[i]) {
		case "=":
				System.out.println("Operador_Atribuição: "+separado[i]);
			break;

		case "+":
				System.out.println("Operador_Aritmetico: "+separado[i]);
			break;
		case "-":
				System.out.println("Operador_Aritmetico: "+separado[i]);
			break;
		case "*":
			System.out.println("Operador_Aritmetico: "+separado[i]);
			break;
		case "/":
			System.out.println("Operador_Aritmetico: "+separado[i]);
			break;
		case ";":
			System.out.println("Operador_Separador: "+separado[i]);
			break;
		case "<":
			System.out.println("Operador_Relacional: "+separado[i]);
			break;
		case ">":
			System.out.println("Operador_Relacional: "+separado[i]);
			break;
		case "&":
			System.out.println("Operador_Logico: "+separado[i]);
			break;
		case "|":
			System.out.println("Operador_Logico: "+separado[i]);
			break;
		default:
			break;

		}

		if(separado[i].matches("[A-Z]") || separado[i].matches("[a-z]")){
			System.out.println("Id: "+separado[i]);
		}



	}

	lendo.close();

}

}
Link to comment
Share on other sites

eu fiz um simulador lexico em java swing eu gostaria de organizar o jatbale ele fica com espaço null

package pacote;


import java.io.*;
import java.util.ArrayList;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;



public class Program  extends JFrame{

public String EnderecoArquivo,EnderecoTemporario,bufferIn;
public String data ;
public int resultadoJanelas;
public ArrayList<String> Numero = new ArrayList<>();
public ArrayList<String> Identificador = new ArrayList<>();
public ArrayList<String> Operador = new ArrayList<>();
public ArrayList<String> Separador = new ArrayList<>();
public ArrayList<String> Palavra = new ArrayList<>();


public Program() {
	initComponents();
}
private javax.swing.JList jList1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
private javax.swing.JMenu jMenu4;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
private javax.swing.JMenuItem jMenuItem5;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable jTable1;
private java.awt.TextArea textArea1;



private void initComponents() {

	jScrollPane1 = new javax.swing.JScrollPane();
	jTable1 = new javax.swing.JTable();
	textArea1 = new java.awt.TextArea();
	jScrollPane2 = new javax.swing.JScrollPane();
	jList1 = new javax.swing.JList();
	jMenuBar1 = new javax.swing.JMenuBar();
	jMenu2 = new javax.swing.JMenu();
	jMenuItem1 = new javax.swing.JMenuItem();
	jMenuItem2 = new javax.swing.JMenuItem();
	jMenuItem3 = new javax.swing.JMenuItem();
	jMenu3 = new javax.swing.JMenu();
	jMenuItem5 = new javax.swing.JMenuItem();
	jMenu4 = new javax.swing.JMenu();
	jMenuItem4 = new javax.swing.JMenuItem();

	setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

	jTable1.setModel(new javax.swing.table.DefaultTableModel(
		new Object [][] {},
		new String [] {
			"Palavras", "Identificador", "Separador", "Operador", "Numero"
		}
	));


	jScrollPane1.setViewportView(jTable1);

	textArea1.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));

	jScrollPane2.setViewportView(jList1);

	jMenu2.setText("Arquivo");

	jMenuItem1.setText("Abrir arquivo");
	jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
		public void actionPerformed(java.awt.event.ActionEvent evt) {
			jMenuItem1ActionPerformed(evt);
		}
	});
	jMenu2.add(jMenuItem1);

	jMenuItem2.setText("Salvar arquivo");
	jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
		public void actionPerformed(java.awt.event.ActionEvent evt) {
			jMenuItem2ActionPerformed(evt);
		}
	});
	jMenu2.add(jMenuItem2);

	jMenuItem3.setText("Sair");
	jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
		public void actionPerformed(java.awt.event.ActionEvent evt) {
			jMenuItem3ActionPerformed(evt);
		}
	});
	jMenu2.add(jMenuItem3);

	jMenuBar1.add(jMenu2);

	jMenu3.setText("Ferramentas");

	jMenuItem5.setText("Analisar");
	jMenu3.add(jMenuItem5);
	jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
		public void actionPerformed(java.awt.event.ActionEvent evt) {
			jMenuItem5ActionPerformed(evt);
		}
	});
	jMenuBar1.add(jMenu3);

	jMenu4.setText("Sobre");

	jMenuItem4.setText("Exemplo de linguagem");
	jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
		public void actionPerformed(java.awt.event.ActionEvent evt) {
			jMenuItem4ActionPerformed(evt);
		}
	});
	jMenu4.add(jMenuItem4);

	jMenuBar1.add(jMenu4);

	setJMenuBar(jMenuBar1);

	javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
	getContentPane().setLayout(layout);
	layout.setHorizontalGroup(
		layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 781, Short.MAX_VALUE)
		.addComponent(textArea1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
		.addComponent(jScrollPane2)
	);
	layout.setVerticalGroup(
		layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(layout.createSequentialGroup()
			.addComponent(textArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 448, javax.swing.GroupLayout.PREFERRED_SIZE)
			.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
			.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
			.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
			.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE))
	);

	pack();
}// </editor-fold>					  


 /**
Metodo que evalua nuestro caracter si existe y nos retorna
verdadero para los separadores
y
falso para los operadores
*/
public static boolean Caracter(char c){
	if(c=='(') return true;
	else if(c==')')return true;
	else if(c=='<')return false;
	else if(c=='>')return false;
	else return false;
}

/**
retornamos nuestro caracter de operador
*/
public static char Operador(char c){
	char car=' ';
	if(c=='<')car='<';
	else if(c=='>')car='>';
	return car;
}

/**
retornamos nuestro caracter de separador
*/
public static char Separador(char c){
	char car=' ';
	if(c=='(') car='(';
	else if(c==')')car=')';
	return car;
}



public static boolean palavraReservada(String cad){
	//AQUI FICA A TABELA DE PALAVRAS RESERVADAS
	if(cad.equalsIgnoreCase("programa")) return true;
	else if(cad.equalsIgnoreCase("se")) return true;
	else if(cad.equalsIgnoreCase("fim")) return true;
	else if(cad.equalsIgnoreCase("variaveis")) return true;
	else if(cad.equalsIgnoreCase("repita")) return true;
	else if(cad.equalsIgnoreCase("fimse")) return true;
	else if(cad.equalsIgnoreCase("para")) return true;
	else if(cad.equalsIgnoreCase("ate")) return true;
	else if(cad.equalsIgnoreCase("faz")) return true;
	else if(cad.equalsIgnoreCase("enquanto")) return true;
	else if(cad.equalsIgnoreCase("entao"))return true;
	else if(cad.equalsIgnoreCase("leia"))return true;
	else if(cad.equalsIgnoreCase("escreva")) return true;
	else if(cad.equalsIgnoreCase("procedimento")) return true;
	else if(cad.equalsIgnoreCase("funcao")) return true;
	else if(cad.equalsIgnoreCase("inicio"))return true;
	else return false;
}
@SuppressWarnings({ })
private void Analise() throws IOException{

		EnderecoTemporario =  System.getProperty("java.io.tmpdir")+"temp.txt";
   	 File arquivo = new File(EnderecoTemporario);  
   	 FileWriter fw = new FileWriter(arquivo);  
   	 BufferedWriter bw = new BufferedWriter(fw);	  
   	 bw.write(textArea1.getText());  
   	 bw.flush();  
   	 bw.close();  

  		 try{
  			 DataInputStream in=new DataInputStream(new FileInputStream(EnderecoTemporario));//leemos nuestro archivo de entrada
  			 try{
  				 while((bufferIn=in.readLine())!=null){//mientras no lleguemos al fin del archivo...
  					 int i=0;
  					 String cad=bufferIn.trim();
  					 //eliminamos los espacios en blanco al incio o al final (pero no a la mitad)
  					 while(i<cad.length()){//recorremos la línea
  						 char t=cad.charAt(i);//vamos leyendo caracter por caracter
  						 if(Character.isDigit(t)){//comprobamos si es un digito
  							 String ora="";
  							 ora+=t;
  							 int j=i+1;
  							 while(Character.isDigit(cad.charAt(j))){
  							 //mientras el siguiente elemento sea un numero
  								 ora+=cad.charAt(j);//concatenamos
  								 j++;
  								 if(j==cad.length())break;//rompemos si llegamos al final de la línea
  							 }
  							 i=j;//movemos a nuestra variable i en la cadena
  							 System.out.println("Número-->"+ora);
  							 Numero.add(ora);
  							 continue;//pasamos al siguiente elemento
  						 }//end if si es Digito
  						 else if(Character.isLetter(t)){//comprobamos si es una letra
  							 String ora="";
  							 ora+=t;
  							 int j=i+1;
  							 while(Character.isLetterOrDigit(cad.charAt(j))){
  							 //mientras el siguiente elemento sea una letra o un digito
  							 //ya que las variables pueden ser con numeros
  								 ora+=cad.charAt(j);
  								 j++;
  								 if(j==cad.length())break;
  							 }
  							 i=j;
  							 if(palavraReservada(ora)){//comprobamos si es una palabra reservada
  								 System.out.println("Palabra reservada="+ora);
  								 Palavra.add(ora);
  							 }
  							 else{//caso contrario es un identificador o variable
  								 System.out.println("Identificador-->"+ora);
  								 Identificador.add(ora);
  							 }
  							 continue;
  						 }//end if si es variable
  						 else if(!Character.isLetterOrDigit(t)){
  						 //si no es letra ni digito entonces...
  							 if(Caracter(t)){//¿es separador?
  								 System.out.println("Separador-->"+Separador(t));
  								 String c = ""+Separador(t);
  								 Separador.add(c);
  							 }else{//¿o es un operador?
  								 System.out.println("Operador-->"+Operador(t));
  								 String c = ""+Operador(t);
  								 Operador.add(c);
  							 }  
  							 i++;
  							 continue;
  						 }//end if si es diferente de letra y digito
  					 }
  				 }//end while
  			 }catch(IOException e){}
  		 }catch(FileNotFoundException e){}

}




  	 private void AbrirArquivo(){
  		 try{
  			  FileReader fileReader = new FileReader(EnderecoArquivo);
  			  BufferedReader reader = new BufferedReader(fileReader);
  			  while((data = reader.readLine()) != null){
  				 textArea1.append(data+"\n");
  			 }
  			 fileReader.close();
  			 reader.close();
  		 }
  		 catch(Exception erro){
  			 JOptionPane.showMessageDialog(null, erro.getMessage());
  		 }
  	 }

  	 private void SalvarArquivo(){


  		 try{
  			 FileWriter escrever;
  			 escrever = new FileWriter(new File(EnderecoArquivo));  
  			 escrever.write(textArea1.getText());  
  			 escrever.close();  
  		 }catch(Exception erro){
  			 JOptionPane.showMessageDialog(null, erro.getMessage());
  		 }

  	 }


  	 private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {										  

  		JFileChooser openFile = new JFileChooser();
  		openFile.showOpenDialog(openFile);
  		resultadoJanelas = JFileChooser.OPEN_DIALOG;

  		if(JFileChooser.APPROVE_OPTION == resultadoJanelas){
  			  EnderecoArquivo = openFile.getSelectedFile().toString();
  			  AbrirArquivo();
  		}


  	 }										  

  	 private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {										  

  		JFileChooser saveFile = new JFileChooser();
  		saveFile.showSaveDialog(saveFile);
  		resultadoJanelas = JFileChooser.OPEN_DIALOG;
  		 if(JFileChooser.APPROVE_OPTION == resultadoJanelas){
  			  EnderecoArquivo = saveFile.getSelectedFile().toString();
  			  SalvarArquivo();
  			  JOptionPane.showMessageDialog(null, "Salvo com sucesso!");
  		}


  	 }										  

  	 private void Fechar(){
  		   String message = "Tem certeza que deseja sair do analisador?";
  		   String title = "Confirmação";
  		   int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
  		   if (reply == JOptionPane.YES_OPTION){
  			 System.exit(0);
  		 }

  	 }

  	 private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {										  
  		 Fechar();
  	 }										  

  	 private void MenssagemPercaDados(){
  		  String message = "Você vai perder os dados na caixa de texto, deseja prosseguir?";
  		   String title = "Confirmação";
  		   int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
  		   if (reply == JOptionPane.YES_OPTION){
  			textArea1.setText("");
  			textArea1.setText("programa NomePrograma;"
  				 + "\n"+"variaveis "
  				 + "\n"+"x,i,z:inteiro"
  				 + "\n"+"inicio"
  				 + "\n"+"escreva('Digite o numero: ');"
  				 + "\n"+"leia(x);"
  				 + "\n"+"escreva('Digite o numero: ')"
  				 + "\n"+"leia(i);"
  				 + "\n"+"escreva('Resultado: ');"
  				 + "\n"+"fim.");
  		 }
  	 }


  	 private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {										  

  		 MenssagemPercaDados();

  	 }										  
  	 private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {										  

  		try{
		   Analise();
		   DefaultTableModel var = (DefaultTableModel) jTable1.getModel();
		   for(int i=0;i<Palavra.size();i++){
			   var.addRow(new String[]{Palavra.get(i)});
		   }
		   for(int i=0;i<Identificador.size();i++){
			   var.addRow(new String[]{null,Identificador.get(i)});
		   }
		   for(int i=0;i<Separador.size();i++){
			   var.addRow(new String[]{null,null,Separador.get(i)});
		   }
		   for(int i=0;i<Operador.size();i++){
			   var.addRow(new String[]{null,null,null,Operador.get(i)});
		   }
		   for(int i=0;i<Numero.size();i++){
			   var.addRow(new String[]{null,null,null,null,Numero.get(i)});
		   }

		  // var.addRow(new String[]{palavra,identificador,"oi",Numero,"oi","oi,","oii"});

  		}
  		catch(Exception e){
		   JOptionPane.showMessageDialog(null, "Houve um erro: "+e.getMessage());
  		}
  	 }  

public static void main(String[] args) {

	  new Program().setVisible(true);

}

}
Link to comment
Share on other sites

Bom Dia pessoal, sou estudando de Ciências da Computação, meu professor passou um trabalho onde não estou entendo nada, se puder me dar a luz por onde começo serei eternamente grato, segue abaixo!

4) Dada a linguagem LI abaixo, usando o programa JFlex projete e implemente o analizador léxico para L1. O projeto adequado dos tokens faz parte do exercício. A sintaxe de L1 é:

e := n | b | e1 op e2 | if e1 then e2 else e3

| x

| (e1) e2

| fn x:T => e

| let x:T = e1 in e2 end

onde

n ∈ conjunto de números inteiros

b ∈ {true, false}

op ∈ {+, ≥} T ∈ {int, b}

x ∈ [a..zA..Z][a..zA..Z_]*

let permite declarar identificador x

fn é uma função sem nome

(e1) e2 é a aplicação da expressão e1 à expressão e2

Segue arquivo lexer que ele passou!

/* JFlex example: partial Java language lexer specification */

%%

%public
%class Lexer /* Esse eh o nome da classe gerada  */
%type String /* Tipo do objeto retornado ao identificar um token */
%unicode
%debug /* Cria a funcao main() como lexer standalone  */
%line
%column

/* Macros definidas para auxiliar a escrita das expressoes regulares */

LineTerminator = \r|\n|\r\n
InputCharacter = [^\r\n]
WhiteSpace	 = {LineTerminator} | [ \t\f]

/* comments */
Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}

TraditionalComment   = "/*" [^*] ~"*/" | "/*" "*"+ "/"
// Comment can be the last line of the file, without line terminator.
EndOfLineComment	 = "//" {InputCharacter}* {LineTerminator}?
DocumentationComment = "/**" {CommentContent} "*"+ "/"
CommentContent	   = ( [^*] | \*+ [^/*] )*

Identifier = [:jletter:] [:jletterdigit:]*

DecIntegerLiteral = 0 | [1-9][0-9]*

%%

/* Aqui comecam as expressoes regulares. Sugiro
  estudar no manual o que eh YYINITIAL */

<YYINITIAL> {

/* palavras-chave */
"abstract"  { return "ABSTRACT"; }
"boolean"   { return "BOOLEAN"; }
"break"	 { return "BREAK"; }
"public"	{ return "METHOD_ACCESS"; }
"if" { return new Token }
"else"
"while"
"do"

/* identificadores */
/* O metodo yytext() retorna o texto lido do arquivo
  de entrada que o match com a expressao regular
  ocorreu. No caso de um identificador, retorna
  o texto do identificador. */
{Identifier}  { return yytext(); }

/* constantes */
{DecIntegerLiteral}				  { return "INT"; }
\" ({WhiteSpace}|{Identifier})* \"   { return "STRING_LITERAL";  }

/* operadores */
"="   { return "EQ"; }
"=="  { return "EQEQ"; }
"+"   { return "PLUS"; }
">="  { return "GEQ"; }
"|"

/* delimitadores */
"("   { return "LPAR"; }
")"   { return "RPAR"; }
"{"   { return "LBRACK"; }
"}"   { return "RBRACK"; }
","   { return "COMMA"; }
";"   { return "SEMICOLLON"; }
"."   { return "DOT"; }

/* comments */
{Comment}	  { }

/* whitespace */
{WhiteSpace}   { /* ignore */ }

/* end YYINITIAL */
}

/* error fallback */
[^]  { throw new Error("Illegal character <"+ yytext()+">"); }
Edited by apocsantos
Link to comment
Share on other sites

Bom Dia pessoal, sou estudando de Ciências da Computação, meu professor passou um trabalho onde não estou entendo nada, se puder me dar a luz por onde começo serei eternamente grato, segue abaixo!

uma questão nova : tópico novo

e ao declarares que não estás a perceber o problema, o melhor seria leres a documentação do jflex

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.