Publicidad
December 22, 2014, 07:36:14 PM *
Welcome, Guest. Please login or register.
Did you miss your activation email?
Pages: [1]
Topic Tools  
Read April 28, 2007, 01:31:29 AM #0
Mefistófeles

Analizador léxico en Java

Explicaré de qué se trata la creación de un compilador. Supondré que ya existen nociones de Java en éste rollo como son las clases y los métodos.

Cuando nosotros queremos programar, nuestro programa el cual cumplirá un objetivo previamente estudiado bajo algoritmos y aplicación de la Ingeniería en Sistemas, está sujeto a las instrucciones que el procesador tenga integradas.

El compilador es un programa que se encarga de leer un archivo de determinado lenguaje de programación y "traducirlo" al lenguaje máquina que es el conjunto de instrucciones (en el caso de las computadoras, el lenguaje binario) que la computadora soporte o "interpreta".


Al leerse nuestro código fuente, el compilador comienza 3 procesos de análisis:

    * Léxico
    * Sintácico
    * Semántico


A continuación explico con ejemplos lo que realizará cada uno de éstos análisis:

1. Análisis Léxico. Supongamos que mi sistema o programa es para automatizar la ventilación de una habitación; algo sencillo. Las acciones del ducto de ventilación son: abrir y cerrar. No se puede decir sólo abrir o cerrar ya que la ventilación (en éste caso) incluye un aire acondicionado (dejémoslo en ventilador) que debe encenderse o apagarse inependientemente de si nuestra ventilación está abierta o cerrada. Nuestras "palabras reservadas", que son únicamente las palabras que entiende nuestro compilador serán: abrir, cerrar, encender, apagar, ventilador y ventilación. El análisis léxico buscará entonces que esas palabras estén dentro de nuestro "código fuente". Si queremos crear una estructura para el código fuente, como en HTML o cualquier lenguaje, el programa debe determinar si la estructura se cumple. En caso contrario, no compilará.

2. Análisis Semántico. Tenemos entonces dos variables a resaltar: una acción y un accionado. El accionado es la parte de la acción sobre la que ésta se encuentra realizando sus operaciones; es el que realiza la operación por así llamarlo. Viendolo desde éste punto, nos encontramos que las acciones son: encender, apagar, abrir, cerrar. Y los accionados serán: ventilador y ventilación. Nuestro análisis semántico deberá determinar si se cumple la condición Acción - Accionado, en caso contrario, el programa no compilará.

3. Análisis Sintáctico. Aún cuando la lógica de Acción - Accionado haya sido satisfactoria, no hay como la lógica de lo que se puede y lo que no. Éste análisis revisa que las palabras cumplan con una lógica de si se puede o no. Un ventilador puede encenderse y apagarse pero no abrirse ni cerrarse. Las ventilaciones no pueden apagarse ni prenderse, sólo abrirse y cerrarse. Simplemente, buscamos que haya ésta lógica dentro del programa.

¿Ansiosos por un código fuente? En realidad el código fuente es muy personal y francamente siempre hay problemas para analizarlo, sin embargo, puedo poner fragmentos de mi programa y explicarlos con tal de que comprendan lo que se tiene qué hacer y sin quebrarse tanto la cabeza =P
   
Code:
    public void extraerPalabras(String archivo){ //Método de extracción de palabras
       try{
       BufferedReader bfr=new BufferedReader(new FileReader(archivo));
       String linea=bfr.readLine();
       while(linea!=null){
       StringTokenizer cadena=new StringTokenizer(linea);
       while(cadena.hasMoreTokens()){
       tokens.add(cadena.nextToken());
       }
          linea=bfr.readLine();
       }
       }catch(Exception ex){
          ex.printStackTrace();
       }
    }

Éste código sirve para extraer las palabras reservadas de un archivo de texto como nuestro código fuente y guardar cada palabra en un Vector. El Vector actuará como un arreglo, pero de tamaño indefinido excepto por la cantidad de elementos que se introduzcan en él.

La función StringTokenizer es una función de la librería Utils (java.utils.*) que en cuanto recibe una línea de texto, detecta las palabras separadas por espacios y las coloca en la variable que le indiquemos mientras cadena.hasMoreTokens() del bucle o ciclo While siga encontrando palabras en la línea de texto que se irán agregando al arreglo o cadena de las palabras reservadas o tokens tokens.add(cadena.nextToken())

