Cap5

3,523 views
3,366 views

Published on

Published in: Education, Technology, Business

Cap5

  1. 1. Análisis Léxico<br />Capítulo 5<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />1<br />
  2. 2. Analizador de Léxico<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />2<br />¿Quéhacemos en procesamiento de lenguaje natural?<br />Primero “tokenizamos”<br />Ejemplo:<br />Holacomoestantodos<br />Se convierte en:<br />Holacomoestantodos<br />Ejemplos de Tokens:<br />Operadores:<br />=, +, -, >, (, {, :=, ==, <>, etc.<br />Keywords:<br />if., while, for, int, double, etc.<br />Literalesnuméricos:<br />43 6.035 -3.6e10 0x13f3a<br />Literales de caracter:<br />'a' '~' '''<br />Strings literales :<br />"6.983" <br />"compiladores" """"<br />Ejemplos de no-tokens<br />Espacios en blanco:<br />espacio(' ') tab(' ') eol(' ')<br />Comentarios:<br />/* este no es un token */<br />Programa fuente->Tokens<br />Tokens<br />“Tokenizar”: separar, organizar.<br />
  3. 3. Analizador Léxico<br />Los analizadores de léxicodeben:<br />Particionar el texto del programa de entrada en unasubsecuencia de caracterescorrespondientes a tokens.<br />Adjuntarleslosatributoscorrespondientes a los tokens.<br />Eliminarespacios en blanco y comentarios.<br />Separarprecisamente el stream de texto en el stream correcto de tokens:<br />ID("var1") NO ID("var") Num(1)<br />ID("var1") leq_opNO ID("var1<=")<br />3<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  4. 4. El Papel del Analizador Léxico<br />La función primordial es agrupar caracteres de la entrada en tokens.<br />Estos tokens son suministrados (“bajo demanda”) al analizador sintáctico.<br />4<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  5. 5. El Papel del Analizador Léxico<br />prog: cabecera bloque ‘.’<br />cabecera: tkPROGtkID<br />cabecera: tkPROGtkIDlistaParsProg<br />listaParsProg: ‘(‘listaID ‘)’listaID: listaID ‘,’ID<br />listaID: ID<br />....<br />5<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />El papel del A. Léxico es “tokenizar”<br />
  6. 6. El Papel del Analizador Léxico<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />6<br />Además:<br />Procesar directivas al compilador.<br />Introducir información preliminar en la tabla de símbolos.<br />Eliminar separadores innecesarios (cuando no lo ha hecho un preprocesador).<br />Sustituir macros.<br />Formatear y listar el fuente.<br />A, veces cuando el lenguaje es sintácticamente complejo, dos fases:<br />Fase de examen.<br />Fase de análisis (propiamente dicho).<br />Los tokens se pasan como valores “simples”.<br />Algunos tokens requieren algo más que su propia identificación:<br />Constantes: su valor.<br />Identificadores: el string.<br />Operadores relacionales: su identificación<br />Etc.<br />Por lo tanto, el scanner debe realizar, a veces, una doble función:<br />Identificar el token.<br />Evaluar el token.<br />
  7. 7. Lexema del Componente<br />La fase de análisis léxico lee los caracteres de un programa fuente y los agrupa en una cadena de componentes léxicos en los que cada componente representa una secuencia lógicamente coherente de caracteres, como un identificador, una palabra clave (if, while, etc), un caracter de puntuación, o un operador de varios caracteres, como “:=“. <br />La secuencia de caracteres que forman un componente léxico se denomina lexema del componente.<br />A ciertos componentes léxicos se les agregará un “valor léxico”. <br />Así, cuando se encuentra un identificador como velocidad, el analizador léxico no sólo genera un componente léxico, por ejemplo “ID”, sino que también introduce el lexema velocidad en la tabla de símbolos, si aún no estaba allí. <br />El valor léxico asociado con esta aparición de ID señala la entrada de la tabla de símbolos correspondiente a velocidad.<br />Usaremos id1 , id2 e id3 para posición, inicial y velocidad, respectivamente, para enfatizar que la representación interna de un identificador es diferente de la secuencia de caracteres que forman el identificador. <br />Por tanto, la representación de: <br />Posición := inicial + velocidad * 60<br />después del análisis léxico queda sugerida por:<br />id1 := id2 + id3 * 60<br />Se deberían construir componentes para el operador de varios caracteres “:=“ y el número 60, para reflejar su representación interna. <br />7<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  8. 8. El Papel del Analizador Léxico<br />Esquema de procesamiento:<br />8<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  9. 9. if Plazo >= 30 <br />then Tasa := Base + Recargo / 100<br />else Tasa := Base<br />[if][Plazo][>=][30]<br />[then][Tasa][:=][Base][+][Recargo] [/][100] <br />[else][Tasa][:=][Base]<br />[59][Plazo][>=][30]<br />[then][Tasa][:=][Base][+][Recargo][/][100]<br />[else][Tasa][:=][Base]<br />[59][27][>=][30]<br />[then][Tasa][:=][Base][+][Recargo][/][100]<br />[else][Tasa][:=][Base]<br />[59][27][80][30]<br />[then][Tasa][:=][Base][+][Recargo][/][100]<br />[else][Tasa][:=][Base]<br />[59][27][80][28]<br />[then][Tasa][:=][Base][+][Recargo][/][100]<br />[else][Tasa][:=][Base]<br />[59][27][80][28]<br />[60][27][85][27][70][27][73][28]<br />[61][27][85][27]<br />[59][27, ‘Plazo’][80][28, ‘30’]<br />[60][27, ‘Tasa’][85][27, ‘Base’][70][27,’Recargo’][73][28, ‘100’]<br />[61][27,’Tasa’][85][27,‘Base’]<br />[59][27][80][28][60][27][85][27][70][27]<br />[73][28] [61][27][85][27]<br />IF ID >= CTE THEN ID := ID + ID/ CTEELSE ID := ID<br />Ejemplo de Análisis Léxico<br />9<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  10. 10. Tokens, Lexemas y Patrones Léxicos<br />Definiciones:<br />10<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  11. 11. Tokens, Lexemas y Patrones Léxicos<br />Además<br />Un token se corresponde con un patrón.<br />Un token se puede corresponder con muchos lexemas.<br />Ejemplo: Identificadores.<br />11<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  12. 12. Tokens, Lexemas y Patrones Léxicos<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />12<br />Tokens más habituales:<br />Palabras reservadas.<br />Identificadores.<br />Operadores.<br />Constantes.<br />Símbolos de puntuación: ; , . : <br />Símbolos especiales: ( ) [ ]<br />Pero, a la vez que el propio token, el scanner puede (debe) devolver más información.<br />Si es un token CONSTANTE, su valor.<br />Si es un identificador, el string correspondiente.<br />Si es un símbolo de puntuación, cuál.<br />Esta información, se devuelve mediante “atributos”.<br />Pero aún puede hacer algo más: <br />Puede detectar algunos (pocos) errores léxicos.<br />No hay concordancia con ningún patrón.<br />Puede llevar a cabo algunas recuperaciones de errores.<br />Filtrado de caracteres “extraños”.<br />Completar algún patrón.<br />Reemplazar algún caracter.<br />
  13. 13. Tokens<br />Un token representa una secuencia de caracteres que forman una unidad significativa. <br />Por ejemplo:<br />En Pascal un token es la palabra reservada BEGIN.<br />En C: WHILE, etc.<br />Hay dos tipos de tokens:<br />Tiras específicas, tales como palabras reservadas (if, while, begin, etc.), el punto y coma, la asignación, los operadores aritméticos o lógicos, etc.<br />Las tiras específicas sólo tienen tipo (lo que representan),<br />Tiras no específicas, como identificadores, constantes o etiquetas. <br />Las tiras no específicas tienen tipo y valor.<br />Se considera que un token tiene dos partes componentes:<br />El tipo de token.<br />Su valor.<br />Por ejemplo, si “Contador” es un identificador, el tipo de token será identificador y su valor será la cadena “Contador”.<br />13<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  14. 14. Proceso de Construcción<br />Con ayuda de herramientas:<br />ci: caracter<br />ti: token<br />Ii : información asociada a ti<br />14<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  15. 15. ¿Cómo es el Scanner?<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />15<br />¿Qué pinta tiene un scanner?<br />Un conjunto de funciones.<br />Una para cada símbolo a reconocer.<br />Estas funciones son controladas/invocadas por una función que:<br />Selecciona, en función de los caracteres de entrada, qué función invocar.<br />Opcionalmente, también mediante tablas.<br />Pero puede ser complicado:<br />Necesidad de recorrer varios caracteres antes de decidir el tipo de token.<br />“pre-análisis”ó“look-ahead”.<br />Ejemplo: reconocido “<“en C, puede corresponder a:<br />MENOR“<“<br />MENOR_O_IGUAL“<=“<br />SHIFT_LEFT“<<“<br />“IF”vs. “IFNI”<br />
  16. 16. Expresiones Regulares: Definiciones<br />16<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  17. 17. Expresiones Regulares: Definiciones<br />17<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  18. 18. Expresiones Regulares: Definiciones<br />Operadores sobre lenguajes:<br />Sean L,M dos lenguajes:<br />18<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  19. 19. Expresiones Regulares: Definiciones<br />Para un token dado, los lexemas correspondientes los expresaremos mediante expresiones regulares.<br />Expresión regular: forma compacta para definir un lenguaje regular.<br />También llamado conjunto regular.<br />Una expresión regular r:<br />Será definida a partir del lenguaje L(r) que genera.<br />19<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  20. 20. Autómatas Finitos<br />Ya sabemos expresar los lexemas correspondientes a los tokens.<br />Necesitamos implementar el analizador léxico.<br />Esquema para su implementación:<br />20<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  21. 21. Autómatas Finitos<br />Los autómatas finitos pueden ser utilizados para reconocer los lenguajes expresados mediante expresiones regulares.<br />Un autómata finito (AF) es una máquina abstracta que reconoce strings correspondientes a un conjunto regular.<br />También se denominan reconocedores.<br />Misión de un AF:<br />“reconocer”si un string de entrada respeta las reglas determinadas por una expresión regular.<br />21<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  22. 22. Autómatas Finitos<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />22<br />Un AFND o autómata finito no determinista es aquel que presenta cero, una o más transiciones por el mismo carácter del alfabeto.<br />Dado un string, debe determinar si lo acepta o no.<br />La idea básica es que un estado del AFD agrupa un conjunto de estados del AFN, por lo que del AFN se pasa en particular al AFD.<br />Un AFD o autómata finito determinista es aquel autómata finito cuyo estado de llegada está unívocamente determinado por el estado inicial y el carácter leído por el autómata.<br />Para generar el mejor resultado, el siguiente paso es minimizarlo para implementarlo.<br />No Determinista<br />Determinista<br />
  23. 23. Autómatas Finitos<br />Algunas cuestiones:<br />Como es lógico, cuantos más estados tiene un AF, más memoria es necesaria.<br />El número de estados del AFD se puede/debe minimizar.<br />Inicialmente, dos estados:<br />Uno con los de aceptación.<br />Otro con los demás.<br />Sucesivas particiones de estados “globales”que no concuerdan con algún sucesor para un símbolo de entrada.<br />El AFD mínimo equivalente es único.<br />AFN son mejores en espacio.<br />Tener en cuenta que en su AFD, cada estado del AFN se puede “almacenar”varias veces.<br />AFD son mejores en cuanto a velocidad de reconocimiento.<br />23<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />

×