Vous êtes sur la page 1sur 6

Explicacin Analizador:

Analizador Metodo procesar


public static void procesar(String archivo, ManejadorAnalizador manejador) throws Exception{
Analizador analizador = new Analizador(archivo);
analizador.setManejador(manejador);
while(true){
if(Analizador.YYEOF == analizador.yylex()) break;
}
}
Este es el metodo inicial para iniciar el proceso de analisis, crea un nuevo objeto Analizador con el
nombre del archivo como parametro y establece el manejador.
Este metodo se ejecuta hasta que la funcion yylex() retorne -1 que es igual al valor de YYEOF en la
clase; cuando dicha funcion retorna -1 es porque ya no se han encontrado mas tokens y el analisis
finaliza;
Paso Inicial Estado YYINITIAL
<YYINITIAL> {
"<" { apilarEstado(Etiqueta);}
{Prologo} {manejador.prologo(getPrologo());}
{Espacio} { }
{Comentario} {manejador.comentario(getComentario());}
{Cualquier} { error(yytext()); }
}
Si el analizador encuentra el caracter < entonces agrega el estado Etiquetas a la pila de estados.
Si el analizador encunetra el prologo regex = "<?"([^?]|[?][^>])*"?>" cuyo resultado puede ser
<?xml version="1.0" encoding="UTF-8"?> entonces le dice al menejador que ha encontrado el prologo
del documento y lo impre con el metodo manejador.prologo(getPrologo()); getPrologo() regresa el texto
que el analizador ha encontrado coincidente en el archivo que se esta analizando entonces solo retorna
el valor actual de yytext();
Si el analizador encuentra algun espacio ya sea salto de linea, tabulador, retorno de carro o salto de
pagina lo ignora.
Si el analizador encuentra ya sea caracters de (A-Z o a-z o _) o salto de linea, tabulador, retorno de carro
o salto de pagina o numeros del (0 al 9) o > o < o & o cualquier caracter que no sea un salto de
linea o retorno de carro entonces llama al metodo error ya que ha encontrado secuancias de caracteres
no validas; si el metodo error definido en el manejador devuelve false entonces la ejecucion del
analizador se detiene mostrando el mensaje de error Caracteres sin coincidencias, anlisis detenido
en: + la locacion actual = (nombre del archivo que se esta analizando + linea + columna).

Estado Etiqueta
<Etiqueta> {
{Identificador} {
apilarEtiqueta(yytext());
contenido="";
apilarEstado(Atributos);
}
">" {
manejador.etiquetaInicio(etiquetas, etiquetasContador, etiquetaActual, atributos);
retirarEstado();
apilarEstado(EtiquetaFin);
}
"/>" {
manejador.etiquetaInicio(etiquetas, etiquetasContador, etiquetaActual, atributos);
manejador.etiquetaFin(etiquetas, etiquetasContador, etiquetaActual, "", atributos);
retirarEtiqueta(etiquetaActual);
retirarEstado();
return 1;
}
{Comentario} { manejador.comentario(getComentario()); }
{Espacio} { }
{Cualquier} { error(yytext()); }
}
Si el analizador encuentra texto que coincida con el Identificador regex = {NombreInicio}
{CaracterNombre}*(":"{NombreInicio}{CaracterNombre}*)? Cuyo resultado puede ser
nombre o nombre:datos o nombre_valor:texto entonces el analizador agrega el valor de yytext()
(que contiene todo el texto coincidente) a la pila de etiquetas, establece el valor del contenido como
vacio y agrega el estado Atributos a la pila de estados.
Si el analizador encuentra el caracter > entonces le dice al manejador que imprima la etiqueta con sus
atributos respectivos con el metodo manejador.etiquetaInicio(etiquetas, etiquetasContador,
etiquetaActual, atributos); retira el estado mas reciente de la pila de estados con el metodo
retirarEstado(); y agrega el estado EtiquetaFin a la pila de estados;
Si el analizador encuentra la secuencia /> entonces el analizador imprime la etiqueta de inicio y la
etiqueta del final con los metodos:
manejador.etiquetaInicio(etiquetas, etiquetasContador, etiquetaActual, atributos);
manejador.etiquetaFin(etiquetas, etiquetasContador, etiquetaActual, "", atributos);
Retira la etiqueta actual de la pila de etiquetas con el metodo retirarEtiqueta(etiquetaActual);
Retira el ultimo estado de la pila de estados con el metodo retirarEstado();
Retorna 1 para volver a ejecutar el estado Etiqueta;
Si el analizador encuentra alguna secuencia de carcteres que se un comentario en xml regex =
"<!--"([^-]|([-][^-])|[-][-][^>])*"-->" cuyo resultado puede ser <!-- comentario entonces el analizador
imprime el comentario que se encontro con el metodo manejador.comentario(getComentario());
getComentario devuelve el valor actual de yytext().
Si el analizador encuentra algun espacio ya sea salto de linea, tabulador, retorno de carro o salto de
pagina lo ignora.
Si el analizador encuentra ya sea caracters de (A-Z o a-z o _) o salto de linea, tabulador, retorno de carro