Para mandar llamar el código fuente el programa se ejecuta en la línea de comandos como java Compilador Sistema.txt o según los nombres que se hayan utilizado:

   
Code:
public static void main(String[] args) throws IOException{
       if(args.length!=0){
       new Compilador().extraePalabras(args[0]);
       } else{
          System.out.println("Uso: Java Compilador [nombre_archivo]");
          System.exit(0);
       }
    }

Que desde luego es ejecutado por nuestra clase principal. El procedimiento del análisis requiere de comparar las palabras reservadas o alfabeto elemento por elemento:

   
Code:
for (int i = 0; i < j =" 0;" encontrado="true;" encontrado="=" encontrado="false;">0){
       System.out.println("Errores: "+error);
       System.exit(0);
       } else{
    System.out.println("Analisis lexico exitoso.");
Con lo cual lograrán que su análisis Léxico sea exitoso.

Por el momento, les dejo éso. Esperen pronto el análisis semántico y el sintáctico.

PD. No copien y peguen éste código como está, así no servirá. Sólo tiene propósitos de análisis.


Sólo un enlace al día, puro ocio:
http://banderalandia.myminicity.es/      <- Suma un habitante
http://banderalandia.myminicity.es/ind     <- Mejora la industria
http://banderalandia.myminicity.es/tra     <- Mejora el transporte
http://banderalandia.myminicity.es/sec    <- Mejora la seguridad
http://banderalandia.myminicity.es/env    <- Mejora el medio ambiente

http://jmephistos.elbruto.es

Perfil de rata loca de dos patas...
 
Read April 28, 2007, 08:39:10 AM #1
Xavok

Re: Analizador léxico en Java

Se ve bien el procedimiento al menos lo que muestras, a muchos de aquí me imagino que en por lo menos una materia nos lo pidieron como proyecto, después de ver las partes de un lenguaje formal, seria conveniente que fuera mas universal, como un diagrama de flujo (como forma básica) y dejar mas a la imaginación. Mi humilde opinión.
« Last Edit: April 28, 2007, 08:40:53 AM by Xavok »

 
Read April 18, 2008, 12:03:49 PM #2
Synyestro

Re: Analizador léxico en Java

Ummm reviviendo este post... xque no utilizar la clase Pattern y Matcher de java... digo para hacer expresiones regulares + robustas y dinamicas... esa es mi humilde opinion


MI PERFIL DE VENTA.

Rata #1: Miguel Angel Avendaño Concha aka "rayavenccx0, maxwell o vinsend" - Más info aqui
Rata #2: Adan Mishael Duarte Venegas aka "vamed15" - Más info aqui
 
Read April 18, 2008, 12:24:12 PM #3
kcoder24

Re: Analizador léxico en Java

Oras...  ^^ ni había visto este tema.

Pues yo tengo algunos ejemplos de un editor de fórmulas de un sistema que desarrolle pero ese está en VB.Net. Ahí si quieren luego lo posteo, aunque en ese me fuí directo a extraer tokens y despues la validación de sintaxis y semántica con diagramas de estados. El análisis léxico digamos que se hacía al vuelo dentro de la validación de la sintaxis y semántica  vergüenza

El problema que yo ví básicamente fue separar en tokens ya que como no he estudiado nunca el VB.Net pues mejor le metía un diagrama de estados. Alguien sabe si existen clases como en Java? Por cierto en Java el StringTokenizer te permite separar correctamente todos los tokens incluyendo los signos de puntuación, operadores etc?

Ummm reviviendo este post... xque no utilizar la clase Pattern y Matcher de java... digo para hacer expresiones regulares + robustas y dinamicas... esa es mi humilde opinion

Pero como implementarías las expresiones regulares para el análisis léxico ?  según entendí (la verdad ya no identifico mucho los objetivos de cada análisis) el análisis léxico simplemente busca identificar si los  tokens son válidos dentro del lenguaje, lo cual basta con simples comparaciones contra un diccionario y que se podría hacer con una búsqueda binaria o algo mas rebuscado que talvez en cuestión de performance funque mejor que la expresión regular.
 
Read April 18, 2008, 12:57:59 PM #4
Reza

Re: Analizador léxico en Java

si,, tienes razon ckoder24,, para mi lo mas complicado fue el analisis sintactico,,, jejeje, la vdd si sufri un buen cuando lo realice :p.

recuerdo que durante el analisis lexico hacia un vector, donde guardaba cada una de las palabras reservadas, variables, constantes,, pero con un identificador que era una sola letra... asi el analisis sintactico se me hacia mas facil :P..

digamos..

var a;

ahi guardaba en el vector (a,v,;) donde pues claro tenia un diccionario de esas letras, y ya nada mas comparaba hasta donde hubiera ";" :P... lo perro fueron los if anidados o con algun ciclo o ciclos dentro de ciclos... no¡¡¡¡ "malditos" recuerdos, jajaj xD:. zas saludos.
 
Read April 18, 2008, 02:06:16 PM #5
riftop

Re: Analizador léxico en Java

Yo por ahí tengo mi analizador en visual basic 6, convierte el código a lenguaje máquina. Y sí... que divertido era todo aquello. ROFL
 
Read April 18, 2008, 03:58:51 PM #6
Antuans

Re: Analizador léxico en Java

Yo tenia uno en Pascual, donde ingaos lo deje ¿?  (: i love pascal  XD
 
Read April 18, 2008, 04:48:26 PM #7
Mefistófeles

Re: Analizador léxico en Java

 chiflando apenas me fijé de esto y creo que ya perdí mi analizador :P bueno, ahí luego se los subo si de casualidad lo respaldé :para:


Sólo un enlace al día, puro ocio:
http://banderalandia.myminicity.es/      <- Suma un habitante
http://banderalandia.myminicity.es/ind     <- Mejora la industria
http://banderalandia.myminicity.es/tra     <- Mejora el transporte
http://banderalandia.myminicity.es/sec    <- Mejora la seguridad
http://banderalandia.myminicity.es/env    <- Mejora el medio ambiente

http://jmephistos.elbruto.es

Perfil de rata loca de dos patas...
 
Read April 18, 2008, 05:40:02 PM #8
Maki_bOo

Re: Analizador léxico en Java

Yo acabo de hacer mi parser y mi intérprete en Python para este semestre en la escuela. Y bueno ya tiene también funciones web, ya solo faltan detalles extras y estará totalmente terminado. Incluso el lenguaje podrá ser embebido en HTML como lo hace PHP.  orgulloso


Maki_bOo - Gaming Rig

-Processor: Core i7 2600K @ 3.4Ghz
-Memory: 16 GB RAM DDR3 Patriot Viper Xtreme Performance
- Drive 1: 120 GB SSD Corsair Force 3
- Drive 2: 500 GB HDD @ 7200 RPM w/16MB caché
- Videocard: ATI Radeon 6970 2GB DDR5
- Motherboard: ASUS Sabertooth P67
- Monitor: ASUS MS238 23' LED Full HD (2ms)
- Case:  Antec 1200
- Keyboard: Razer BlackWidow
- Mouse: Razer Imperator
- Mousepad: SteelSeries Qck+
- Headset: Razer Carcharias
- Sound System: Logitech Z-5500 5.1
 
Read April 18, 2008, 07:12:47 PM #9
_Camus_

Re: Analizador léxico en Java

Bahh eso es pan con miel, un analizador de expresiones lógicas para obtener formas tautológicas sí está mas mamey  gar!


 
Read April 18, 2008, 07:46:22 PM #10
riftop

Re: Analizador léxico en Java

Saben que está más mamey?

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Quitarle lo EMO al Camus. lol ROFL :pwnd: <-- We need this...
 
Read April 18, 2008, 08:16:29 PM #11
_Camus_

Re: Analizador léxico en Java

Gran aportación al tema de tu parte como siempre  orgulloso


 
Read April 18, 2008, 09:37:15 PM #12
riftop

Re: Analizador léxico en Java

Primero sales con tus jaladas y despues tiras shit OMG OMG :para:

"At least i have evidence to back up my words" - Asesino serial
 
Pages: [1]
Jump to:  

MySQL PHP Powered by SMF 1.1.13 | SMF © 2006-2011, Simple Machines LLC XHTML 1.0 CSS
Page created in 0.149 seconds with 19 queries.
Publicidad