import java.io.*; import java.util.*; import javax.swing.*; public class LexicoSintactico extends JFrame { static String [] reservadas={"RE","WR","MAIN","SI","SINO"};//PALABRAS RE SERVADAS static Vector
micodigo=new Vector();//vector fuen te static Vector parser=new Vector ();//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.si .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) { obt obten ener erEn Ente tero ro() ();; } else { if(S if(Simb imbolo olo(ch (ch,si ,sig)= g)==tr =true) ue) { ptr++; } } } vector salir
if(ptr==micodigo.size()-1)//si se llego al final del { }
break;
} //System.out.println(parser.lastElement());
} }//termina clasifica tokens
//VARIABLES A-Z a-z public void obtenerPalabra()
{
Strin g tok=" ";
while(true) { char char car= car=mi mico codi digo go.e .ele leme ment ntAt At(p (ptr tr); ); //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(b if(bus usca caRes Reser erva vada das( s(to tok, k,re rese serv rvad adas as)= )==t =tru rue) e) { toke tokenn nuev nuevo= o=ne neww toke token( n(to tok, k,"R "Res eser erva vada da") ");; parser.add(nuevo); break; } else { token nuevo=new token(tok,"Identificador "); parser.add(nuevo); break; } } } te
if(ptr==micodigo.size()-1)//si se llego al final del vector fuen {
if(b if(bus usca caRe Rese serv rvad adas( as(to tok, k,re rese serv rvad adas as)= )==t =tru rue) e) { toke tokenn nuev nuevo= o=ne neww toke token( n(to tok, k,"R "Res eser erva vada da") ");; parser.add(nuevo); return; } else { toke tokenn nuevo nuevo=n =new ew toke token( n(to tok, k,"I "Ide dent ntif ific icad ador or") ");; parser.add(nuevo); return; }
} }//obtiene palabra y termina
public boolean buscaReservadas(String palabra,String []arreglo) { for for (int (int i=0; i=0;i< i=48 && (int)num<=57) { numero+=num; ptr++; }
else { } tor fuente
toke tokenn nuev nuevo= o=ne neww toke token( n(nu nume mero ro," ,"En Ente tero ro") ");; parser.add(nuevo); return;
if(ptr==micodigo.size()-1)//si se llego al final del vec { }
toke tokenn nuev nuevo= o=ne neww toke token( n(nu nume mero ro," ,"En Ente tero ro") ");; parser.add(nuevo); return;
} }//obtener entero termina //OPERADORES public boolean Simbolo(char ch,char sig) { toke n n uevo; switch(ch) { case '=': if(sig=='=') { mparacion");
ptr++; nuevo=new token("==","co
parser.add(nuevo); return true; } else { nuev nuevo= o=ne neww toke token( n("= "=", ","a "asi si
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")
; case ')': case '{': case '}': parser.add(nuevo);
parser.add(nuevo); return true; nuevo=new token(")","par_der"); parser.add(nuevo); return true; nuevo=new token("{","llave_izq"); parser.add(nuevo); return true; nuevo=new token("}","llave_der");
case '%': case ';':
} return false;
return true; nuevo=new token("%","modulo"); parser.add(nuevo); return true; nuevo=new token(";","punto_coma"); parser.add(nuevo); return true;
} //----------------------------------------------------Implementacion de la grama tica--------------------------------//metodo para obtener el siguiente token del vector parser public void getToken() { tkn = par parser ser.el .eleme ementA ntAt(p t(ptr2 tr2); ); System.out.println(tkn.getInfo()); ptr2++; } public boolean codigo() { if( tkn tkn.ge .getIn tInfo( fo().e ).equa quals( ls("RE "RE") ") ) { return listaInstr(); } else { retur n false ; } } //checa el codigo public boolean listaInstr() { if( if( inst instr( r()) ) { if( tkn tkn.ge .getIn tInfo( fo().e ).equa quals(" ls(";") ;") tkn tkn.ge .getIn tInfo( fo().e ).equa quals( ls("}" "}")) ) { g etTok en(); if(tkn.getInfo().equals("}")) { return true; } else return listaInstr(); } else { e rrore s(6); return false; } } else { errores (9); return false; } } //revisa tipo de instruccion public boolean instr() { if( tkn tkn.ge .getIn tInfo( fo().e ).equa quals( ls("RE "RE") ") ) { getToke n(); return lectura(); } else if( tkn.getInfo().equals("WR") ) { getToke n(); return escritura(); } else if( tkn.getTipo().equals("Identificador") ) { getT getTok oken en() ();; return asignacion();
} else if( tkn.getInfo().equals("SI") ) { getT getTok oken en() ();; return si(); } else if( tkn.getInfo().equals("SINO") ) { getT getTok oken en() ();; return si(); } else { retur n false ; }
} //lectura de variables public boolean lectura() { if( tkn.ge tkn.getTipo( tTipo().equa ).equals("Id ls("Identific entificador") ador") ) { getToke n(); if(tkn.getInfo().equals(",")) { g etTok en(); return lectura(); } else return true; } else { errores (5); return false; } } //escritura en pantalla public boolean escritura() { if( tkn.ge tkn.getTipo( tTipo().equa ).equals("Id ls("Identific entificador") ador") ) { getToke n(); if(tkn.getInfo().equals(",")) { g etTok en(); return escritura(); } else return true; } else { errores (5); return false; } }
public boolean asignacion() { if( tkn tkn.ge .getIn tInfo( fo().e ).equa quals( ls("=" "=")) ) { getToke n(); return operaciones(); } else { errores (7); return false; } } public boolean operaciones() { if( tkn tkn.ge .getIn tInfo( fo().e ).equa quals( ls("(" "(")) ) { getToke n(); if( operaciones() ) { if( if( tkn. tkn.ge getI tInf nfo( o(). ).eq equa uals ls(" (")" )")) )
{
} else { } else { } else { }
}
}
getToken(); if( tkn.getTipo().equals("oper") ) { g etTo ken(); return operaciones(); } return true; errores(8); return false;
return true;
retur n opera cion( );
} public boolean operacion() { if( tkn.ge tkn.getTipo( tTipo().equa ).equals("Id ls("Identific entificador") ador") tkn.ge tkn.getTipo( tTipo().equa ).equals("En ls("Enter ter o") ) { getToke n(); if(tkn.getTipo().equals("oper")) { g etTok en(); return operaciones(); } else { r etur n true; } } else return true; } //selectiva public boolean si() { if(t if(tkn kn.g .get etIn Info fo() ().e .equ qual als( s("( "(") "))) { getToke n(); if( condicion() ) { g etTok en(); if( tkn.getInfo().equals(")") ) { getToken(); if( tkn.getInfo().equals("{") ) { g etTo ken(); if( listaInstr() ) { if(t if(tkn kn.g .get etIn Info fo() ().e .equ qual als( s("} "}") "))) { getTok en(); if( tkn.getInfo().equals ("SINO") ) { getTok en(); if( tkn.getInfo( ).equals("{") ) { getTok en (); if( list aInstr() ) { if(tkn.getInfo().equals("}"))
{
r etur n true ;
} else {
e rrore s(4);
return false; }
} else {
return false; } else {
2);
} errore s( return f
alse;
} else {
} else { } else { } else } else { }
}
}
} else { }
}
} else { }
} retur n true;
errore s(4); return false;
retur n fals e;
error es(2); return false;
errores(8); return false;
return false;
errores (10); return false;
} public boolean condicion() { if( tkn.getTipo().equals("Identificador") tkn.getTipo().equals("Enter o") )
{
getToke n(); if( tkn.getInfo().equals("==") ) { g etTok en(); if( tkn.getTipo().equals("Identificador") tkn.getTipo ().equals("Entero") ) { return true; } else { errores(11); return false; } } else { e rrore s(12); return false; } } else { errores (11); return false; } } //errores public void errores(int e) { Stri String ng erro error= r="" "";; switch(e) { case case 1: erro error= r="\ "\nE nERR RROR OR 1 : Falt Faltaa la pala palabr braa rese reserv rvad adaa MAIN MAIN"; "; break; case 2: error="\nERROR 2 : Falta inicio de bloque '{'"; break; case 3: error="\nERROR 3 : Anomalia en la Lectura de variables"; break; case 4: error="\nERROR 4 : Falta fin de bloque '}'"; break; case 5: error="\nERROR 5 : Falta un Identificador"; break; case 6: error="\nERROR 6 : Falta terminador de sentencia ';'"; break; case 7: error="\nERROR 7 : Falta operador de asignacion '='"; break; case 8: error="\nERROR 8 : Falta parentesis de cierre ')'"; break; case 9: error="\nERROR 9 : Falta Instruccion correcta"; break; case 10:error="\nERROR 10 : Falta parentesis de apertura '('"; break; case 11:error="\nERROR 11 : Falta Identificador o Constante Ente ra"; break; case 12:error="\nERROR 12 : Falta un operador de Comparacion"; } System.out.println(error); } public static void imprimeparser() { for(int x=0;x
} //-----------------------------------------------Carga Archivo-------------------------------------------------------------public void cargaFuente() { BufferedReader LeeArchivo; JFileChooser selectorArchivo = new JFileChooser(); selectorArchivo.setFileSelectionMode( JFileChooser.FILES_ONLY ); int resultado = selectorArchivo.showOpenDialog( this ); if ( resultado == JFileChooser.CANCEL_OPTION ) return; // obtener el archivo File nombreArchivo = selectorArchivo.getSelectedFile(); if ( nombreArchivo == null nombreArchivo.getName().equals( ""
) )
JOptionPane.showMessageDialog( this, "Nombre de archivo incorrec
to",
"Nombre de archivo incorrecto", JOptionPane.ERROR_MESSAG
E ); else {
chivo ) );
/ / abr e e l a rchiv o try { LeeArchivo = new BufferedReader(new FileReader( nombreAr
int i=0,j=0; while (i!=-1) { i=LeeArchivo.read(); micodigo.add(new Character((char)i)); System.out.println("" + micodigo.elementAt(j++) ); } System.out.println("\n=¡¡Cargado Exitosamente!!\n\n"); JOptionPane.showMessageDialog( this, "¡¡Cargado Exitosamente!!", "Cargando", JOptionPane.INFORMATION_MESSAGE ); } catch ( IOException excepcionES ) { JOptionPane.showMessageDialog( this, "Error al a brir el archivo", "Error", JOptionPane.ERROR_MESSAGE ); } } }//-----------------------------------------------------------Carga Fuen te---------------------------------------//----------------------------------------MAIN----------------------------------------------------------------------------public static void main (String[] args) { LexicoSintactico lexsin= new LexicoSintactico(); lexsin.cargaFuente(); //Carga el archivo fuente lexsin.clasificaTokens();//Llama al metodo que identifica los to kens cargados de la fuente lexsin.imprimeparser();//Llama al metodo que imprime los tokens del scaner
lexsin.main_codigo();Llama al metodo que realiza el analizis de sintaxis del codigo de acuerdo a los tokens obtenidos en el Análisis Léxico System.exit(0); }//-------------------------------------------- MAIN ---------------------------------------------------------------------public void main_codigo() { t ry { in t i=0 ; getToken(); if(tkn.getInfo().equals("MAIN")) { g etTok en(); if(tkn.getInfo().equals("{")) { getToken(); if(codigo()) { if(t if(tkn kn.g .get etIn Info fo() ().e .equ qual als( s("} "}") "))) { JOptionPane.showMessageDialog( this,"Compilación Completa...\nSintaxis Correcta","P arser",JOptionPane.INFORMATION_MESSAGE ); } else { errore s(4) ; } } else { e rror es(3) ; } } else { errores(2); } } else errores(1); } catch(Exception e) { JOptio JOp tionPa nPane. ne.sho showMe wMessa ssageD geDialo ialog(t g(this his,"E ,"Erro rrorr al Com Compil pilar" ar","E ,"Erro rror", r", JOptionPane.ERROR_MESSAGE); } } }