o salto de pagina o numeros del (0 al 9) o > o < o & o cualquier caracter que no sea un salto de
linea o retorno de carro entonces llama al metodo error ya que ha encontrado secuancias de caracteres
no validas; si el metodo error definido en el manejador devuelve false entonces la ejecucion del
analizador se detiene mostrando el mensaje de error Caracteres sin coincidencias, anlisis detenido
en: + la locacion actual = (nombre del archivo que se esta analizando + linea + columna).
Estado Atributos
<Atributos> {
{Identificador}{Espacio}*"="{Espacio}*{Atributo} {
String texto = yytext();
String nombre = texto.substring (0, texto.indexOf('=')).trim();
String valor = texto.substring (texto.indexOf('=') + 1).trim();
char delimitador = valor.charAt(0);
valor = valor.substring(1, valor.lastIndexOf(delimitador));
atributos.put(nombre, decodificar(valor));
}
"/"?">" {
yypushback(1);
if(yytext().indexOf("/")>=0) yypushback(1);
retirarEstado();
}
{Espacio} { }
{Cualquier} { error(yytext()); }
}
Si el analizador encuentra texto que coincida con el Identificador regex = {NombreInicio}
{CaracterNombre}*(":"{NombreInicio}{CaracterNombre}*)? Cuyo resultado puede ser
nombre o nombre:datos o nombre_valor:texto seguido del macro Espacio cero o mas veces
seguido del signo igual seguido del macro Espacio cero o mas veces seguido del macro Atributo
entonces obtiene el nombre y valor del atributo y los agrega a la coleccion(HashMap) atributos con el
metodo atributos.put(nombre, decodificar(valor));
Si el analizador encuentra la secuencia / cero o una vez seguido por > entonces el analizador
regresa el valor de yytext() - 1 osea yypushback(1) para que sea analizado nuevamente; Si el analizador
encuentra / en yytext() entonces vulve a llamar el metodo yypushback(); y por ultimo retira el ultimo
estado de la pila de estados.
Si el analizador encuentra algun espacio ya sea salto de linea, tabulador, retorno de carro o salto de
pagina lo ignora.
Si el analizador encuentra ya sea caracters de (A-Z o a-z o _) o salto de linea, tabulador, retorno de carro
o salto de pagina o numeros del (0 al 9) o > o < o & o cualquier caracter que no sea un salto de
linea o retorno de carro entonces llama al metodo error ya que ha encontrado secuancias de caracteres
no validas; si el metodo error definido en el manejador devuelve false entonces la ejecucion del
analizador se detiene mostrando el mensaje de error Caracteres sin coincidencias, anlisis detenido
en: + la locacion actual = (nombre del archivo que se esta analizando + linea + columna).
Estado EtiquetaFin
<EtiquetaFin> {
{Contenido} {
String texto = yytext();
contenido += texto;
}

"</" {
retirarEstado();
apilarEstado(ObtenerEtiquetaFin);
}
"<" {
retirarEstado();
apilarEstado(EtiquetaAnidada);
apilarEstado(Etiqueta);
}
{Comentario} { manejador.comentario(getComentario()); }
{Cualquier} { contenido += yytext(); error(yytext()); }
}
Si el analizador encuentra la secuencia macro Espacio o cualquier caracter
que no sea < o > cero o mas veces entonces agrega el texto entoncontrado (yytext()) a la variable
contenido.
Si el analizador encuentra la secuencia </ retira el ultimo estado de la pila de estados y agrega el
estado ObtenerEtiquetaFin a la pila de estados.
Si el analizador encuentra el caracter < entonces retira el ultimo estado de la pila de estados con el
metodo retirarEstado(); agrega el estado EtiquetaAnidad a la pila de estados con el metodo
apilarEstado(EtiquetaAnidada); y agrega el estado Etiqueta a la pila de estados.
Si el analizador encuentra alguna secuencia de carcteres que se un comentario en xml regex =
"<!--"([^-]|([-][^-])|[-][-][^>])*"-->" cuyo resultado puede ser <!-- comentario entonces el analizador
imprime el comentario que se encontro con el metodo manejador.comentario(getComentario());
getComentario devuelve el valor actual de yytext().
Si el analizador encuentra ya sea caracters de (A-Z o a-z o _) o salto de linea, tabulador, retorno de carro
o salto de pagina o numeros del (0 al 9) o > o < o & o cualquier caracter que no sea un salto de
linea o retorno de carro entonces agrega los contenidos de yytext() a contenido y llama al metodo error
ya que ha encontrado secuancias de caracteres no validas; si el metodo error definido en el manejador
devuelve false entonces la ejecucion del analizador se detiene mostrando el mensaje de error
Caracteres sin coincidencias, anlisis detenido en: + la locacion actual = (nombre del archivo que se
esta analizando + linea + columna).

