Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FACULTA DE INGENIERA
Analizador lxico
Utilizando Flex
javascript
MATERIA: LENGUAJES FORMALES Y AUTMATAS
MAESTRA: ING. ROSALES GARCA JOSEFINA
INTEGRANTES
BAZN VERA MARIELA
CANCINO RAMREZ MAURICIO
GANTE VZQUEZ EDUARDO
15/05/2015
Introduccin
Analizador lxico
El principal objetivo del analizador lxico es leer el flujo de caracteres de entrada y transformarlo
en una secuencia de componentes lxicos que utilizara el analizador sintctico.
Al tiempo que realiza esta funcin, el analizador lxico se ocupa de ciertas labores de limpieza".
Entre ellas esta eliminar los blancos o los comentarios. Tambin se ocupa de los problemas
que pueden surgir por los distintos juegos de caracteres o si el lenguaje no distingue maysculas
y minsculas.
Para reducir la complejidad, los posibles smbolos se agrupan en lo que llamaremos categoras
lxicas. Tendremos que especificar qu elementos componen estas categoras, para lo que
emplearemos expresiones regulares. Tambin ser necesario determinar si una cadena
pertenece o no a una categora, lo que se puede hacer eficientemente mediante autmatas de
estados finitos.
Funcin del analizador lxico
Es la primera fase de un compilador. Su principal funcin consiste en leer la secuencia de
caracteres del programa fuente, carcter a carcter, y elaborar como salida la secuencia de
componentes lxicos que utiliza el analizador sintctico. El analizador sintctico emite la orden
al analizador lxico para que agrupe los caracteres y forme unidades con significado propio
llamados componentes lxicos (tokens). Los componentes lxicos representan:
o Palabras reservadas: if, while, do,
o Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas,
o Operadores: =, >, <, >=, <=, +, *,
o Smbolos especiales: ;, ( ), { },
o Constantes numricas. literales que representan valores enteros y flotantes.o Constantes de
carcter: literales que representan cadenas de caracteres.
Pgina 1
El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos
asociados. Los tokens influyen en las decisiones del anlisis sintctico, y los atributos, en la
traduccin de los tokens. En la prctica los componentes lxicos suelen tener solo un atributo.
Para efectos de diagnstico, puede considerarse tanto el lexema para un identificador como el
nmero de lnea en el que se encontr por primera vez. Esta informacin puede ser almacenada
en la tabla de smbolos para el identificador (estructura de datos).
Para la cadena E=M*C**2 de ejemplo, los componentes lxicos y los valores de atributo
asociado son:
Pgina 2
Tome en cuenta que ciertas parejas no necesitan un valor de atributo. Los atributos relacionados
con ese token debern ser conservados y transferidos a alguna estructura de datos para que
sean empleados en las siguientes etapas del anlisis.
Manejo de Buffer de entrada
Existen algunos aspectos de eficiencia relacionados con el manejo de buffer. Primero se
menciona un esquema de doble buffer de entrada que resulta til como pre-anlisis de la
entrada para identificar los componentes lxicos. El segundo esquema introduce algunas
tcnicas tiles para aumentar la eficiencia del analizador lxico, empleando centinelas.
Hay veces en que el analizador lxico necesita analizar previamente varios caracteres, adems
del lexema para un patrn, antes de poder anunciar una concordancia. Se pueden emplear
muchos esquemas de manejos de buffer, pero, aqu tan solo se sealarn algunos principios
bsicos.
Parejas de buffer Se utiliza un buffer dividido en dos mitades de N (1024 512) caracteres
cada una, Se leen N caracteres de entrada en cada mitad del buffer con un orden de lectura del
sistema, en vez de invocar una instruccin de lectura para cada carcter de entrada. Si quedan
menos de N caracteres en la entrada, entonces se lee un carcter especial eof en el buffer
despus de los caracteres de entrada. Es decir, eof marca el final del archivo fuente y es distinto
a cualquier carcter de la entrada.
Se mantienen dos apuntadores en el buffer de entrada. La cadena de caracteres entre los dos
apuntadores es el lexema en curso. Al principio, los dos apuntadores apuntan al primer carcter
del prximo lexema que hay que encontrar. Uno de ellos, apuntador delantero, examina hacia
adelante hasta encontrar una concordancia con un patrn. Una vez determinado el siguiente
lexema, el apuntador delantero se coloca en el carcter de su extremo derecho. Despus de
haber procesado el lexema, ambos apuntadores se colocan en el carcter situado
inmediatamente despus del lexema. Con este esquema se pueden considerar los comentarios
y los espacios en blanco como patrones que no producen componentes lxicos. Centinela
Corrigiendo la deficiencia del mtodo anterior para reducir la necesidad de dos pruebas para
cada avance del apuntador delantero. Se amplia cada mitad del buffer para admitir un carcter
centinela al final. De esta manera se vuelve mas eficiente el proceso de cargar del buffer,
realizando una carga en cada mitad.
Pgina 3
Pgina 4
Expresiones Regulares
El origen de las expresiones regulares surge de la teora de autmatas y la teora de lenguajes
formales, ambas parte de la ciencias computacionales terica. Este campo estudia los modelos
computacionales (autmata) y la manera de describir y clasificar los lenguajes formales. Un
lenguaje formal puede ser especificado de varias maneras, tales como:
Cadenas producidas por alguna gramtica formal.
Cadenas producidas por expresiones regulares.
Cadenas aceptadas por algunos autmatas tales como las mquinas de Turing o autmatas
de estado finito.
A las expresiones regulares frecuentemente se les llaman patrones, ya que son expresiones
que describen a un conjunto de cadenas. Frecuentemente son usadas para dar una descripcin
concisa de un conjunto, sin tener que listar todos sus elementos.
Las expresiones regulares pueden ser expresadas en trminos de la teora de lenguajes
formales. Consisten de constantes y operadores que denotan el conjunto de cadenas y
operaciones sobre estos conjuntos, respectivamente. Dado un alfabeto las siguientes
constantes son definidas:
o Conjunto vaco: L( ) denota el conjunto { }
o Cadena vaca: L( ) denota el conjunto { }
o Carcter del alfabeto: L( a ), a elemento de denota el conjunto { a }
Operaciones bsicas en expresiones regulares
Seleccin de alternativas (unin) Si r y s son expresiones regulares, entonces r | s es una
expresin regular que define cualquier cadena que concuerda con r o con s. En trminos de
lenguajes decimos que r | s es la unin de los lenguajes de r y s, o L(r | s) = L(r) U L(s) = { |
est en r o est en s }.
ejemplo:
o L(a | b) = L(a ) U L(b) = { a, b }
o L(a | ) = { a, }
o L(a | b | c | d ) = { a, b, c, d }
Concatenacin La concatenacin de dos expresiones regulares r y s se escribe como rs
(yuxtaposicin) y corresponde a cualquier cadena que sea la concatenacin de dos cadenas,
con la primera de ellas correspondiendo a r y la segunda a s. Por ejemplo la expresin regular
ab corresponde a la cadena { ab }, mientras que la expresin regular (a | b)c corresponde a las
cadenas { ac, bc }. De esta forma la operacin de concatenacin para expresiones regulares se
puede definir como L(rs) = L(r) L(s) = { | esta en r y esta en s }.
ejemplo:
o L(a | b) c = L(a | b) L(c) = { a, b } {c} = { ac, bc }
o L(ab|c)(d|ef)=L(ab|c)L(d|ef)={ab,c}{d,ef}={abd, abef, cd, cef}
Repeticin (cerradura de Kleene) Se escribe r*, donde r corresponde a la expresin regular.
La expresin regular r* corresponde a cualquier concatenacin finita de cadenas, cada una de
las cuales corresponde a r. Por ejemplo, la expresin regular a* corresponde a las cadenas { ,
a, aa, aaa, }, (concuerda con por que es la concatenacin de ninguna cadena
concordante con a). En trminos de lenguaje podemos decir que:
Pgina 5
ejemplo:
o L(a|b)* = {a, bb}* = {,a,bb,aa,abb,bba,bbbb,aaa,abba,abbbb,...}
o L(a | b*) = {a, b*} = { , a, b, bb, bbb, ...}
o L(ab|c)* = {ab,c}* = {, ab, c, abab, abc, cab, cc, ababab,...}
Para evitar los parntesis se asume que la repeticin tiene la precedencia mas alta, luego la
concatenacin y al final la unin. Si no existiera ambigedad los parntesis pueden ser omitidos
Por ejemplo , (ab)c se escribe como abc y a|(b(c*)) puede ser escrito como a|bc*.
De manera que los lenguajes regulares deben su nombre al hecho de que presentan
regularidades o repeticiones de los mismo componentes, como por ejemplo el lenguaje L1:
L1={ab, abab, ababab, abababab, ...}
As pues, una expresin regular se construye a partir de expresiones regulares ms simples
utilizando un conjunto de reglas definitorias (operaciones bsicas). Cada expresin regular r
representa un lenguaje L(r). Las reglas de definicin especifican como se forma L(r) combinando
de varias maneras los lenguajes representados por las subexpresiones de r.
Se dice que un lenguaje designado por una expresin regular es un conjunto regular. Es
importante recordar que la especificacin de una expresin regular es un ejemplo de definicin
recursiva.
Definicin regular: Es una forma de simplificacin, dando un nombre a las expresiones regulares
y definiendo nuevas expresiones regulares utilizando dichos nombres como si fueran smbolos.
Por ejemplo, podramos desarrollar una expresin regular para una secuencia de uno o mas
dgitos, generando inicialmente una definicin regular para un digito.
digito = 0 | 1 | 2 | | 9 (definicin regular)
digito digito* (expresin regular para nmeros enteros sin signo)
Ahora estamos en posicin de elaborar una definicin de expresiones regulares para la
identificacin de los componentes de un lenguaje determinado. Los tokens de lenguajes de
programacin tiende a caer dentro de varias categoras limitadas que son bastante
estandarizadas, como palabras reservadas, smbolos especiales, identificadores y literales
(numrica/cadena).
Por ejemplo los identificadores en la mayora de los lenguajes de programacin es el conjunto
de cadenas de letras y dgitos que empiezan con una letra. Para ello generamos las definiciones
regulares para letra y digito:
letra = a | b | c | | z | A | B | Z
digito = 0 | 1 | 2 | | 9
identificador = letra ( letra | digito )*
Pgina 6
Los nmeros con signo son literales numricas constituidas por el punto decimal despus de
un digito y por una literal que represente la parte del exponente. Con esta informacin
desarrollamos las definiciones regulares y las expresiones regulares necesarias:
((+||)digito digito*) ((. digito)|) ((E(+||)digito)|)
entero = (+||) digito digito*
fraccin = ( . digito ) |
exponente = ( E ( + | | ) digito ) |
numero = digito fraccin exponente
Esta definicin establece que fraccin es un punto decimal seguido de uno o mas dgitos, o
esta ausente. Un exponente, que es E seguido de un signo + - ausente, seguidos de uno o
mas dgitos, o la ausencia de exponente. Tome en cuanta que, como mnimo debe existir un
dgito despus del punto. De manera que numero concuerda con 1 y con 1.0.
Abreviaturas en la notacin
o Uno o ms casos el operador unitario postfijo + significa uno o ms casos de, de manera
que la expresin regular r que designa al lenguaje L(r), entonces r+ es una expresin que
designa al lenguaje L(r)+ . As la expresin regular a+ representa al conjunto de todas las
cadenas de una o ms a. El operador + tiene la misma precedencia que la repeticin, las
identidades algebraicas son r* = r | y r + = r r*.
o Cero o un caso el operado unitario postfijo ? significa cero o un caso de. La notacin r?
es la abreviatura de r | . Si r es una expresin regular, entonces (r)? es una expresin regular
que designa el lenguaje L(r) U { }.
o Clases de caracteres una clase abreviada de caracteres como [a z] designa la expresin
regular a | b | c | | z.
A menudo en la descripcin de los tokens de lenguaje de programacin utilizamos expresiones
regulares, algunas cadenas se pueden definir mediante varias expresiones regulares
diferentes, Por ejemplo, cadenas tales como if y while podran se identificadores o palabras
clave.
Una definicin de lenguaje de programacin debe establecer cual interpretacin se observar,
y las expresiones regulares por si mismas no pueden hacer esto. En realizad, una definicin de
lenguaje debe proporcionar reglas de no ambigedad que explicaran cual significado es el
conveniente para cada uno de tales casos.
Existen dos reglas bsicas que suponen tales casos:
La primera establece que, cuando una cadena puede ser identificador o palabra clave, se
prefiere por lo general la interpretacin como palabra clave.
La segunda establece que, cuando una cadena puede ser un token simple o una secuencia de
varios tokens, por lo comn se prefiere la interpretacin del token simple. Esta preferencia se
conoce a menudo como el principio de sub-cadena ms larga.
Una cuestin que surge en el principio de sub-cadena ms larga es lo referente a los
delimitadores de tokens, o caracteres que implican que una cadena ms larga en el punto donde
Pgina 7
aparecen no pueden representar un token. Los caracteres que son parte no ambigua de otros
tokens son delimitadores. Por ejemplo xtemp=ytem, el signo de = sirve como delimitador pues
no forma parte de los identificadores. Los espacios en blanco, los retornos de lnea y los
caracteres de tabulacin generalmente se asumen como delimitadores de token.
De esta manera el reconocimiento de componentes lxicos podra realizarse partiendo del
conjunto de cadenas dadas por expresiones regulares. Por ejemplo:
Para este fragmento de lenguaje, el analizador lxico reconocer las palabras clave if, else, al
igual que los lexemas representados por opRelacion, identificador, nmero y delimitador.
Aun cuando las expresiones regulares son un mecanismo poderoso de definicin de lenguajes,
es necesario construir una herramienta computacional que nos permita su implementacin, para
ello se emplean los autmatas de estado finito. Es decir que, las expresiones regulares debern
ser transformadas a algn tipo de mquina de estados fcil de programar.
Javascript
Javascript es un lenguaje con muchas posibilidades, utilizado para crear pequeos programas
que luego son insertados en una pgina web y en programas ms grandes, orientados a objetos
mucho ms complejos. Con Javascript podemos crear diferentes efectos e interactuar con
nuestros usuarios.
Este lenguaje posee varias caractersticas, entre ellas podemos mencionar que es un lenguaje
basado en acciones que posee menos restricciones. Adems, es un lenguaje que utiliza
Windows y sistemas X-Windows, gran parte de la programacin en este lenguaje est centrada
en describir objetos, escribir funciones que respondan a movimientos del mouse, aperturas,
utilizacin de teclas, cargas de pginas entre otros.
Es necesario resaltar que hay dos tipos de JavaScript: por un lado est el que se ejecuta en el
cliente, este es el Javascript propiamente dicho, aunque tcnicamente se denomina Navigator
JavaScript. Pero tambin existe un Javascript que se ejecuta en el servidor, es ms reciente y
se denomina LiveWire Javascript.
Pgina 8
Buscadores de Informacin
Tambin podemos encontrar o crear cdigos para insertarlos en las pginas como:
Reloj
Contadores de visitas
Fechas
Calculadoras
Validadores de formularios
Detectores de navegadores e idiomas
Cmo identificar cdigo Javascript?
El cdigo javascript podemos encontrarlo dentro de las etiquetas <body></body> de nuestras
pginas web. Por lo general se insertan entre: <script></script>. Tambin pueden estar
ubicados en ficheros externos usando:
<script type="text/javascript" src="micodigo.js"></script>
Algunas caractersticas del lenguaje son:
Su sintaxis es similar a la usada en Java y C, al ser un lenguaje del lado del cliente este es
interpretado por el navegador, no se necesita tener instalado ningn Framework.
Variables: var = Hola, n=103
Condiciones: if(i<10){ }
Ciclos: for(i; i<10; i++){ }
Arreglos: var miArreglo = new Array(12, 77, 5)
Funciones: Propias del lenguaje y predefinidas por los usuarios
Comentarios para una sola lnea: // Comentarios
Comentarios para varias lineas:
/*
// Comentarios
*/
Permite la programacin orientada a objetos: document.write("Hola");
Pgina 10
Las variables pueden ser definidas como: string, integer, flota, bolean simplemente utilizando
var. Podemos usar + para concatenar cadenas y variables.
Es compatible con navegadores?
Javascript es soportado por la mayora de los navegadores como Internet Explorer, Netscape,
Opera, Mozilla Firefox, entre otros.
Con el surgimiento de lenguajes como PHP del lado del servidor y Javascript del lado del cliente,
surgi Ajax en acrnimo de (Asynchronous Javascript And XML). El mismo es una tcnica para
crear aplicaciones web interactivas. Este lenguaje combina varias tecnologas:
HTML y Hojas de Estilos CSS para generar estilos.
Implementaciones ECMAScript, uno de ellos es el lenguaje Javascript.
XMLHttpRequest es una de las funciones ms importantes que incluye, que permite
intercambiar datos asincrnicamente con el servidor web, puede ser mediante PHP, ASP, entre
otros.
Debemos tener en cuenta que aunque Javascript sea soportado en gran cantidad de
navegadores nuestros usuarios pueden elegir la opcin de Activar/Desactivar el Javascript en
los mismos.
Pgina 11
Pgina 12
Pgina 13
Pgina 14
Autmatas
Palabras reservadas.(Var | For | (Letra)*. (Letra)+ | <(Letra)+ | </letra+ | funcin | eval | parsenInt |
parsenFloat | escape | Unescape | Isnan )
Pgina 15
Identificadores ({letra}+|{letra}+{digito}+)
Letra= L
Digito = D
Pgina 16
Pgina 17
Comentarios: (// (digito | letra | _ )* | (/* (digito | letra | _ )* | (digito | letra |_))*/
Pgina 18
Conclusiones
Cancino ramirez Mauricio
Fue toda una confusin en un principio ya que no sabamos como atacar el programa, para ser honesto
no puse mucha atencin en las dos clases que nos dieron de flex, asi que para remediar este dilema nos
dimos a la tarea de ver muchas paginas e instructivos para saber como funcionaba flex, una vez que
supimos como trabajaba comenz el ensamble del programa la parte de lectura del archivo y escritura
fue sencillo, algo que nos llevo un poco de tiempo fue la impresin de los caracteres y que cada carcter
fuera en la lnea que le correspondiera, queramos que todas las reglas que leyera de una lnea tambin
fueran impresos en una lnea algo que nos fue imposible ya que cada regla que se imprimia se desplazaba
un lugar y los carateres ya no quedaban en su lugar, la solucin fue que cada regla fuera impresa en
lneas diferentes. Por la parte de teora investigamos todo lo referente a los analizadores lxicos y sus
funciones, al igual con el lenguaje javascrit que fue el lenguaje que nos toco. El programa quedo y la
parte teorica un poco tarde pero la misin se cumplio .
Referencias
http://www.paginasprodigy.com/edserna/cursos/compilador/notas/Notas2.pdf
http://www.maestrosdelweb.com/que-es-javascript/
Pgina 19