Está en la página 1de 5

ESCUELA POLITECNICA NACIONAL FACULTAD DE INGENIERA EN SISTEMAS Compiladores y lenguajes Nombre: Alexander Pinchao Tema: Crear un programa analizador

lxico que reconozca mnimo 20 tokens Introduccin.Qu es un compilador? Un compilador no es ms que un traductor, es decir, un programa que nos permite pasar informacin de un lenguaje a otro. Por ejemplo, un compilador de C nos permite traducir ficheros escritos en lenguaje C a un lenguaje legible para la mquina (ensamblador). El proceso de compilacin no siempre es directo. Esto quiere decir que si partimos de un lenguaje A y queremos traducir a un lenguaje B, no siempre ser recomendable traducir directamente de A a B, si no que puede ser conveniente usar un lenguaje intermedio (llammosle X) y entonces disearamos un traductor de A a X, y otro de X a B. En este caso, el primer traductor recibe el nombre de front-end mientras que el segundo se llama back-end. El lenguaje A es el lenguaje fuente y el lenguaje B es el lenguaje objeto o destino. Diseo de un compilador A continuacin mostramos un diagrama de bloques que representa las fases a seguir en el proceso de diseo de un compilador adems de los elementos auxiliares que necesitamos en cada fase.

Al final tendremos un nico programa que sera el traductor. Este traductor tendra un analizador sintctico, y a su vez el analizador sintctico tendra un analizador lxico. Analizador lxico Este analizador se encarga de formar los componentes lxicos del lenguaje fuente. Estos componentes reciben el nombre de token. Un token es un elemento que puede formar parte del lenguaje fuente. Para implementar un analizador lxico necesitamos un DTE (diagrama de transicin de estados) que nos proporcione la especificacin lxica del lenguaje fuente. Ejemplo: queremos reconocer como tokens el nmero 0 (cero), el nmero 1 (uno), la palabra reservada casa (casa) y cadenas formadas por las letras a y b (cadena). El DTE equivalente podra ser:

Partimos de un estado inicial (e) a partir de la cual vemos que con un 0 o con un 1 directamente obtenemos los tokens cero y uno respectivamente. Si tenemos una c, luego una a, luengo una s y luego una a obtenemos el token casa. Y si tenemos uno o ms caracteres que sean a o b, obtenemos el token cadena. Cualquier otra posibilidad no contemplada en el DTE nos llevara a un error lxico: por ejemplo la palabra cab, ya que a partir del estado ca no hay ningn arco que se active con la letra b.

Codigo Fuente.package h; import java.io.*; class tipos{ private int cont; private String tipo; private String cualesSon; public tipos(int cont,String tipo,String cualesSon){ setCont(cont); setTipo(tipo); setCualesSon(cualesSon);} public void setCont(int cont){ this.cont=cont;} public void setTipo(String tipo){ this.tipo=tipo;} public void setCualesSon(String cualesSon){ this.cualesSon=cualesSon;} public int getCont(){ return cont;} public String getTipo(){ return tipo;} public String getCualesSon(){ return cualesSon;} public void verTipos(){ System.out.println("Los " + getTipo() + " son " + getCont() + " '"+getCualesSon()+"'"); } } class lexer{ private Character tokens[]={'=','(',')','+','','*','/',';','<','>'}; private Character au='x'; public void instrucciones(){ System.out.println("*********************************************** ***********"); System.out.print("Bienvenido!! *\n"); System.out.print("Por favor Introduce las Expresiones que desees *\n"); System.out.print("Cuando Termines Pulsa Barra Espaciadora y Enter *\n"); System.out.println("*********************************************** ***********"); System.out.println(); } public Character[] leer(){ String res=""; int longitud=0; Character ch[]; BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); try{ System.out.print("Introduce la Expresion: "); do{ res+=in.readLine();

}while(!res.endsWith(" ")); } catch(IOException ioe){ System.out.println("Ocurrio la Sig. Excepcion " +ioe); } longitud=res.length(); ch=new Character[longitud]; for(int i=0;i<longitud;i++) { ch[i]=res.charAt(i); } return ch; } public void esDigito(Character ch[]){ int cont=0; String cualesSon=""; for(int i=0;i<ch.length;i++){ if(au.isDigit(ch[i])){ cont++; cualesSon+=ch[i].toString() + " "; } } tipos out=new tipos(cont,"Digitos",cualesSon); out.verTipos(); } public void esToken(Character ch[]){ int ope=0; String cualesSon=""; for(int i=0;i<ch.length;i++){ for(int j=0;j<tokens.length;j++){ if(ch[i].equals(tokens[j])){ ope++; cualesSon+=ch[i].toString() + " "; } } } tipos out=new tipos(ope,"Tokens",cualesSon); out.verTipos(); } public void esIdentificador(Character ch[]){ int Id=0; String cualesSon=""; for(int i=0;i<ch.length;i++) { if(au.isJavaIdentifierStart(ch[i])) { Id++; cualesSon+=ch[i].toString() + " "; }} tipos out=new tipos(Id,"Identificadores",cualesSon); out.verTipos(); } } class analizador{ public static void main(String carls[]){ Character in[];

lexer prueba=new lexer(); prueba.instrucciones(); in=prueba.leer(); prueba.esIdentificador(in); prueba.esToken(in); prueba.esDigito(in); }}

Resultado.-