Académique Documents
Professionnel Documents
Culture Documents
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();
}
}
">" {
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.