Claselexico

43
Análisis Léxico

Transcript of Claselexico

Page 1: Claselexico

Análisis Léxico

Page 2: Claselexico

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."

Page 3: Claselexico

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.

Page 4: Claselexico

Función del analizador léxico

Page 5: Claselexico

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.

Page 6: Claselexico

Estructura de un Compilador

Page 7: Claselexico

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

Page 8: Claselexico

¿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.

Page 9: Claselexico

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.

Page 10: Claselexico

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.

Page 11: Claselexico

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– …

Page 12: Claselexico

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?

Page 13: Claselexico

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 ==

Page 14: Claselexico

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 = ?

Page 15: Claselexico

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.

Page 16: Claselexico

Lenguaje

• Def. Sea ∑un conjunto de caracteres. Un lenguaje sobre ∑ es un conjunto de cadenas tomadas desde ∑.

• (∑ se conoce como el alfabeto)

Page 17: Claselexico

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.

Page 18: Claselexico

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)

Page 19: Claselexico

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

Page 20: Claselexico

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

Page 21: Claselexico

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’

Page 22: Claselexico

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

Page 23: Claselexico

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 \

Page 24: Claselexico

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,

Page 25: Claselexico

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

Page 26: Claselexico

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

Page 27: Claselexico

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

Page 28: Claselexico

Componentes léxicos

Separadores. , ; .. ( ) { } [ ] : =

Page 29: Claselexico

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

Page 30: Claselexico

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 ;

Page 31: Claselexico

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.

Page 32: Claselexico

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

Page 33: Claselexico

Expresiones Regulares

Page 34: Claselexico

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 = ´(´– …

Page 35: Claselexico

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

Page 36: Claselexico

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

Page 37: Claselexico

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

Page 38: Claselexico

Grafos de los estados de un Autómata finito

• Un estado

• Estado de inicio

• Estado de aceptación

• Una transicióna

Page 39: Claselexico

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

Page 40: Claselexico

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¨

Page 41: Claselexico

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

Page 42: Claselexico

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.

λ

Page 43: Claselexico

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.