Você está na página 1de 19

Anlisis Lxico: Esta fase se encarga de verificar si todas las cadenas pertenecen o no al

lenguaje. Es decir realiza un anlisis smbolo por smbolo indicando el token por cada uno de
los elementos reconocidos o el error en caso de no reconocer. Este anlisis no logra detectar
muchos errores por su caracterstica.
Anlisis Sintctico: En esta fase se analiza la estructura de las expresiones en base a
gramticas. Aqu ya se puede determinar si una estructura por ejemplo una expresin
matemtica mal formada. El anlisis que se realiza es jerarquico es decir en base a arboles de
derivacin que se obtienen de las mismas gramticas.
Anlisis Semntico: Este anlisis es ms difcil de formalizar, determina el tipo de los
resultados intermedios, comprobar que los argumentos que tienen un operador pertenecen al
conjunto de operadores posible, y si son compatibles entre si.
Bueno es lo nico que necesitamos saber por ahora, existen varias formas de hacer un
analizador lxico y sintatico el lxico no es problema es bastante sencillo... el problema
comienza cuando empiezas a realizar el analizador sintatico, seguramente no sabras ni por
donde empezar.
Formas de hacer un analizador sintatico

1.- Por fuerza bruta: consiste en programar como loco miles y miles de linea validando cada
linea de tu programa para ver si esta correcta o no la sintaxis. (No es recomendable)
2.- Utilizando javaCC y Jflex: Java cuenta con unas libreras que nos facilitan la creacin de
analizadores lxicos a partir de una dramtica dada... pero si cuentan con el mismo problema
que yo tuve que fue que el profesor nos prohibi usar estas libreras entonces esta opcin
queda descartada.
3.- Con un grafo o una maquina de estados: Esta opcin es la mas correcta despus de la
#2 y fue por la que opte, si buscan en Google sobre como hacer un analizador lxico con un
grafo encontraran mucha informacin pero en pdf y teora!! que es lo que no nos sirve
necesitamos cdigo.. ya que estamos seguramente desesperados por entregar nuestro
proyecto, as que comencemos con lo bueno.
En mi caso me toco hacer el analizador lxico y Sintatico de lenguaje C++ pero es igual para
cualquier lenguaje.

Menos charla y arranquemos!

Supongamos que queremos analizar este cdigo para ver si su sintaxis es correcta, usare un
cdigo corto y bsico como ejemplo.
#include <iostream.h>
void main(){
int a;
}

Bien ese es nuestro cdigo a analizar necesitamos crear nuestro diccionario de palabras,
pueden hacerlo en un bloc de notas o en un vector, debemos asignar un numero identificador
a cada palabra de nuestro diccionario.
Nos quedara as:
0 #include
1<
2 iostream.h
3>
4 void
5 main
6(
7)
8{
9 int
10 var
11 ;
12 }

Bueno ya que tenemos nuestro diccionario necesitamos hacer nuestro grafo correspondiente a
esta gramtica. Mas info de grafos
Aqu http://es.wikipedia.org/wiki/Grafo_(estructura_de_datos)
As quedara nuestro grafo... es necesario que lean el enlace hacia wikipedia para la definicin
de un grafo y puedan entenderlo.. de igual forma les explico rpidamente.

Lo que hace un grafo es definir un camino de un punto A a un punto B por ejemplo sabemos
que despus de un #include forzosamente tiene que ir un < entonces la palabra 0 nicamente

tiene conexin con la palabra 1 no puede ir otra cosa ningn otro carcter en lenguaje c++
podra ir un " envs de un < pero para nuestro ejemplo es arbitrariamente < entonces lo que
haremos con el grafo es indicar por que camino puede irse determinada palabra... ya que
dibujamos el grafo lo representamos como una matriz adyacente.

Marcamos con un 1 por donde podemos pasar y un 0 por donde no, el 0 dara un error si es
que queremos ir por ese camino.
Ya que tenemos nuestro diccionario y el grafo procedemos a programar XD
Abrimos netbeans y codificamos....
declaramos nuestras variables, nuestro grafo y nuestro diccionario.

Nuestra otra parte del cdigo

Y como se que son estudiantes holgazanes y por eso estn leyendo este post les dare todo el
cdigo para que solo lo copien y peguen x

import java.util.StringTokenizer
/*
*
*/

@authoBrakin

public class analizador_lexico {

static String diccionario[]={"#include","<","iostream.h",">","void","main","(","

","{","int","var",";",
"};static int grafo[][]={
0,1,0,0,0,0,0,0,0,0,0,0,0},
0,0,1,0,0,0,0,0,0,0,0,0,0},
0,0,0,1,0,0,0,0,0,0,0,0,0},
0,0,0,0,1,0,0,0,0,0,0,0,0},
0,0,0,0,0,1,0,0,0,0,0,0,0},
0,0,0,0,0,0,1,0,0,0,0,0,0},
0,0,0,0,0,0,0,1,0,0,0,0,0},
0,0,0,0,0,0,0,0,1,0,0,0,0},
0,0,0,0,0,0,0,0,0,1,0,0,0},
0,0,0,0,0,0,0,0,0,0,1,0,0},
0,0,0,0,0,0,0,0,0,0,0,1,0},
,0
,0,0,0,0,0,0,0,0,0,1}
};static String codigo
"#include <iostre
.h>n" +"vo
mai
(){n" +"int a ;n" +"}";static S
ing delimitador=" <>(){};";
static int Panterior=-1,Pactual=-1,linea=0;

public static void main(String[] args) {

StringTokenizer lineas=new StringTokenizer(codigo,"n"

;//CORTAMOS POR SALTOS DE

LINEAStringTokenizer
kens;while(lineas.hasMoreTokens()){//LEEMOS LINEA
LINEAlinea++;//incrementamos l
lineatokens=new StringTokenizer(lineas.nextToken(),delimitador,true);//CORTAMOS CADA
LINEA EN TOKENS SE
RADOSwhile(tokens.hasMoreTok
s()){
String token=tokens.nextToken().trim();

//visualizamos los tokens si queremos

if(!token.equals(""

){

System.out.println(toke
;Pactual=regre
(token);if(Panterior>0){if(gr
o[Panterior][Pactual]==0){System.out.println("ERROR DE SINTAXIS CERDA DE "+dicciona
rio[Pante
o
EN LINEA: "+linea

P
t
ior=Pactual;}}}}stati
int regresa(String token){for(int i=
i<diccionario.length;i++){ if(token.equals(diccionario)) return i; //REGRESAMOS LA
POSIC
N
E EL TOKEN EN EL VECTOR
}
if(Characte
isLetter(token.charAt(0)))
return 10; //REGRESAMOS LAPOSICION
E LA VARIABLE

L
C

Você também pode gostar