claselexico
Post on 26-May-2015
1.979 Views
Preview:
TRANSCRIPT
Análisis Léxico
Introducción
• "Una forma sencilla de crear un analizador léxico consiste en la construcción de un diagrama que ilustren la estructura de los componentes léxicos del lenguaje fuente, y después hacer la traducción "a mano" del diagrama a un programa para encontrar los componente léxicos."
12 de abril de 2023
Función del analizador léxico
• El análisis léxico o lineal (scanner), reconoce y clasifica todas las “palabras”, componentes léxicos o tokens de un código fuente.
• El analizador léxico lee el código fuente caracter a caracter y vá armando uno a uno los componentes léxicos que después entregará al analizador sintáctico, cada que este le de la orden de enviarle el siguiente token.
• El analizador léxico puede hacer tareas secundarias como: eliminar comentarios y espacios en blanco y relacionar los mensajes de error.
Función del analizador léxico
Componentes léxicos, patrones y lexemas
• Estos tres nombres tienen significado específico en análisis sintáctico.
• En general hay un conjunto de cadenas de entrada para el cual se produce como salida el mismo componente léxico.
• Este conjunto de cadenas se construye mediante una regla llamada patrón asociado al componente léxico.
Estructura de un Compilador
Análisis Léxico
• ¿ Qué queremos hacer? Ejemplo:If (i == j)
z=0;
else
z=1;
• La entrada es sólo una secuencia de caracteres:\tif(i==j)\n\t\tz=0;\n\telse\n\t\tz=1;
Meta: Partir la cadena de entrada en subcadenas
y clasificar las subcadenas de acuerdo a su role
¿Qué es un token?
• La salida del analizador léxico es un conjunto de tokens.
• Un token es una categoría sintáctica– En Español:
• Nombres, verbos, adjetivos, …
– En un lenguaje de programación• Identificadores, Enteros, palabras reservadas, espacios
en blanco, …
• La siguiente etapa, toma los tokens.– Ejem. Los identificadores se tratan diferente que
las palabras reservadas.
Tokens
• Los token corresponden a conjuntos de cadenas.
• Identificadores:cadenas de letras o dígitos que comienzan con una letra.
• Enteros: una cadena de dígitos.
• Palabras reservadas: else, if, begin, …
• Espacios en blanco: una secuencia de espacios, nuevas líneas, tabuladores.
• Open par: un paréntesis izquierdo.
Implementación del analizador léxico
• Una implementación debe hacer dos cosas:
– Reconocer las subcadenas que corresponden a tokens.
– Regresar el valor o lexema de un token• El lexema es la subcadena.
Ejemplo
• Recordar:\tif(i==j)\n\t\tz=0; \n\telse\n\t\tz=1:
• El par Token-lexema que regresa el analizador léxico:– (Espacio en blanco, ¨\t¨ )– (Palabra reservada, ¨if¨)– (Parentesis abre, ¨(¨)– (Identificador, ¨i¨)– (Relación, ¨==¨)– (Identificador, ¨j¨), etc– …
Implementación del analizador léxico
• El A. Léxico por lo regular descarta tokens que no son "importantes" tokens que no contribuyen a generar el árbol.
• Ejemplos: Espacios en blanco, comentarios.
• Pregunta: ¿Qué pasa si quitamos todos los espacios en blanco y comentarios antes de realizar el análisis léxico?
Mirar por adelantado
• Dos puntos importantes:– La meta final es particionar la cadena. Esto se
implementa leyendo la cadena de izquierda a derecha, reconociendo un token a la vez.
– Mirar por adelantado algunas veces se requiere para decidir donde finaliza un token y donde comienza el último token.
i vs if
= vs ==
Además
• Necesitamos– Una forma de describir los lexemas de
cada token.
– Una forma de resolver ambigüedades• ¿If describe dos variables?• ¿ == representa dos símbolos = y = ?
Lenguajes Regulares
• Existen diferentes formalismos para especificar tokens.
• Los lenguajes regulares son los más populares.– Teoría simple y útil– Fácil de entender– Implementaciones eficientes.
Lenguaje
• Def. Sea ∑un conjunto de caracteres. Un lenguaje sobre ∑ es un conjunto de cadenas tomadas desde ∑.
• (∑ se conoce como el alfabeto)
Ejemplo de lenguajes
• Alfabeto = Caracteres del idioma inglés
• Lenguaje = sentencias en inglés.
• No todas las cadenas en el alfabeto inglés forman sentencias.
• Alfabeto = ASCII• Lenguaje =
programas en C
• Nota. El conjunto de caracteres ASCII es diferente que el conjunto de caracteres inglés.
Componentes léxicos
IdentificadoresLenguaje Patrón Ejemplos
C, Pascal, Java, C# y casi todos los lenguajes
Inician con letra y pueden ir seguidos de letras, dígitos o carácter subrayado
X1, r_23
PHP Inician con $ y van seguidos de letras o dígitos
$x, $_POST
Prolog Inician con letra, seguidas de létras o dígitos o _.
Mayúsculas nombre de variable
Minúsculas nombre de predicado
Nombre
primo(X)
Componentes léxicos
Literales NuméricosEnteros, reales, reales con notación científica.
Lenguaje Patrón Ejemplos
Todos Enteros: Inician con signo opcional y va seguido de uno o más dígitos
-1223
99882
Reales: Inician con signo opcional y van seguido de uno o más dígitos y opcional seguido de un punto y uno o más dígitos.
12.323
-44.53421
Reales con notación científica: Inicia con signo opcional, y van seguidos de uno o más dígitos, seguido de punto “.”, seguido de uno o más dígitos, seguido de “E” seguido del signo + ó – opcional y seguido de uno o más dígitos.
-32.3e-19
7.4e+12
-9.1e10
Smalltalk, Scheme otros Fraccion: inicia por signo o no, seguido de uno o más dígitos, seguido del slash “/” seguido de uno o más dígitos
43/28
2/78
-12/43
12 de abril de 2023
Componentes léxicos
Literales CaracterLenguaje Patrón Ejemplos
C, java, C#, prolog, y otros
Un símbolo del alfabeto encerrado entre comillas sencillas ‘. Algunos caracteres especiales usan el símbolo backslash \
‘a’ ‘\n’
‘Z’
‘b’ ‘\t’
Pascal Un símbolo del alfabeto encerrado entre comillas dobles “.
“a” “z”
“b”
Smalltalk Un símbolo del alfabeto precedido por el signo $
$a $$
$b
Scheme Cualquier símbolo del alfabeto precedido por los símbolos #\
#\a
#\b
Componentes léxicos
Literales CadenaLenguaje Patrón EjemplosC, java, C#, prolog, scheme y otros
Cualquier conjunto de cero o más símbolos del alfabeto encerrados entre comillas dobles “. Prolog permite cualquier conjunto de símbolos que no contengan espacios e inicien por letra minúscula.
“Hola”
“Mundo”
“Adios Mundo”
a Cualquier conjunto de cero o más símbolos del alfabeto encerrados entre comillas sencillas ‘.
‘Hola Mundo’
Componentes léxicos
Literales BooleanosLenguaje Patrón Ejemplos
Java, pascal, smalltalk, visual basic
Constante verdadera: true
Constante falsa: false
En smalltalk, en realidad son objetos
true, false
Scheme Constante verdadera: #t
Constante false: #f ó ()#t, #f, ()
Lenguajes como C no tienen literales booleanas
Componentes léxicos
Operadores MatemáticosLenguaje Patrón Ejemplos
Casi todos los lenguajes
Suma +, Resta -, multiplicación *, División /
C, java Incremento ++, Decremento --; Modulo %
No tiene operador de división entera
Pascal Modulo MOD, División entera DIV
Visual Basic Potenciación ^ División Entera \
Componentes léxicos
Operadores RelacionalesLenguaje Patrón Ejemplos
Casi todos los lenguajes
Mayor que (>), Mayor o igual (>=), menor que (<), menor o igual (<=)
>, <, >=, <=
C, java Diferente !=, igual ==
Pascal, prolog, smalltalk
Igual en pascal, prolog y scheme =, diferente en pascal y prolog <>. En scheme es una función.
Smalltalk y scheme, no tienen operador para diferente,
Componentes léxicos
Operadores BooleanosLenguaje Patrón Ejemplos
C, Java And && ó &, Or || ó |, not !
Pascal And AND Or OR not NOT
Lenguajes como prolog, scheme y smalltalk no tienen operadores relacionales, sino métodos o funciones para esto
Componentes léxicos
Operador de AsignaciónLenguaje Patrón Ejemplos
C, java, visual Basic, C#
= a=10;
Pascal, smalltalk := A:=10;
Prolog no tiene operador de asignación, pero tiene un operador similar que es :-.
Scheme no tiene operadores de asignación
Componentes léxicos
Operador de ConcatenaciónLenguaje Patrón Ejemplos
Java, C# + a=“Hola “;
b=“Mundo”;
printf(“%s”,a+b);
Pascal, C , coma a=‘Hola ‘;
b=‘Mundo’;
write(a,b);
Visual Basic & a=“Hola “
b=“Mundo”
Print a & b
PHP . punto
Componentes léxicos
Separadores. , ; .. ( ) { } [ ] : =
Componentes léxicos
Espacios en BlancoLenguaje Patrón Ejemplos
En casi todos los lenguajes comprenden caracteres de Barra espaciadora, Nueva línea, retorno de carro y tabulador
C, java Nueva línea \n
Retorno de carro \f
Tabulador \t
Visual Basic Nueva Linea VBCR
Otros lenguajes utilizan funciones como char(Ascii) de pascal que imprime el carácter de acuerdo con el codigo Ascii ingresado
Componentes léxicos
ComentariosExisten comentarios de línea y de Bloque
Lenguaje Patrón EjemplosC, java, muchos lenguajes
Línea //
Bloque /* */ /** */
Pascal Bloque { } ó (* *)
Prolog Línea %
Bloque /* */
Visual Basic Línea ‘
Smalltalk Bloque “ “
Scheme Línea ;
Notacion
• Los lenguajes son conjuntos de cadenas.
• Necesitamos alguna notación para especificar los conjuntos que necesitamos.
• Para el análisis léxico nos interesan los lenguajes regulares, que se pueden describir empleando expresiones regulares.
Expresiones regulares y lenguajes regulares
• Cada expresión regular representa una notación para un lenguaje regular (un conjunto de palabras).
• Si A es una expresión regular entonces escribimos L(A) para referirnos al lenguaje denotado por A
Elaboró: Dr. José Raymundo Marcial Romero
Expresiones Regulares
Expresiones Regulares (ER) => Especificación léxica
1. Seleccionar un conjunto de tokens– Número, palabras reservadas, identificadores, …
2. Escribir una ER para los lexemas de cada token– Números = digitos*– Palabras reservadas = ´if´ | ´then´ | ´else´ | … – Identificadores = letras (letras | digitos)*– Parentesis que abre = ´(´– …
Resumen
• Las expresiones regulares proveen una forma concisa para detectar cadenas.
• Su uso en analizadores léxicos requiere pequeñas extensiones.– Para resolver ambigüedades– Para manejar errores
Autómata finito
• Expresión Regular = Especificación.
• Autómata finito = implementación.
• Un autómata finito consiste de:– Un alfabeto de entrada – Un conjunto de estados S– Un estado inicial n– Un conjunto de estados de aceptación FS– Un conjunto de transiciones estadoestado
Autómata finito
• Transicións1 a s2
• Se lee– En el estado s1 teniendo como entrada a "a"
moverse al estado s2
• Estando al final de la entrada– Si el estado es de aceptación => aceptar, de otra
forma => rechazar– Si no existe transición con símbolo "a" =>
rechazar
Grafos de los estados de un Autómata finito
• Un estado
• Estado de inicio
• Estado de aceptación
• Una transicióna
Ejemplo
• Un autómata finito que acepte ¨1¨
1
Un autómata finito acepta una cadena si podemos seguir las etiquetas de los arcos con los caracteres de la cadena desde el estado de inicio hasta un estado de aceptación
Otro Ejemplo
• Un autómata finito que acepta cualquier cantidad de 1´s seguido de un 0.
• Alfabeto: 0,1
0
1
Verificar que ¨1110¨ es aceptada pero no ¨111¨
Otro ejemplo
• Alfabeto {0,1}
La operación del autómata no esta completamente definida por la entrada.
En la entrada ¨11¨ el autómata puede estar en cualquier estado
Movimientos λ
• Otra clase de transición: movimientos λ
La máquina se puede mover del estado A al estado B sin leer símbolos de entrada.
λ
Autómatas deterministas y No deterministas
• Autómatas Finitos Deterministas (AFD)– Una transición por entrada y por estado.– No hay movimientos λ.
• Autómatas Finitos No deterministas (AFN).– Puede tener más de una transición por entrada y por
estado.– Puede tener movimientos λ.
• Autómata finito tiene memoria finita.– Necesita sólo codificar el estado actual.
top related