<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Barriblog &#187; bison</title>
	<atom:link href="http://www.barriblog.com/index.php/tag/bison/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.barriblog.com</link>
	<description>Buscando barrios de blogs</description>
	<lastBuildDate>Mon, 30 Jan 2012 16:57:16 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Despertando a Lestat</title>
		<link>http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/</link>
		<comments>http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/#comments</comments>
		<pubDate>Wed, 27 May 2009 11:31:39 +0000</pubDate>
		<dc:creator>M.Luz Congosto</dc:creator>
				<category><![CDATA[Entorno de desarrollo]]></category>
		<category><![CDATA[bison]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[lestat]]></category>

		<guid isPermaLink="false">http://www.barriblog.com/?p=185</guid>
		<description><![CDATA[0 He despertado a  Lestat para ampliar y mejorar sus funciones. Es una dura tarea retomar un programa que se ha dejado reposar demasiado tiempo. Con paciencia y perseverancia estoy intentando  volver a entenderlo como el día que lo  dejé aunque esto tiene su precio. Una de las facturas que me ha pasado Lestat por [...]]]></description>
			<content:encoded><![CDATA[<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><div class='dd-google1-ajax-load dd-google1-185'></div><g:plusone size='medium' href='http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/'></g:plusone></div><div class='dd_button'><div class='dd-linkedin-ajax-load dd-linkedin-185'></div><script type='in/share' data-url='http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/' data-counter='right'></script></div><div class='dd_button'><div class='dd-twitter-ajax-load dd-twitter-185'></div><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/" data-count="horizontal" data-text="Despertando a Lestat" data-via="" ></a></div><div class='dd_button'><div class='dd-fbshare-ajax-load dd-fbshare-185'></div><a class='DD_FBSHARE_AJAX_185' name='fb_share' type='button_count' share_url='http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/' href='http://www.facebook.com/sharer.php'></a></div><div class='dd_button'><div class='dd_delicious_compact_image dd_delicious'><a class='dd_delicious_compact_image' href='http://delicious.com/save' onclick="window.open('http://delicious.com/save?v=5&amp;noui&amp;jump=close&amp;url='+encodeURIComponent('http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/')+'&amp;title='+encodeURIComponent('Despertando a Lestat'),'delicious', 'toolbar=no,width=550,height=550'); return false;"><span id='DD_DELICIOUS_AJAX_POST_ID'><div style='padding-top:3px'>0</div></span></a></div></div></div><div style='clear:both'></div></div><div style='clear:both'></div><p><img class="alignnone size-full wp-image-201" title="bug-lestat-config1" src="http://www.barriblog.com/wp-content/uploads/2009/05/bug-lestat-config1.jpg" alt="bug-lestat-config1" width="450" /></p>
<p>He despertado a  <a href="http://www.barriblog.com/index.php/2007/07/22/la-importancia-de-llamarse-ernesto/">Lestat </a>para ampliar y mejorar sus funciones. Es una dura tarea retomar un programa que se ha dejado reposar demasiado tiempo. Con paciencia y perseverancia estoy intentando  volver a entenderlo como el día que lo  dejé aunque esto tiene su precio.</p>
<p>Una de las facturas que me ha pasado <strong>Lestat</strong> por este abandono ha sido un <em>bug</em> que me ha costado un poco encontrarlo. Estoy falta de reflejos pero en mi favor tengo que decir que el <em>bug </em>tenía  un sentido del humor muy sutil. Aquí lo cuento para que juzgue el lector:</p>
<p>Una de las funciones que le he añadido a <strong>Lestat </strong>es un fichero de configuración para darle más flexibilidad en la ejecución. Para ello he definido una gramática que permita describir la configuración y la he analizado con<a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex"> lex</a>/<a href="http://es.wikipedia.org/wiki/GNU_Bison">bison</a>.  Además de la  definición del léxico de la gramática puse una expresión regular para descartar caracteres en blanco, tabulaciones y saltos de línea de esta manera <code> [\ \t\n]*</code> y un <em>default </em>para gestionar errores léxicos  que ejecutaba lo siguiente:</p>
<p><code>fprintf(stderr,  "Error lexico en linea %d. Mira a ver si \'%s\' es el culpable.\n",  yylineno, yytext);<br />
fprintf(stderr,"Lestat le desea mejor suerte la proxima vez \n");</code></p>
<p>Al ejecutar el analizador del fichero de configuración obtenía un resultado incomprensible:</p>
<p><code>' es el culpable.inea 1. Mira a ver si '<br />
Lestat le desea mejor suerte la próxima vez</code></p>
<p>Primero sospeché que la función <strong>fprintf </strong>tenía un error en los parámetros y que el stack estaba corrupto. Lo miré con tanta fijeza como incredulidad.  Tras muchas trazas y muchas vueltas encontré la explicación:</p>
<p>El fichero de configuración lo había escrito en Windows por lo que el  salto de línea era <a href="http://es.wikipedia.org/wiki/CRLF">&lt;CR&gt;&lt;LF&gt;</a> (\r\n) en vez de carácter  de salto  de línea &lt;LF&gt; (\n) que utiliza unix. El análisis léxico detectaba el carácter  &lt;CR&gt;  como error léxico y se ejecutaba la sentencia:</p>
<p><code>fprintf(stderr,  "Error lexico en linea %d. Mira a ver si \'%s\' es el culpable.\n",  yylineno, yytext);</code></p>
<p>yytext contenía un &lt;CR&gt; que hacía que cuando se había escrito</p>
<p><code>Error lexico en linea 1. Mira a ver si '</code></p>
<p>Se volviera al inicio de la línea para escribir lo restante:</p>
<p><code> es el culpable.inea 1. Mira a ver si’</code></p>
<p>La solución al problema era tan sencilla como poner la expresión regular <code>[\ \t\r\n]*</code> para filtrar blancos, tabulaciones y salto de línea.</p>
<p>Estas son las cosas que pasan en la programación y que nos hacen perder mucho tiempo</p>
<script type="text/javascript"> jQuery(document).ready(function($) { window.setTimeout('loadGoogle1_185()',1000);window.setTimeout('loadLinkedin_185()',1000);window.setTimeout('loadTwitter_185()',1000);window.setTimeout('loadFBShare_185()',1000); }); </script><script type="text/javascript"> function loadGoogle1_185(){ jQuery(document).ready(function($) { $('.dd-google1-185').remove();$.getScript('https://apis.google.com/js/plusone.js'); }); } function loadLinkedin_185(){ jQuery(document).ready(function($) { $('.dd-linkedin-185').remove();$.getScript('http://platform.linkedin.com/in.js'); }); } function loadTwitter_185(){ jQuery(document).ready(function($) { $('.dd-twitter-185').remove();$.getScript('http://platform.twitter.com/widgets.js'); }); } function loadFBShare_185(){ jQuery(document).ready(function($) { $('.dd-fbshare-185').remove(); $.getScript('http://static.ak.fbcdn.net/connect.php/js/FB.Share'); }); }</script><!-- Social Buttons Generated by Digg Digg plugin v4.5.3.4, 
    Author : Yong Mook Kim
    Website : http://www.diggdigg2u.com -->]]></content:encoded>
			<wfw:commentRss>http://www.barriblog.com/index.php/2009/05/27/despertando-a-lestat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