Estado ObtenerEtiquetaFin
<ObtenerEtiquetaFin> {
{Identificador} {
String etiquetaFin = yytext();
manejador.etiquetaFin(etiquetas, etiquetasContador, etiquetaActual, decodificar(contenido),
atributos);
retirarEtiqueta(etiquetaFin);
}
{Espacio}* { }
">" {
retirarEstado();
}
}

Si el analizador encuentra texto que coincida con el Identificador regex = {NombreInicio}


{CaracterNombre}*(":"{NombreInicio}{CaracterNombre}*)? Cuyo resultado puede ser
nombre o nombre:datos o nombre_valor:texto entonces el analizador imprime la etiqueta de fin
con el metodo manejador.etiquetaFin(etiquetas, etiquetasContador, etiquetaActual,
decodificar(contenido), atributos); y retira la etiqueta actual/fin = yytext(); de la pila de etiquetas.
Si el analizador encuentra algun espacio ya sea salto de linea, tabulador, retorno de carro o salto de
pagina lo ignora.
Si el analizador encuentra el caracter > entonces el analizador retira el ultimo estado de la pila de
estados.
Estado EtiquetaAnidada
<EtiquetaAnidada> {
"<" { apilarEstado(Etiqueta); }
"</" {
retirarEstado();
apilarEstado(ObtenerEtiquetaFinaAnidada);
}
{Espacio} {}
{Comentario} { manejador.comentario(getComentario()); }
{Cualquier} { error(yytext()); }
}
Si el analizador encuentra el caracter < entonces agrega el estado Etiqueta a la pila de etiquetas.
Si el analizador encunetra la secuencia </ entonces retira el ultimo estado de la pila de estados y
agrega el estado ObtenerEtiquetaFinAnidada.
Si el analizador encuentra algun espacio ya sea salto de linea, tabulador, retorno de carro o salto de
pagina lo ignora.
Si el analizador encuentra alguna secuencia de carcteres que se un comentario en xml regex =
"<!--"([^-]|([-][^-])|[-][-][^>])*"-->" cuyo resultado puede ser <!-- comentario entonces el analizador
imprime el comentario que se encontro con el metodo manejador.comentario(getComentario());
getComentario devuelve el valor actual de yytext().
Si el analizador encuentra ya sea caracters de (A-Z o a-z o _) o salto de linea, tabulador, retorno de carro
o salto de pagina o numeros del (0 al 9) o > o < o & o cualquier caracter que no sea un salto de
linea o retorno de carro entonces llama al metodo error ya que ha encontrado secuancias de caracteres
no validas; si el metodo error definido en el manejador devuelve false entonces la ejecucion del
analizador se detiene mostrando el mensaje de error Caracteres sin coincidencias, anlisis detenido
en: + la locacion actual = (nombre del archivo que se esta analizando + linea + columna).
Estado ObtenerEtiquetaFinAnidada
<ObtenerEtiquetaFinaAnidada> {
{Identificador} {
String etiquetaFin = yytext();
manejador.etiquetaFin(etiquetas, etiquetasContador, etiquetaActual, "", atributos);
retirarEtiqueta(etiquetaFin);
}
{Espacio}* { }

">" {
retirarEstado();
return 1;
}
}
Si el analizador encuentra texto que coincida con el Identificador regex = {NombreInicio}
{CaracterNombre}*(":"{NombreInicio}{CaracterNombre}*)? Cuyo resultado puede ser
nombre o nombre:datos o nombre_valor:texto entonces imprime la etiqueta de fin con el metodo
manejador.etiquetaFin(etiquetas, etiquetasContador, etiquetaActual, "", atributos) y retira la etiqueta de
fin encontrada (yytext()) de la pila de etiquetas.
Si el analizador encuentra algun espacio ya sea salto de linea, tabulador, retorno de carro o salto de
pagina lo ignora.
Si el analizador encuentra el > entonces retira el ultimo estado de la pila de estados y retorna 1 cuyo
estado es Etiqueta.

Notas:
Si alguna secuencia de expresiones regulares no se da a entender del entonces consulte el archivo
Analizador.flex
yytext() devuelve la secuencia de caracteres coincidentes en el analisis actual.
yybegin(estado) aplica el estado lexico recibido.
Cuando nos referimos a agregar un estado a la pila decimos que el metodo apilarEstado(int estado)
incrementa el valor de estadosContador por 1 y agrega el estado recibido a la pila y lo aplica con el
metodo yybegin(estado);
Cuando nos referimos a retirar el ultimo estado decimos que el metodo retirarEstado () decrementa el
valor de estadosContador por 1 y establce el valor del estado recibido en la pila como 0 y devuelve el
nuevo estado.
Descargar jflex de http://jflex.de/release/jflex-1.6.1.zip y agregarlo al proyecto en netbeans.

Vous aimerez peut-être aussi