8
CIS-IXB-001 UNIVERSIDAD NACIONAL DE LOJA ´ Area de la Energ´ ıa las Industrias y los Recursos Naturales No Renovables Carrera de Ingenier ´ ıa en Sistemas ”ANALIZADOR LEXICO ESTRUCTURA ARCHIVO JFLEX” Tarea 1 Noveno B Autor: Raul-Gomez Docente: Ing. Henry-Paz, Tarea de C. Por Raul-Gomez is licensed Under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. Fecha: December 15, 2014 LOJA ECUADOR 1

Analizador Léxico, Analizador Sintáctico

Embed Size (px)

Citation preview

Page 1: Analizador Léxico, Analizador Sintáctico

CIS-IXB-001UNIVERSIDADNACIONALDE LOJA

Area de la Energıa las Industrias y los Recursos Naturales No Renovables

Carrera de Ingenierıa en Sistemas

”ANALIZADOR LEXICOESTRUCTURA ARCHIVO JFLEX”

Tarea 1Noveno B

Autor:• Raul-Gomez

Docente: Ing. Henry-Paz,

Tarea de C. Por Raul-Gomez is licensed Under a Creative CommonsReconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

Fecha: December 15, 2014LOJA ECUADOR

1

Page 2: Analizador Léxico, Analizador Sintáctico

1 Analizador LexicoSe encarga de buscar los componentes lexicos o palabras que componen el programa

fuente, segun unas reglas o patrones. La entrada del analizador lexico podemos definirlacomo una secuencia de caracteres.

Figure 1: Estructura Lexica

• gramatica (N, T, P, S)

• N Sımbolos no terminales.

• T Sımbolos terminales

• P Reglas de produccion

• S Axioma inicial

El analizador lexico tiene que dividir la secuencia de caracteres en palabras consignificado propio y despues convertirlo a una secuencia de terminales desde el punto devista del analizador sintactico, que es la entrada del analizador sintactico. El analizadorlexico reconoce las palabras en funcion de una gramatica regular de manera que sus NOTERMINALES se convierten en los elementos de entrada de fases posteriores. En LEX,

por ejemplo, esta gramatica se expresa mediante expresiones regulares.

1.1 Funcion del analizador lexico.El analizador lexico es la primera fase de un compilador. Su principal funcion consisteen leer los caracteres de entrada y elaborar como salida una secuencia de componenteslexicos que utiliza el analizador sintactico para hacer el analisis. Esta interaccion, sueleaplicarse convirtiendo al analizador lexico en una subrutina o corrutina del analizador

sintactico. Recibida la orden “Dame el siguiente componente lexico”del analizadorsintactico, el analizador lexico lee los caracteres de entrada hasta que pueda identificar

el siguiente componente lexico.

• Eliminar los comentarios del programa.

• Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general, todoaquello que carezca de significado segun la sintaxis del lenguaje.

2

Page 3: Analizador Léxico, Analizador Sintáctico

Figure 2: Interaccion de un analizador lexico con el analizador sintactico

• Reconocer los identificadores de usuario, numeros, palabras reservadas del lenguaje,..., y tratarlos correctamente con respecto a la tabla de sımbolos (solo en los casosque debe de tratar con la tabla de sımbolos).

• Llevar la cuenta del numero de lınea por la que va leyendo, por si se produce algunerror, dar informacion sobre donde se ha producido.

• Avisar de errores lexicos. Por ejemplo, si @ no pertenece al lenguaje, avisar de unerror.

• Puede hacer funciones de preprocesador.

Ademas el analizador lexico es responsable de:

• Manejo de apertura y cierre de archivo, lectura de caracteres y gestion de posibleserrores de apertura.

• Eliminar comentarios, espacios en blanco, tabuladores y saltos de lınea.

• Inclusion de archivos y macros.

• Contabilizar numero de lıneas y columnas para emitir mensajes de error.

1.2 Componentes Lexicos, Patrones y LexemasEl analizador lexicografico puede tener la siguiente estructura:

Figure 3: Interaccion de componentes

3

Page 4: Analizador Léxico, Analizador Sintáctico

Donde cada accion es un fragmento de programa que describe cual ha de ser la acciondel analizador lexico cuando la secuencia de entrada coincida con la expresion regular.

En la fase de analisis, los terminos componentes lexicos (token), patron y lexema seemplean con significados especıficos. Un analizador lexico, inicialmente lee los lexemas y

