diff options
author | Guillermo Ramos | 2014-06-26 22:22:53 +0200 |
---|---|---|
committer | Guillermo Ramos | 2014-06-26 22:25:41 +0200 |
commit | 182c3d0666da6c38d1da954620572faf956d07bd (patch) | |
tree | 5696b90a5198786a69ded62c871de11132422416 /memoria.tex | |
parent | fa671c4397e24d1f42a031aba8304405f5a9ad12 (diff) | |
download | tfg-182c3d0666da6c38d1da954620572faf956d07bd.tar.gz |
Sintáctico
Diffstat (limited to 'memoria.tex')
-rwxr-xr-x | memoria.tex | 126 |
1 files changed, 105 insertions, 21 deletions
diff --git a/memoria.tex b/memoria.tex index ec9c4c2..1cfdf99 100755 --- a/memoria.tex +++ b/memoria.tex @@ -550,8 +550,6 @@ A lo largo de este capítulo se detallará el proceso que se ha seguido para implementar la funcionalidad que permita a la especificación del coste de algoritmos en EasyCrypt. -TODO referencias a dónde se explica qué. - \newpage \section{Motivación} \label{sec:motivacion} @@ -720,14 +718,14 @@ de abstracción distintos. Conceptualmente, las fases de análisis son las siguientes: \begin{itemize} -\item \textbf{Análisis léxico} -Esta fase es la primera que se lleva a cabo y la que tiene un menor nivel de -abstracción; su entrada es el propio fichero fuente. Durante el análisis léxico -se transforma la secuencia de caracteres que forma el código fuente en unidades -mínimas de información (\textbf{tokens}): número, cadena de caracteres, -identificador, comentario, inicio de bloque, etc. La salida de esta fase es una -lista conteniendo todos los tokens que describen el programa original, formando -una estructura de datos muy simple pero más sencilla de recorrer y manejar. +\item \textbf{Análisis léxico} Esta fase es la primera que se lleva a cabo y la + que tiene un menor nivel de abstracción; su entrada es el propio fichero + fuente. Durante el análisis léxico se transforma la secuencia de caracteres + que forma el código fuente en unidades mínimas de información + (\textbf{tokens}): número, cadena de caracteres, identificador, comentario, + inicio de bloque, etc. La salida de esta fase es una lista conteniendo todos + los tokens que describen el programa original, formando una estructura de + datos muy simple pero más sencilla de recorrer y manejar. \item \textbf{Análisis sintáctico} Durante esta fase se transforma la lista de tokens generada durante el análisis léxico en el denominado \textbf{árbol @@ -736,21 +734,21 @@ una estructura de datos muy simple pero más sencilla de recorrer y manejar. la gramática formal del lenguaje (gramáticas libres de contexto, por lo general), cuyas reglas determinan el algoritmo a seguir durante la construcción del árbol sintáctico. -\item \textbf{Análisis semántico/contextual} -Durante esta fase se recorre el árbol sintáctico generado previamente y se anota -con información de tipos, se construye la tabla de símbolos y se comprueba que -el programa, además de estar bien formado sintácticamente, tiene sentido -semánticamente. + +\item \textbf{Análisis semántico/contextual} Durante esta fase se recorre el + árbol sintáctico generado previamente y se anota con información de tipos, se + construye la tabla de símbolos y se comprueba que el programa, además de estar + bien formado sintácticamente, tiene sentido semánticamente. \end{itemize} EasyCrypt implementa cada una de estas etapas en tres módulos (EcLexer, EcParser y EcTyping) y define las estructuras de datos intermedias en otros dos (EcParseTree para el árbol sintáctico abstracto y EcFol para el árbol sintáctico anotado con información de tipos). Los módulos EcLexer y EcParser hacen uso de -la biblioteca Menhir mencionada anteriormente para generar los -analizadores. Estos módulos contienen las definiciones de tokens y las reglas de -las gramáticas regular y libre de contexto usadas para indicar, respectivamente, -el comportamiento de los analizadores léxico y sintáctico. Todo este proceso +la biblioteca Menhir mencionada anteriormente para generar los analizadores. +Estos módulos contienen las definiciones de tokens y las reglas de las +gramáticas regular y libre de contexto usadas para indicar, respectivamente, el +comportamiento de los analizadores léxico y sintáctico. Todo este proceso aparece ilustrado en la figura \ref{fig:ecparser}. \tikzstyle{line} = [draw] @@ -853,6 +851,7 @@ Form>>. La sintaxis concreta que usa Menhir es la siguiente: | [<tokens o reglas>] { <valor_semántico> } | [<tokens o reglas>] { <valor_semántico> } | ... + ; \end{lstlisting} Cada regla define un símbolo no terminal ($<$nombre_regla$>$) que la identifica, @@ -863,7 +862,90 @@ referencia a tokens o a otras reglas, y termina con una expresión entre llaves <<\{ , \}>> conteniendo las \textbf{acciones semánticas} de la regla (los efectos secundarios que se llevan a cabo durante su expansión). -TODO: modificaciones en EcParser y EcParseTree +Como el objetivo de esta fase es generar un árbol sintáctico abstracto, cada +regla será la responsable de generar un nodo con su representación abstracto +como acción semántica. Por eso, antes de escribir nuestras reglas modificaremos +el fichero que define el árbol sintáctico. + +Para empezar, añadiremos un nodo que represente el operador especial de +coste. De ahora en adelante lo llamaremos \textbf{expresión} de coste, ya que al +fin y al cabo es una expresión (se evalúa a un número entero) y no provoca +ambigüedad con el resto de operadores normales. La definición es la siguiente: + +\begin{code} + \begin{minted}{ocaml} +type pcexpr = (pqsymbol * pexpr list) located + \end{minted} + \caption{Nodo: expresión de coste (ecParseTree.ml)} +\end{code} + +Es decir, que ``pcexpr'' (<<parsed cost expression>>) es un tipo de datos cuyos +valores son tuplas <<(símbolo, [expresiones])>> que almacenan respectivamente el +operador cuyo coste se está evaluando y sus argumentos, y además contienen +información de su ubicación en el código fuente: fila y columna +(<<located>>). + +A continuación definiremos el nodo correspondiente al axioma de coste: + +\begin{code} + \begin{minted}{ocaml} +type pcaxiom = { + pca_name : psymbol; + pca_cargs : ptybindings option; + pca_spec : pformula; +} + \end{minted} + \caption{Nodo: axioma de coste (ecParseTree.ml)} +\end{code} + +El axioma de coste es un ``record'' (estructura de datos con varios campos) que +almacena su nombre, argumentos (opcionales) y especificación. La especificación +es una fórmula: expresiones que pueden estar cuantificadas existencialmente o +universalmente. Por tanto, también necesitaremos modificar el tipo de datos +fórmula para que pueda contener expresiones de coste: + +\begin{code} + \begin{minted}{ocaml} +type pformula = pformula_r located + +and pformula_r = + | PFhole + | PFint of int + | PFtuple of pformula list + + (* ... *) + + | PFcost of pcexpr + \end{minted} + \caption{Nodo: fórmulas (ecParseTree.ml)} +\end{code} + +Una vez tenemos los nodos definidos, volvemos al analizador sintáctico para +definir las reglas: + +\begin{lstlisting}[frame=lrtb] +cexpr: + | COST '[' op=qident ']' + { (* ... *) + (op, []) } + | COST '[' op=qident ',' ps=plist0(expr, ',') ']' + { (* ... *) + (op, ps) } + ; + +caxiom: + | CAXIOM x=ident args=ptybindings? ':' spec=form + { { pca_name=x; pca_cargs=args; pca_spec=spec } } + ; +\end{lstlisting} + +Se puede observar cómo cada regla, además de definir la sintaxis, crea su nodo +correspondiente y lo devuelve como valor semántico. Esto es todo lo que +necesitamos para que EasyCrypt reconozca sintácticamente las nuevas +construcciones. + +A continuación pasaremos a la última etapa de la implementación del coste, y la +más compleja: modificar el analizador semántico. \section{Modificaciones al analizador semántico} \label{sec:modif-al-anal-sem} @@ -1268,7 +1350,7 @@ A continuación veremos los pasos que se han realizado para abordar la implementación del cliente, partiendo del diseño de la figura \ref{fig:prototype}. -\subsection{Colocación de elementos} +\subsection{Colocación de elementos} %TODO quitar (índice) \label{sec:coloc-de-elem} A la hora de distribuir los elementos de la página principal se ha usado una @@ -1428,6 +1510,8 @@ A lo largo de este documento hemos abordado la mejora de dos aspectos relativamente independientes de EasyCrypt: una principalmente técnica (coste) y otra de usabilidad (interfaz web). +% TODO qué he aprendido + EasyCrypt es un marco orientado a un usuario muy concreto: profesionales de la criptografía. Si bien es cierto que en el propio Instituto IMDEA Software se usa y desarrolla activamente, el objetivo último sería crear comunidad. La |