diff options
Diffstat (limited to 'cc/n2.lyx')
| -rw-r--r-- | cc/n2.lyx | 1032 |
1 files changed, 1032 insertions, 0 deletions
diff --git a/cc/n2.lyx b/cc/n2.lyx new file mode 100644 index 0000000..88c2801 --- /dev/null +++ b/cc/n2.lyx @@ -0,0 +1,1032 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass book +\begin_preamble +\usepackage{tikz} +\end_preamble +\use_default_options true +\maintain_unincluded_children false +\language spanish +\language_package default +\inputencoding auto +\fontencoding global +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style french +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +Un +\series bold +\emph on +token +\series default +\emph default + es un par formado por un +\series bold +nombre de +\emph on +token +\series default +\emph default +, que representa un tipo de unidad léxica, y un atributo opcional, cuyo + tipo depende del nombre de +\emph on +token +\emph default +. + Todo nombre de +\emph on +token +\emph default + lleva asociado un +\series bold +patrón +\series default +, un lenguaje regular que describe las secuencias de caracteres que deben + ser convertidas a un +\emph on +token +\emph default + con dicho nombre, llamadas +\series bold +lexemas +\series default +. + +\end_layout + +\begin_layout Standard +Un +\series bold +analizador léxico +\series default + es un programa que separa una secuencia de caracteres de entrada en lexemas + y genera una lista ordenada de +\emph on +tokens +\emph default +, informando de errores y pudiendo hacer otras tareas como ignorar comentarios + y caracteres de espaciado. + +\end_layout + +\begin_layout Standard +El analizador sintáctico usa los nombres de +\emph on +token +\emph default + como símbolos terminales de una gramática libre de contexto, pues aunque + esta gramática podría incluir la definición de los +\emph on +tokens +\emph default +, dividir el análisis en dos fases simplifica el diseño, y mejora la portabilida +d al no tener que preocuparse el analizador sintáctico de la codificación + de caracteres. + En general el analizador léxico está subordinado al sintáctico, ofreciéndole + una interfaz de llamadas. +\end_layout + +\begin_layout Section +Fundamentos teóricos +\end_layout + +\begin_layout Standard +Dado un alfabeto +\begin_inset Formula $V$ +\end_inset + +, los símbolos +\begin_inset Formula $\lambda$ +\end_inset + + y +\begin_inset Formula $\emptyset$ +\end_inset + + y los elementos de +\begin_inset Formula $V$ +\end_inset + + son +\series bold +expresiones regulares +\series default +; también lo son +\begin_inset Formula $(\alpha|\beta)$ +\end_inset + +, +\begin_inset Formula $(\alpha\circ\beta)$ +\end_inset + + y +\begin_inset Formula $(\alpha^{*})$ +\end_inset + + si +\begin_inset Formula $\alpha$ +\end_inset + + y +\begin_inset Formula $\beta$ +\end_inset + + son expresiones regulares, y solo son expresiones regulares las expresiones + que se obtienen aplicando estas reglas. + Se pueden omitir los paréntesis si no causa ambigüedad, entendiendo que + +\begin_inset Formula $*$ +\end_inset + + tiene más precedencia que +\begin_inset Formula $\circ$ +\end_inset + + y +\begin_inset Formula $\circ$ +\end_inset + + más que +\begin_inset Formula $|$ +\end_inset + + y que los tres operadores son asociativos por la izquierda, y se puede + escribir +\begin_inset Formula $\alpha\beta:=\alpha\circ\beta$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Toda expresión regular +\begin_inset Formula $\alpha$ +\end_inset + + lleva asociado un lenguaje +\begin_inset Formula $L(\alpha)$ +\end_inset + +, dado por +\begin_inset Formula $L(\emptyset):=\emptyset$ +\end_inset + +; +\begin_inset Formula $L(\lambda):=\{\lambda\}$ +\end_inset + +; si +\begin_inset Formula $a\in V$ +\end_inset + +, +\begin_inset Formula $L(a):=\{a\}$ +\end_inset + +, y si +\begin_inset Formula $\alpha$ +\end_inset + + y +\begin_inset Formula $\beta$ +\end_inset + + son expresiones regulares, +\begin_inset Formula $L(\alpha|\beta):=L(\alpha)\cup L(\beta)$ +\end_inset + +, +\begin_inset Formula $L(\alpha\beta):=L(\alpha)L(\beta)$ +\end_inset + + y +\begin_inset Formula $L(\alpha^{*}):=L(\alpha)^{*}$ +\end_inset + +. + Un lenguaje es +\series bold +regular +\series default + si es el lenguaje asociado alguna expresión regular. + Dos expresiones regulares son +\series bold +equivalentes +\series default +, +\begin_inset Formula $\alpha=\beta$ +\end_inset + +, si +\begin_inset Formula $L(\alpha)=L(\beta)$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Un +\series bold +AFD +\series default + es una tupla +\begin_inset Formula $(Q,V,\delta,q_{0},F)$ +\end_inset + + donde +\begin_inset Formula $Q$ +\end_inset + + es un conjunto finito de +\series bold +estados +\series default +, +\begin_inset Formula $V$ +\end_inset + + es un alfabeto, +\begin_inset Formula $q_{0}\in Q$ +\end_inset + + es el +\series bold +estado inicial +\series default +, +\begin_inset Formula $F\subseteq Q$ +\end_inset + + es el conjunto de +\series bold +estados finales +\series default + y +\begin_inset Formula $\delta:D\subseteq(Q\times V)\to Q$ +\end_inset + + es la +\series bold +función de transición +\series default +. +\end_layout + +\begin_layout Standard +Un +\series bold +AFND +\series default + es una tupla +\begin_inset Formula $(Q,V,\delta,q_{0},F)$ +\end_inset + +, definida como un AFD salvo que +\begin_inset Formula $\delta:Q\times(V\dot{\cup}\{\lambda\})\to{\cal P}(Q)$ +\end_inset + +. +\end_layout + +\begin_layout Section +Diseño +\end_layout + +\begin_layout Standard +Para diseñar un analizador léxico usamos +\emph on +Flex +\emph default +, una herramienta multiplataforma que genera código en C basándose en un + fichero de especificación de expresiones regulares, sucesora de +\emph on +Lex +\emph default + para Unix. + Los ficheros de especificación suelen tener extensión +\family typewriter +.l +\family default + y constan de 3 partes separadas por una línea +\family typewriter +%% +\family default +: +\end_layout + +\begin_layout Enumerate +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +begin{sloppypar} +\end_layout + +\end_inset + + +\series bold +Definiciones +\series default +: Macros para expresiones regulares auxiliares con formato +\family typewriter +\emph on +nombre expresión +\family default +\emph default + en una línea. + Código C, entre una línea +\family typewriter +%{ +\family default + y una +\family typewriter +}% +\family default +. + Opciones con +\family typewriter +%option +\emph on +opción +\family default +\emph default +. + Condiciones de contexto, tablas, etc. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +end{sloppypar} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Enumerate + +\series bold +Reglas +\series default +: Con forma +\family typewriter +\emph on +expresión código +\family default +\emph default +, donde +\family typewriter +\emph on +expresión +\family default +\emph default + es una expresión regular que puede incluir macros con formato +\family typewriter +{ +\emph on +nombre +\emph default +} +\family default + y +\family typewriter +\emph on +código +\family default +\emph default + es una línea de C o un bloque código entre llaves que se ejecuta cuando + se reconoce un lexema asociado a la expresión regular. + Si en el código hay una sentencia +\family typewriter +return +\family default +, esta sale del analizador léxico devolviendo el entero indicado, normalmente + el código de +\emph on +token +\emph default +. + De lo contrario sigue leyendo, por lo que es habitual usar reglas para + espacios y comentarios con la sentencia vacía ( +\family typewriter +; +\family default +). +\end_layout + +\begin_layout Enumerate + +\series bold +Subrutinas de usuario +\series default +: Código C auxiliar que se añade al final del fichero generado. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +begin{sloppypar} +\end_layout + +\end_inset + +La orden +\family typewriter +flex [-o +\emph on +SALIDA +\emph default +] +\emph on +FICHERO +\family default +\emph default + genera un analizador léxico +\family typewriter +\emph on +SALIDA +\family default +\emph default + (por defecto, +\family typewriter +lex.yy.c +\family default +) desde la especificación +\family typewriter +\emph on +FICHERO +\family default +\emph default +. + Este debe enlazarse a la biblioteca +\family typewriter +fl +\family default +, por ejemplo mediante la opción +\family typewriter +-lfl +\family default + de +\family typewriter +gcc +\family default +. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +end{sloppypar} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Identificar los +\emph on +tokens +\emph default + y definir los patrones +\end_layout + +\begin_layout Standard +Se suelen considerar +\emph on +tokens +\emph default +: +\end_layout + +\begin_layout Itemize +Los identificadores. +\end_layout + +\begin_layout Itemize +Las +\series bold +palabras clave +\series default +, que pueden estar +\series bold +reservadas +\series default +, en cuyo caso el usuario no puede modificar su significado y el analizador + léxico puede reconocerlas directamente, o no estarlo, en cuyo caso el analizado +r léxico debe reconocerlas como identificadores para que una fase posterior + las distinga. +\end_layout + +\begin_layout Itemize +Los operadores y signos de puntuación. +\end_layout + +\begin_layout Itemize +Las constantes simples, como reales, enteros, caracteres o cadenas de caracteres. +\end_layout + +\begin_layout Itemize +Los espacios en blanco y comentarios, aunque en general en analizador léxico + los ignora y no los devuelve. +\end_layout + +\begin_layout Standard +Las expresiones regulares en +\emph on +Flex +\emph default + se forman combinando símbolos y operadores. + Los operadores son, en orden de prioridad: +\end_layout + +\begin_layout Enumerate + +\family typewriter +? +\family default +, +\family typewriter +* +\family default + y +\family typewriter ++ +\family default +, respectivamente, de 0–1, 0 o más y 1 o más repeticiones de lo anterior. + +\end_layout + +\begin_layout Enumerate +Concatenación de símbolos. +\end_layout + +\begin_layout Enumerate + +\family typewriter +{ +\family default +... +\family typewriter +} +\family default +, de repetición. +\end_layout + +\begin_layout Enumerate + +\family typewriter +^ +\family default +, de comienzo de línea, y +\family typewriter +$ +\family default +, de final. +\end_layout + +\begin_layout Enumerate + +\family typewriter +| +\family default + de disyunción entre los elementos a izquierda y derecha. +\end_layout + +\begin_layout Enumerate + +\family typewriter +/ +\family default +, para reconocer la expresión regular de la izquierda solo si va seguida + de la de la derecha ( +\emph on +look-ahead +\emph default +). +\end_layout + +\begin_layout Standard +También se puede agrupar con paréntesis +\family typewriter +( +\family default +... +\family typewriter +) +\family default +, preceder un símbolo de +\family typewriter + +\backslash + +\family default + para evitar que se trate como un operador o indicar una cadena de caracteres + literal con +\family typewriter +" +\family default +... +\family typewriter +" +\family default +. + Otros operadores: +\end_layout + +\begin_layout Enumerate + +\family typewriter +[ +\family default +... +\family typewriter +] +\family default + indica disyunción entre los caracteres del conjunto indicado. + +\family typewriter +\emph on +a +\emph default +- +\emph on +b +\family default +\emph default + indica todos los caracteres entre +\family typewriter +\emph on +a +\family default +\emph default + y +\family typewriter +\emph on +b +\family default +\emph default +, inclusive; +\family typewriter +^ +\family default + al principio complementa el conjunto; +\family typewriter + +\backslash + +\family default + indica caracteres de escape; +\family typewriter +[: +\family default +... +\family typewriter +:] +\family default + indica una clase de caracteres como +\family typewriter +[:digit:] +\family default + o +\family typewriter +[:alnum:] +\family default +, y cualquier otro caracter dentro de los corchetes se indica a sí mismo. +\end_layout + +\begin_layout Enumerate + +\family typewriter +. + +\family default + indica cualquier caracter salvo salto de línea. +\end_layout + +\begin_layout Enumerate + +\family typewriter +<<EOF>> +\family default + indica final de fichero. +\end_layout + +\begin_layout Standard +Llamamos +\series bold +caracteres de anticipación +\series default + a los que se leen al hacer +\emph on +look-ahead +\emph default + para determinar el final de un +\emph on +token +\emph default +, lo que hace falta cuando hay reglas que acaban en +\family typewriter ++ +\family default +, +\family typewriter +* +\family default +, +\family typewriter +? +\family default +, +\family typewriter +$ +\family default + y +\family typewriter +/ +\family default +, y cuando un lexema de una expresión regular puede ser prefijo de uno de + otra. + +\emph on +Flex +\emph default + maneja esto de forma automática, devolviendo a la entrada los caracteres + no usados ( +\emph on +push back +\emph default +). + +\end_layout + +\begin_layout Standard +En caso de ambigüedad en las reglas, +\emph on +Flex +\emph default + reconoce el lexema más largo posible que pueda estar asociado a una expresión + regular, y si este puede corresponder a varias, se asocia a la que aparezca + antes. + Así, las palabras reservadas deben estar antes que la expresión regular + que reconoce los identificadores. +\end_layout + +\begin_layout Subsection +Construcción e implementación del autómata +\end_layout + +\begin_layout Standard +Se podría obtener un AFD correspondiente a las expresiones regulares directament +e, pero esto es difícil, por lo que se obtiene un AFND y, como su simulación + es costosa, se construye entonces un AFD equivalente y se minimiza. + Podemos simular directamente la tabla de transiciones con los estados o + simular el diagrama de transiciones mediante código específico. + De esto se encarga +\emph on +Flex +\emph default +. +\end_layout + +\begin_layout Subsection +Diseño de la interfaz de entrada y salida +\end_layout + +\begin_layout Standard +Para la entrada, es muy ineficiente leer el código de caracter a caracter, + por lo que se lee en bloques que se guardan en +\emph on +buffers +\emph default +, que deben diseñarse permitiendo secuencias largas de caracteres de anticipació +n. + La salida suele ser una o varias funciones que el analizador sintáctico + llama para obtener el siguiente +\emph on +token +\emph default +. + +\emph on +Flex +\emph default + proporciona la siguiente interfaz: +\end_layout + +\begin_layout Description + +\family typewriter +yytext +\family default + Último lexema leído. +\end_layout + +\begin_layout Description + +\family typewriter +yyleng +\family default + Longitud de +\family typewriter +yytext +\family default +. +\end_layout + +\begin_layout Description + +\family typewriter +yylineno +\family default + Activando la opción +\family typewriter +yylineno +\family default +, número de línea actual. +\end_layout + +\begin_layout Description + +\family typewriter +yymore() +\family default + Indica que, la próxima vez que se lea un lexema, este se debería concatenar + al de +\family typewriter +yytext +\family default + en vez de reemplazarlo. +\end_layout + +\begin_layout Description + +\family typewriter +yyless(int) +\family default + Retrasa el puntero de lectura para que apunte al caracter de +\family typewriter +yytext +\family default + con el índice dado. +\end_layout + +\begin_layout Description + +\family typewriter +yywrap() +\family default + Se ejecuta al alcanzarse el final del fichero. +\end_layout + +\begin_layout Description + +\family typewriter +yyin +\family default + Descriptor de fichero de donde se lee. +\end_layout + +\begin_layout Description + +\family typewriter +yyout +\family default + Descriptor de fichero al que se escribe al usar la opción +\family typewriter +echo +\family default +. +\end_layout + +\begin_layout Description + +\family typewriter +input() +\family default + Lee el siguiente caracter del flujo de entrada. +\end_layout + +\begin_layout Description + +\family typewriter +output(char) +\family default + Escribe el caracter dado en la salida. +\end_layout + +\begin_layout Description + +\family typewriter +unput(char) +\family default + Coloca el caracter dado en el flujo de entrada, para que sea el primero + leído en la próxima ocasión. +\end_layout + +\begin_layout Subsection +Manejo de errores +\end_layout + +\begin_layout Standard +Una forma sencilla es la +\series bold +recuperación en modo pánico +\series default +: ignorar caracteres hasta encontrar un caracter válido para un nuevo +\emph on +token +\emph default +. + Para implementarlo es necesaria una expresión regular capaz de reconocer + un conjunto de caracteres erróneos antes del comienzo de un nuevo lexema. + Otras técnicas permiten borrar un caracter extraño, insertar uno que falta, + reemplazar un caracter incorrecto por otro correcto o intercambiar caracteres + adyacentes. +\end_layout + +\end_body +\end_document |