le asigna un significado propio.Componente lexico es la secuencia logica y coherente de caracteres relativo a unacategorıa: identificador, palabra reservada, literales (cadena/numerica), operador o

caracter de puntuacion, ademas de que un componente lexico puede tener uno o varioslexemas.

Patrones una regla que genera la secuencia de caracteres que puede representar a undeterminado componente lexico (expresion regular).

Lexema es una cadena de caracteres que concuerda con un patron que describe uncomponente lexico (valor de cadena). Ejemplo de una cadena de codigo: const pi =

3.1416;Ej: 8, 23, 50 ( son lexemas que encajan con el patron ( 0 — 1 — 2 — ... — 9) + ).

Una vez detectado que un grupo de caracteres coincide con un patron, se ha detectadoun lexema. A continuacion se le asocia un numero, que se le pasara al sintactico, y, si es

necesario, informacion adicional, como puede ser una entrada en la tabla de sımbolos.La tabla de sımbolos suelen ser listas encadenadas de registros con parte variable: listas

ordenadas, arboles binarios de busqueda, tablas hash, etc.

Lexemas Componente lexico Patronconst const const= relacion ¡ o ¡= o = o ¡¿ o ¿ o ¿=Pi identificador letra seguida de letras o numeros3.1416 numero cualquier literal numerica“hola mundo” literal caracteres entre comillas

<identificador, atributo para el sımbolo E><op_asignacion><identificador, atributo para el sımbolo M><op_multiplica><identificador, apuntador al sımbolo C><op_exponente><numero, atributo valor 2>

1.3 Analizador SintacticoEste analizador se encarga de formar componentes sintacticos del lenguaje fuente. Endefinitiva, nos permitira saber si un texto concreto pertenece al conjunto de posiblestextos de un lenguaje. Para implementar un analizador sintactico necesitamos unagramatica que nos proporcione la especificacion sintactica del lenguaje fuente. Una

gramatica esta formado por una serie de reglas. Cada regla tiene una parte izquierda yuna parte derecha. Si se reconoce la parte derecha de una regla, se puede sustituir todo

por la parte izquierda de la misma regla. Las reglas estan formadas por dos tipos desımbolos:

4

Page 5: Analizador Léxico, Analizador Sintáctico

• No terminales: tambien llamados variables y que se expanden en partes derechas deotras reglas.

• Terminales: son tokens de la especificacion lexica. Ejemplo: queremos especificar lasintaxis de operaciones aritmeticas de numeros enteros. Las operaciones en cuestionson la suma y la resta. Una primera aproximacion podrıa ser: E E + E E E – EE nint Los tokens son: +: el signo mas (suma) -: el signo menos (resta) nint: unnumero entero, cuya expresion regular serıa [0-9]* Sin embargo, esta gramatica noes valida ya que es ambigua. La ambiguedad es un problema bastante importanteya que implica que puede haber mas de un arbol de derivacion para encontraruna misma cadena. No se pueden implementar analizadores mediante gramaticasambiguas, ya que aparecerıan conflictos. Veamos dos arboles de derivacion con laprimera gramatica para formar la expresion 1+1:

Figure 4: Comprobacion de un analizador sintaxico

La ambiguedad es bastante difıcil de detectar. Para ello se definen una serie desubconjuntos de gramaticas, y a la hora de disenar el analizador podemos detectardicha ambiguedad. En nuestro caso interesa usar las gramaticas SLR a partir de lascuales se pueden implementar analizadores sintacticos ascendentes. La gramaticaanterior en SLR serıa: E E + T E E - T E T T nint

1.4 Analisis Semantico

Semantica: conjunto de reglas que especifican el significado de cualquier sentenciasintacticamente correcta y escrita en un determinado lenguaje. El analisis semantico,a diferencia de otras fases, no se realiza claramente diferenciado del resto de las tareasdel compilador. Fase en la que se obtiene informacion necesaria para la compilaciontras conocer la estructura sintactica del programa. Completa las fases de analisislexico y sintactico incorporando comprobaciones que no pueden asimilarse al meroreconocimiento de una cadena dentro de un lenguaje.Errores semanticos de un programa: Conversiones de tipos no permitidas

int x;x = 4.32;Error: Ej1.java [6:1] possible loss of precision

