\paragraph{Parser}

\begin{figure}[!ht] 
	\centering
	\fbox{\pdfimage width 6in {Imagenes/EstadosParserCallgrind.pdf}}
	\caption{Diagrama de estados de Parsing} 
	\label{fig:DiagramaEstados}
\end{figure}

El Parser consta de dos iteraciones en las cuales se recorre el fichero por completo.
En la primera iteración obtenemos los identificadores de cada uno de los tests de eficiencia que han sido creados.
En la segunda pasada, buscamos las llamadas a cada uno de los tests y tomamos todos sus valores.

en el primer parsing obtenemos los identificadores a partir de los nombres de los métodos.
La primera vez que aparece una función en el fichero de salida del profiler, además de un identificador de función, también muestra el nombre de ésta.
Por esta razón es relevante el nombre con el que llamemos a las funciones de testeo ya que el parser buscará la estructura siguiente: \textit{xxxTest::testxxx()}.
Además de los identificadores de los tests, también debemos encontrar los identificadores para los métodos {\it Start()} y {\it Stop()}.
Una vez concluido el primer parsing, tendremos la lista de relaciones entre los métodos y sus respectivos identificadores.

En el segundo parsing buscaremos el inicio de la definición de cada una de los tests a partir de la lista de identificadores y tomaremos todos los valores de eficiencia del código que esté delimitado entre los métodos {\it Start()} y {\it Stop()}.
En el caso que un test no tuviera los métodos delimitadores, se tomarían los costes pertenecientes a todas las líneas de código del test en cuestión.

El proceso se puede representar con el siguiente diagrama de estados: \ref{fig:DiagramaEstados}:

Una vez realizados los dos parsings, pasaremos de una estructura como la mostrada en la list \ref{list:EstructuraTestCallgrind} a una estructura como la que se muestra en la list \ref{code:testMap}

\begin{lstlisting}[
	caption={Estructura de un test en Callgrind},
	label={list:EstructuraTestCallgrind}
	]
	fn=(3068)
	68 3 0 1 1 0 0 1
	+2 7 1 4 1
	cfn=(3072) Start()
	calls=1 -27 
	* 4 2 1 1
	+1 9 5 4 1
	cfn=(3074)
	calls=1 -64 
	* 114 38 20 3 0 0 2
	* 1 0 1
	+1 3 1 2
	cfn=(5000) FinMath::exp(float*, float*,int)
	calls=1 -17 
	* 10 6 3 1 0 0 1
	+1 3 1 2 1 0 0 1
	cfn=(3076) Stop()
	calls=1 -28 
\end{lstlisting}


\begin{lstlisting}[
	caption={Estructura de un test en Python},
	label={code:testMap},
	language={Python}
	]
{
	'FinMathTest::testExp()':
	{
		['1','-64'],
		['*','114','38','20','3','0','0','2'],
		['*','1','0','1'],
		['+1','3','1','2'],
		['1','-17'],
		['*','10','6','3','1','0','0','1'],
		['+1','3','1','2','1','0','0','1']
	}
}	  
\end{lstlisting}















