1. En un compilador, el análisis lineal se llama análisis lineal o exploración. Por análisis lineal entendemos la cadena de caracteres que constituye el programa fuente se lee de izquierda a derecha y se agrupan en componentes léxicos, que son secuencias de caracteres que tiene un significado colectivo. Por ejemplo, en análisis léxico los caracteres de las siguientes proposiciones de asignación
2. Los espacios en blanco (delimitadores) que separan los caracteres de estos componentes léxicos normalmente se eliminan durante el análisis léxico.
3. Una expresión regular denota un conjunto de secuencias de símbolos válidas que se construyen en base al alfabeto de un lenguaje. Generalmente estos conjuntos se representan como: Es una expresión regular que denota el conjunto vacío (el conjunto no contiene secuencias de símbolos).
4. Una secuencia de símbolos S es una expresión regular que denota a un conjunto que contiene a S. Operaciones sobre Lenguajes Es una expresión regular que denota al conjunto que contiene la secuencia vacía.
5. *Son una notación para definir lenguajes *Se ha demostrado que pueden expresar la clase de los lenguajes regulares * Permiten hacer una definición algebraica de un lenguaje * Se expresa el lenguaje de manera declarativa
6. Dadas dos expresiones regulares E1, E2, el resultado de aplicar cualquiera de estas tres operaciones, da como resultado otra expresión regular: *Unión (E1 ∪ E2) = {x | x ∈ E1 ´ox ∈ E2 ´o x ∈ E1 ∩ E2}. *Concatenación E1 ・ E2 = {xy | x ∈ E1, y ∈ E2} *Clausura o Estrella de Kleene (E1* ) = ∪ i>=E1i
7. Construir una expresión regular es realizar operaciones sobre el alfabeto de un lenguaje. Podemos decir que el lenguaje, en su aspecto de léxico, está conformado por las operaciones Unión de L y M . LUM = { S | S está en L ó S está en M } Concatenación de L y M. LM = { st | s está en L y t está en M}
8. Cerradura Kleene. (L se repite de 0 a infinito) Cerradura Positiva. ( L se repite de 1 a infinito).
9. Como se ve, las expresiones regulares son operaciones que se realizan sobre conjuntos de símbolos que pertenecen al alfabeto de un lenguaje. Estos conjuntos se describen colocando a los símbolos que pertenecen a ellos entre llaves. Por ejemplo, los caracteres que ubicamos como letras podrían conformar el conjunto {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}
10. Si los elementos del conjunto tienen un orden conocido o asociado al código ASCII se puede describir colocando el primer símbolo y el último separados por un guión (-) como {A-Z a-z} Para hacer más simple la construcción de una expresión regular, se designa bajo un nombre al conjunto con el cual se trabajará. así el conjunto letra se puede describir como L = {A-Z a-z}
11. Cuando a un conjunto o a una expresión regular se le da un nombre, ésta recibe el nombre de definición regular. Así, la expresión regular para un identificador será: ID=L (L | D | G) * si las definiciones sobre las cuales está construida son: L= {A-Z a-z} D = {0123456789} G = {_}
12. Por ejemplo, en Ada los identificadores están formados por letras, dígitos o guiones, pero el guión no puede ser el último caracter. La expresión regular con la cual se puede conformar el patrón para esta unidad de léxico puede ser: ID_ada = L (L | D) * (G (L | D ) + ) * U na expresión regular es un método formal para describir un patrón y puede ser empleada para construir un analizador léxico que lo reconozca en una computadora. De hecho, la expresión sufre una serie de transformaciones para llegar a ser explotada como tabla:
13. Expresión Regular se convierte en Autómata Finito No deterministico (NFA) se convierte en Autómata Finito Deterministico (DFA) que se representa como Tabla
14.
15. Un NFA esa un modelo matemático que consiste de: 1.- Un conjunto de estados. 2.- Un conjunto de símbolos de entrada. 3.- Una función de transición que corresponde pares estado-símbolo a conjuntos de estados. 4.- Un estado So que denota como el estado inicial. 5.- Un conjunto de estados F que denotan los estados de aceptación o finales. Un NFA no tiene restricciones para que exista mas de una transición con el mismo nombre a diferentes estados
16. por lo que en una representación tabular no es posible determinar de manera única el estado destino para un símbolo determinado. Por ejemplo, el siguiente diagrama representa la expresión (a | b)* a b b
17. Un DFA es un caso especial de NFA en el que ningún estado tiene transiciones para diversos estados bajo el mismo símbolo y no se permiten transiciones épsilon. Los diagramas de transición son autómatas determinísticos. Por ejemplo, el DFA de (a | b)* a b b puede ser:
18. que podría ser muy aproximado al diagrama de transición que construiríamos para la expresión.
19.
20. Para la implementación de la tabla de símbolos, nos hemos ayudado de la librería STL . Hemos hecho uso del contenedor STL_HASHMAP. El acceso se realiza aplicando una función hash sobre el char * del identificador del símbolo. Para mayor legibilidad y facilidad, hemos implementado la clase c_tabla_simbolos. Realiza las operaciones que necesitamos, y se las implementa haciendo uso del citado contenedor hash.
21. Debido a que necesitaremos más de una tabla en determinados momentos, y a su vez, una jerarquía entre las tablas, hemos implementado también la clase c_almacen_tablas. Dicha clase hace uso del contenedor STL_STACK. A continuación se muestran los diagramas de las clases implementadas en notación UML.
24. El método show de la clase c_tabla_simbolos sirve para llamar a los métodos show de cada símbolo almacenado. De esa manera se realiza el volcado pedido. En cuanto a la clase c_almacen_tablas, hemos implementado las operaciones avanzar, retroceder y enderezar. Sirven para poder movernos dentro de la pila sin perder elementos. Esto significa, que en un momento dado, podemos ejecutar avanzar sobre la pila, y la cima pasa a ser la tabla de símbolos previa.
25. Hemos supuesto que esto puede ser provechoso para las operaciones en las que haya que buscar si un símbolo se encuentra en la tabla de símbolos actual o en cualquiera de las tablas previas de la jerarquía. Al utilizar internamente dos pilas, una llamada posterior a retroceder dejaría la pila en su situación original. Enderezar se utiliza para regresar la pila a su posición original desde cualquier posición.
26. La clase Parse::Lex nos permite crear un analizador léxico. La estrategia seguida es mover el puntero de búsqueda dentro de la cadena a analizar utilizando conjuntamente el operador pos() y el ancla . > cat -n tokenizer.pl 1 #!/usr/local/bin/perl 2 3 require 5.004; 4 #BEGIN { unshift @INC, "../lib"; } 5 6 $^W = 0; 7 use Parse::Lex; 8 print STDERR "Version $Parse::ALex::VERSION" ;
30. 38 } 39 } 40 41 __END__ 42 1+2-5 43 "This is a multiline 44 string with an embedded "" in it" 45 this is an invalid string with a "" in it"
31. Entrada: function main(){ /* Otra prueba mas ! */ var a = 3 // var b = 2 /* a debería estar en la tabla de símbolos, b no ! */ var i var v = new Array (101) for (i=0; i<100; i+=5){ v[i]=i; }
32. for (i=0; i<100; i+=5){ document.write(v[i], " "); } document.write(""); } main(); // Fin de la prueba Salida: Leyendo del fichero 'prueba10'
33. ANA RAQUEL GARCIA FALLA YUDY MERCEDES LOSADA ROMERO
34. *En que se clasifica las expresiones autónomas finitas? * Cual es la funcionalidad de las expresiones regulares?
35. * El lenguaje en su aspecto léxico esta compuesto de que operaciones y de ejemplo de cada una de ellas.