{ Variables usadas y no definidas

5

Page 6: Analizador Léxico, Analizador Sintáctico

{ Operandos de tipos no compatibles

if (x || 5) x = 0;Error: Ej2.java [7:1] operator || cannot be applied to int,int

El analisis semantico se divide en dos categorıas:

– Analisis de la exactitud del programa para garantizar una ejecucion adecuada.– Algunos lenguajes (Lisp, Smalltallk) pueden no tener analisis estatico.– Por ejemplo, ADA es un lenguaje con fuertes restricciones para que un pro-

grama sea ejecutable.– Analisis para mejorar la eficiencia (optimizacion del programa traducido)

2 Jflex

Lex es un programa para generar analizadores lexicos (en ingles scanners o lexers).Lex se utiliza comunmente con el programa yacc que se utiliza para generar analisissintactico. Lex, escrito originalmente por Eric Schmidt y Mike Lesk, es el analizadorlexico estandar en los sistemas Unix, y se incluye en el estandar de POSIX. Lextoma como entrada una especificacion de analizador lexico y devuelve como salidael codigo fuente implementando el analizador lexico en C.Aunque tradicionalmente se trata de software propietario, existen versiones libresde lex basadas en el codigo original de ATT en sistemas como OpenSolaris y Plan9 de los laboratorios Bell. Otra version popular de software libre de lex es Flex.

2.1 Estructura de un archivo de lex

La estructura de un archivo de lex es intencionadamente similar a la de un archivodel yacc; los archivos se dividen en tres secciones, separadas por lıneas que contienensolamente dos sımbolos

"%", como sigue:

Seccion de declaraciones%%Seccion de reglas%%Seccion de codigo en C

Lo siguiente es un ejemplo de archivo lex para la version Flex de lex. Reconocecadenas de numeros (numeros enteros) en la entrada, y simplemente los imprime enla salida.

6

Page 7: Analizador Léxico, Analizador Sintáctico

/*** Seccion de declaraciones ***/

%{/* Codigo en C que sera copiado */#include <stdio.h>%}

/* Esto indica a Flex que lea solo un fichero de entrada */%option noyywrap

%%/*** Seccion de reglas ***/

/* [0-9]+ identifica una cadena de uno o mas dıgitos */[0-9]+ {

/* yytext es una cadena que contiene el texto coincidente. */printf("Encontrado un entero: %s\n", yytext);

}

. { /* Ignora todos los demas caracteres. */ }

%%/*** Seccion de codigo en C ***/

int main(void){

/* Ejecuta el ’’lexer’’, y despues termina. */yylex();return 0;

}

Si se da esta entrada a flex, sera convertida en un archivo de C, lex.yy.c. Esto sepuede compilar en un ejecutable que encuentre y haga salir cadenas de numerosenteros. Por ejemplo, dando la entrada:

abc123z.!&*2ghj6el programa imprimira:

Encontrado un entero: 123Encontrado un entero: 2Encontrado un entero: 6

7

Page 8: Analizador Léxico, Analizador Sintáctico

3 BIBLIOGRAFIA

References[1] Juan Marcos Sacristan Donoso “Desarrollo de compiladores”. 2008. Ensenanza

informatica.Disponible en: http://megazar.tripod.com/compil.pdf[2] Alfred V. Aho,Ravi Sethi,Jeffrey D. Ullman “Compiladores: principios,

tecnicas y herramientas”. 1998. (impreso en mexico) 53519 Naucalpan deJuares, Edo. Mexico. Disponible en: https://books.google.com.ec/books?id=yG6qJBAnE9UC&pg=PA86&lpg=PA86&dq=compiladores+lexico&source=bl&ots=rsWPT13_jQ&sig=4xTPyW6bjHW0UvLJNCDs6Vo5cco&hl=es&sa=X&ei=UVePVLW8CIueNsCjg7gD&ved=0CFkQ6AEwCQ#v=onepage&q=compiladores%20lexico&f=false

[3] Jeffrey D. Ullaman . ”Traductores, Compiladores e Interpretes. ”. 2012. De-partamento de Lenguajes y Automatas. Universidad de Sevilla. Disponible en:https://www.lsi.us.es/docs/doctorado/memorias/TESINA-Roche.pdf

[4] Louden, K.C (2010)Construccion de Compiladores”. Disponible en:http://centrodeartigo.com/articulos-noticias-consejos/article_126048.html

8