Académique Documents
Professionnel Documents
Culture Documents
*;
import java.util.*;
import javax.swing.*;
public class LexicoSintactico extends JFrame
{
static String [] reservadas={"RE","WR","MAIN","SI","SINO"};//PALABRAS RE
SERVADAS
static Vector <Character> micodigo=new Vector<Character>();//vector fuen
te
static Vector <token> parser=new Vector <token> ();//vector con los toke
ns clasificados
String ident[][]=new String [50][2];
static token tkn;
int ptr,ptr2=0,linea=0;
char ch, sig;
//-----------------------------------------Anilizador Lexico--------------------
---------------------------------------------
public void clasificaTokens()
{
while(true)
{ if(ptr==micodigo.size())
{ break;
}
ch=micodigo.elementAt(ptr);
sig=micodigo.elementAt(ptr+1);
if(ch==' ' || (int)ch==9 || (int)ch==10 || (int)ch==11 || (int)ch==1
3 || (int)ch==95)//codigo ascii
{ ptr++;
}
else
{ //letras A-Z || a-z
if((int)ch>=65 && (int)ch<=90 || (int)ch>=97 && (int)ch<
=122)//codigo ascii
{ obtenerPalabra();
}
else
{ //digitos 0-9
if((int)ch>=48 && (int)ch<=57)
{ obtenerEntero();
}
else
{ if(Simbolo(ch,sig)==true)
{ ptr++;
}
}
}
if(ptr==micodigo.size()-1)//si se llego al final del
vector salir
{ break;
}
}
//System.out.println(parser.lastElement());
}
}//termina clasifica tokens
//VARIABLES A-Z || a-z
public void obtenerPalabra()
{ String tok="";
while(true)
{ char car=micodigo.elementAt(ptr);
//letras A-Z || a-z
if((int)car>=65 && (int)car<=90 || (int)car>=97 && (int)
car<=122)//codigo ascii
{ tok+=car;
ptr++;
}
else
{ if(buscaReservadas(tok,reservadas)==true)
{ token nuevo=new token(tok,"Reservada");
parser.add(nuevo);
break;
}
else
{
token nuevo=new token(tok,"Identificador
");
parser.add(nuevo);
break;
}
}
}
if(ptr==micodigo.size()-1)//si se llego al final del vector fuen
te
{ if(buscaReservadas(tok,reservadas)==true)
{ token nuevo=new token(tok,"Reservada");
parser.add(nuevo);
return;
}
else
{ token nuevo=new token(tok,"Identificador");
parser.add(nuevo);
return;
}
}
}//obtiene palabra y termina
public boolean buscaReservadas(String palabra,String []arreglo)
{ for (int i=0;i<arreglo.length;i++)
{ if(palabra.equals(arreglo[i]))
{ return true;
}
}
return false;
} //termina busca reservadas
//CONSTANTES NUMERICAS ENTERAS
public void obtenerEntero()
{ String numero="";
while(true)
{ char num=micodigo.elementAt(ptr);
if((int)num>=48 && (int)num<=57)
{ numero+=num;
ptr++;
}
else
{ token nuevo=new token(numero,"Entero");
parser.add(nuevo);
return;
}
if(ptr==micodigo.size()-1)//si se llego al final del vec
tor fuente
{ token nuevo=new token(numero,"Entero");
parser.add(nuevo);
return;
}
}
}//obtener entero termina
//OPERADORES
public boolean Simbolo(char ch,char sig)
{ token nuevo;
switch(ch)
{ case '=': if(sig=='=')
{ ptr++;
nuevo=new token("==","co
mparacion");
parser.add(nuevo);
return true;
}
else
{ nuevo=new token("=","asi
gnacion");
parser.add(nuevo);
return true;
}
case '+': nuevo=new token("+","oper");
parser.add(nuevo);
return true;
case '-': nuevo=new token("-","oper");
parser.add(nuevo);
return true;
case '*': nuevo=new token("*","oper");
parser.add(nuevo);
return true;
case '/': nuevo=new token("/","oper");
parser.add(nuevo);
return true;
case '(': nuevo=new token("(","par_izq")
;
parser.add(nuevo);
return true;
case ')': nuevo=new token(")","par_der");
parser.add(nuevo);
return true;
case '{': nuevo=new token("{","llave_izq");
parser.add(nuevo);
return true;
case '}': nuevo=new token("}","llave_der");
parser.add(nuevo);
return true;
case '%': nuevo=new token("%","modulo");
parser.add(nuevo);
return true;
case ';': nuevo=new token(";","punto_coma");
parser.add(nuevo);
return true;
}
return false;
}
//----------------------------------------------------Implementacion de la grama
tica---------------------------------
//metodo para obtener el siguiente token del vector parser
public void getToken()
{ tkn = parser.elementAt(ptr2);
System.out.println(tkn.getInfo());
ptr2++;
}
public boolean codigo()
{ if( tkn.getInfo().equals("RE") )
{ return listaInstr();
}
else
{ return false; }
}
//checa el codigo
public boolean listaInstr()
{ if( instr() )
{ if( tkn.getInfo().equals(";") || tkn.getInfo().equals("}") )
{ getToken();
if(tkn.getInfo().equals("}"))
{ return true;
}
else
return listaInstr();
}
else
{ errores(6);
return false;
}
}
else
{ errores(9);
return false;
}
}
//revisa tipo de instruccion
public boolean instr()
{ if( tkn.getInfo().equals("RE") )
{ getToken();
return lectura();
}
else if( tkn.getInfo().equals("WR") )
{ getToken();
return escritura();
}
else if( tkn.getTipo().equals("Identificador") )
{ getToken();
return asignacion();
}
else if( tkn.getInfo().equals("SI") )
{ getToken();
return si();
}
else if( tkn.getInfo().equals("SINO") )
{ getToken();
return si();
}
else
{ return false; }
}
//lectura de variables
public boolean lectura()
{ if( tkn.getTipo().equals("Identificador") )
{ getToken();
if(tkn.getInfo().equals(","))
{ getToken();
return lectura();
}
else
return true;
}
else
{ errores(5);
return false;
}
}
//escritura en pantalla
public boolean escritura()
{ if( tkn.getTipo().equals("Identificador") )
{ getToken();
if(tkn.getInfo().equals(","))
{ getToken();
return escritura();
}
else
return true;
}
else
{ errores(5);
return false;
}
}