<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Hani Tech</title><link>http://blogs.msdn.com/haniatassi/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Using a 32bit Native DLL in Windows Azure</title><link>http://blogs.msdn.com/haniatassi/archive/2009/03/20/using-a-32bit-dll-in-the-windows-azure.aspx</link><pubDate>Fri, 20 Mar 2009 10:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9491939</guid><dc:creator>hania</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/haniatassi/comments/9491939.aspx</comments><wfw:commentRss>http://blogs.msdn.com/haniatassi/commentrss.aspx?PostID=9491939</wfw:commentRss><description>&lt;p&gt;With the Mix2009 release of Windows Azure tools, we now support native code execution. This also includes the ability to debug native code. As you would imagine, you can do PInvoke’s to system DLL’s or to your packaged native DLL with your role. &lt;/p&gt;  &lt;p&gt;The image in Windows Azure runs on a 64bit OS. Role hosts (web and worker hosts) are also 64 bit executables which result in your web and worker roles runing as 64bit binaries. That means if you want to PInvoke directly into your native DLL, your native DLL must be compiled for 64bit platform, otherwise you would get the error:&lt;/p&gt;  &lt;h4&gt;&lt;i&gt;An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)&lt;/i&gt;&lt;/h4&gt;  &lt;p&gt;The simplest solution is to rebuild the assembly we are trying to load to 64bit, but there are some cases that we cannot do that like if we don’t own the source code. One way is to host the 32bit dll in a 32bit program that runs on WoW. Then we can use WCF to marshal all calls between the role process (which is 64bit) and our out-of-proc dll (which is 32bit).&lt;/p&gt;  &lt;p&gt;I will show you an example on how to do that with a WebRole. My demo involves a 32bit NativeLibrary.dll that contains an Add function; Also, a managed DllHost86.exe that acts as a WCF server and as a host for the Native Library. The managed DllHost86 is configured to be built for x86 specific:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/Usinga32bitDLLintheWindowsAzure_5B6/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/Usinga32bitDLLintheWindowsAzure_5B6/image_thumb_2.png" width="524" height="208" /&gt;&lt;/a&gt;Both the NativeLibrary and the Dll-Host are configured to output their binaries to the webrole Redist folder. Also, we added these files as contents to the web role project to make sure they are packaged when launching under the devfabric or deployed to the Cloud:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/Usinga32bitDLLintheWindowsAzure_5B6/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/Usinga32bitDLLintheWindowsAzure_5B6/image_thumb_3.png" width="240" height="404" /&gt;&lt;/a&gt;The interactions between the Dll-Host and the web role goes like the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;On any request to the web role (using Application_BeginRequest event), we check if the DllHost86 process is running.      &lt;ol&gt;       &lt;li&gt;If not running, launch the process. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Also, on any request to the web role, try to connect the WCF client to the WCF server hosted inside the DllHost86 process. Once connected, cache the client object in the server current session (Application session). Next time we actually get the client from the session and just check if the connection is valid. &lt;/li&gt;    &lt;li&gt;The binding used on WCF is NetNamedPipeBinding for optimal performance on the same machine communication. &lt;/li&gt;    &lt;li&gt;The time out on the WCF link is set to infinity. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The code (from Global.asax) is shown next:&lt;/p&gt; &lt;style type="text/css"&gt;










.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ClientInitTimeOut = 20; &lt;span class="rem"&gt;// in seconds&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Application_BeginRequest(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Make sure that our dll host is running&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    EnsureDllHostRunning();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;// Make sure the client is connected&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    EnsureCalcServiceClientConnected();&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; EnsureDllHostRunning()&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    Process[] p = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(dllHostPath));&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (p.Length == 0)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Application[&lt;span class="str"&gt;&amp;quot;CalcServiceClient&amp;quot;&lt;/span&gt;] = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;        ProcessStartInfo psi = &lt;span class="kwrd"&gt;new&lt;/span&gt; ProcessStartInfo(dllHostPath);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Process dllHost = Process.Start(psi);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; EnsureCalcServiceClientConnected()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    CalcServiceClient client;&lt;/pre&gt;

  &lt;pre&gt;    client = (CalcServiceClient)Application[&lt;span class="str"&gt;&amp;quot;CalcServiceClient&amp;quot;&lt;/span&gt;];&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (client == &lt;span class="kwrd"&gt;null&lt;/span&gt; || client.State != System.ServiceModel.CommunicationState.Opened)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        client = GetCalcServiceClient();&lt;/pre&gt;

  &lt;pre&gt;        Application[&lt;span class="str"&gt;&amp;quot;CalcServiceClient&amp;quot;&lt;/span&gt;] = client;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; CalcServiceClient GetCalcServiceClient()&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    CalcServiceClient serv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; retryCount = 0;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;bool&lt;/span&gt; connected = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;while&lt;/span&gt; (retryCount &amp;lt; ClientInitTimeOut * 10)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;/pre&gt;

  &lt;pre class="alt"&gt;            EndpointAddress address = &lt;span class="kwrd"&gt;new&lt;/span&gt; EndpointAddress(&lt;span class="str"&gt;&amp;quot;net.pipe://localhost/CalculatorService&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;            NetNamedPipeBinding binding = &lt;span class="kwrd"&gt;new&lt;/span&gt; NetNamedPipeBinding();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            binding.ReceiveTimeout = TimeSpan.MaxValue;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            serv = &lt;span class="kwrd"&gt;new&lt;/span&gt; CalcServiceClient(binding, address);&lt;/pre&gt;

  &lt;pre&gt;            serv.Open();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Debug.WriteLine(&lt;span class="str"&gt;&amp;quot;state = &amp;quot;&lt;/span&gt; + serv.State);&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (serv.State == System.ServiceModel.CommunicationState.Opened)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                connected = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            Debug.WriteLine(e.Message);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        retryCount++;&lt;/pre&gt;

  &lt;pre&gt;        System.Threading.Thread.Sleep(100);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!connected)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; TimeoutException(&lt;span class="str"&gt;&amp;quot;Couldn't connect to the calculator service.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; serv;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So far, we setup the web role to startup the dll host and setup the client connection to the WCF server inside the DllHostx86. The code there is just a standard code that uses ServiceHost and just waits forever. Here is the code from the Program class:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Uri address = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;net.pipe://localhost/CalculatorService&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            NetNamedPipeBinding binding = &lt;span class="kwrd"&gt;new&lt;/span&gt; NetNamedPipeBinding();&lt;/pre&gt;

  &lt;pre&gt;            binding.ReceiveTimeout = TimeSpan.MaxValue;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (ServiceHost host = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceHost(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Calculator)))&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                host.AddServiceEndpoint(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ICalcService), binding, address);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;                ServiceMetadataBehavior metadata = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceMetadataBehavior();&lt;/pre&gt;

  &lt;pre class="alt"&gt;                host.Description.Behaviors.Add(metadata);&lt;/pre&gt;

  &lt;pre&gt;                Binding mexBinding = MetadataExchangeBindings.CreateMexNamedPipeBinding();&lt;/pre&gt;

  &lt;pre class="alt"&gt;                Uri mexAddress = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;net.pipe://localhost/CalculatorService/Mex&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;                host.AddServiceEndpoint(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(IMetadataExchange), mexBinding, mexAddress);&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;/pre&gt;

  &lt;pre&gt;                host.Open();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;The receiver is ready&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;                Console.ReadLine();&lt;/pre&gt;

  &lt;pre&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;So, the service we expose contains an Add methods that is implemented internally to call the native method using PInvoke. Here is a sample of the implementation:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Calculator : ICalcService&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        [DllImport(&lt;span class="str"&gt;&amp;quot;NativeLibrary.dll&amp;quot;&lt;/span&gt;, EntryPoint=&lt;span class="str"&gt;&amp;quot;Add&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; UInt32 NativeAdd(UInt32 a, UInt32 b);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; ICalcService Members&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Add(&lt;span class="kwrd"&gt;int&lt;/span&gt; num1, &lt;span class="kwrd"&gt;int&lt;/span&gt; num2)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Received numbers: {0}, {1}&amp;quot;&lt;/span&gt;, num1, num2);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;)NativeAdd((&lt;span class="kwrd"&gt;uint&lt;/span&gt;)num1, (&lt;span class="kwrd"&gt;uint&lt;/span&gt;)num2);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;I tested the sample above in the cloud and it works fine. I also attached it for your reference. Here is how it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/Usinga32bitDLLintheWindowsAzure_5B6/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/Usinga32bitDLLintheWindowsAzure_5B6/image_thumb_4.png" width="497" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;So, in this blog, I demonstrated how to use a 32bit dll in the Cloud by means of hosting it under a 32bit process and then use WCF communication to do the marshaling. &lt;/p&gt;

&lt;p&gt;Hope it helps.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9491939" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/haniatassi/attachment/9491939.ashx" length="739935" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/haniatassi/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Azure/default.aspx">Azure</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Win32/default.aspx">Win32</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/DllHost/default.aspx">DllHost</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Cloud/default.aspx">Cloud</category></item><item><title>Getting rid of Warning VSP2013 in MSBuild</title><link>http://blogs.msdn.com/haniatassi/archive/2009/02/04/getting-rid-of-warning-vsp2013-in-msbuild.aspx</link><pubDate>Wed, 04 Feb 2009 22:58:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9396533</guid><dc:creator>hania</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/haniatassi/comments/9396533.aspx</comments><wfw:commentRss>http://blogs.msdn.com/haniatassi/commentrss.aspx?PostID=9396533</wfw:commentRss><description>&lt;p&gt;Running instrumentation and tests as part of the build machine could produce the VSP2013 warning. Our build machine is 64 bit and the VSInstr.exe tool seems to only work on platform dependent assemblies instead of just platform diagnostic as usually your assemblies are built using the platform (Any CPU).&lt;/p&gt;  &lt;p&gt;The default vsinstr.exe used is the 32bit version even if you are instrumenting on a 64bit machine. This is because MSTest.exe and Visual Studio are both 32bit applications. So, if MSTest is going to run your tests it should operate on a 32bit or platform independent assemblies. Yet, you can change the default to use the 64bit version of vsinstr.exe by changing this registry key:&lt;/p&gt;  &lt;p&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\InstalledProducts\Instrumentation\Location&lt;/p&gt;  &lt;p&gt;to point to the x64 folder. In my machine it’s: C:\Program Files (x86)\Microsoft Visual Studio 9.0\Team Tools\Performance Tools\x64&lt;/p&gt;  &lt;p&gt;This should remove the warning. But as I said, if you are running your tests using MStest.exe as part of the build machine, this won’t allow your tests to run.&lt;/p&gt;  &lt;p&gt;Off course, the easiest way to fix the warning without any hacks is to build your assemblies using the platform x86. If you don’t want to do that because you still want to produce platform independent assemblies, you can do this simple hack.&lt;/p&gt;  &lt;p&gt;Write a command line file in the same folder of the VSInstr.exe tool that calls VSInstr.exe with –nowarn:2013.&lt;/p&gt;  &lt;p&gt;Here are the steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create the file “VsInstrNoWarn2013.cmd” under “C:\Program Files (x86)\Microsoft Visual Studio 9.0\Team Tools\Performance Tools”&lt;/li&gt;    &lt;li&gt;Write the following in the command file:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;%~dp0\VsInstr.exe&amp;quot; -NOWARN:2013 %1 %2 %3 %4 %5 %6 %7 %8 %9&lt;/li&gt;    &lt;li&gt;Change the key value of “HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\InstalledProducts\Instrumentation\VSInstr” from VsInstr.exe to VsInstrNoWarn2013.cmd&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In this way, MSTest will execute VSInstrNoWarn2013.cmd instead and all arguments will be forwarded.&lt;/p&gt;  &lt;p&gt;I tested this and seems to work fine as part of a build machine. I haven’t tested this as part of a regular Visual Studio run.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9396533" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/haniatassi/archive/tags/msbuild/default.aspx">msbuild</category></item><item><title>Statement Translation using Functional Programming in C#</title><link>http://blogs.msdn.com/haniatassi/archive/2009/01/31/statement-translation-using-functional-programming-in-c.aspx</link><pubDate>Sun, 01 Feb 2009 10:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9387883</guid><dc:creator>hania</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/haniatassi/comments/9387883.aspx</comments><wfw:commentRss>http://blogs.msdn.com/haniatassi/commentrss.aspx?PostID=9387883</wfw:commentRss><description>&lt;P&gt;I will demonstrate here how we can use the functional programming feature in C# to program something like a statement/expression translation. Basically, we will translate a statement tree into a function that we can call to run the program. I am not using Linq Expression as demonstrated in my previous blog. Instead, I will show how to use functional programming.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;STYLE type=text/css&gt;








.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The expression list we support is a very small subset of a real programming language, the definition in detail is:&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=528&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;int&lt;/TD&gt;
&lt;TD vAlign=top width=423&gt;an integer constant&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=108&gt;variable&lt;/TD&gt;
&lt;TD vAlign=top width=419&gt;variable reference&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=112&gt;plus&lt;/TD&gt;
&lt;TD vAlign=top width=416&gt;expression + expression&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=115&gt;multiply&lt;/TD&gt;
&lt;TD vAlign=top width=413&gt;expression * expression&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;The classes are:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// base class for the expression node&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;abstract&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Expression&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=rem&gt;// defines a constant integer&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Int : Expression&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Int(&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; i)&lt;/PRE&gt;&lt;PRE&gt;        {&lt;/PRE&gt;&lt;PRE class=alt&gt;            Value = i;&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; Value { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// defines a variable reference&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Variable : Expression&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Variable(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; name)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            Name = name;&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; Name { get; set; }&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=rem&gt;// defines a plus expression&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Plus : Expression&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Plus(Expression left, Expression right)&lt;/PRE&gt;&lt;PRE&gt;        {&lt;/PRE&gt;&lt;PRE class=alt&gt;            Left = left;&lt;/PRE&gt;&lt;PRE&gt;            Right = right;&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Left { get; set; }&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Right { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// defines a multiplication expression&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Multiply : Expression&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Multiply(Expression left, Expression right)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            Left = left;&lt;/PRE&gt;&lt;PRE class=alt&gt;            Right = right;&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Left { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Right { get; set; }&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Our supported statements are just a very small subset of the whole programming language. It contains, an assignment, if, while, skip, and a sequence of statements. The definition in detail is:&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=528&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Assignment&lt;/TD&gt;
&lt;TD vAlign=top width=423&gt;variable := expression&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=108&gt;if&lt;/TD&gt;
&lt;TD vAlign=top width=419&gt;if (expression) then statement else statement&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=112&gt;while&lt;/TD&gt;
&lt;TD vAlign=top width=416&gt;while (expression) then statement&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=115&gt;seq&lt;/TD&gt;
&lt;TD vAlign=top width=413&gt;statement, statement&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=118&gt;skip&lt;/TD&gt;
&lt;TD vAlign=top width=411&gt;does nothing, e.g. could be used with the else statement.&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;The classes that represent our statements:&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;abstract&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Statement&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Skip : Statement&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Seq : Statement&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Seq(Statement s1, Statement s2)&lt;/PRE&gt;&lt;PRE&gt;        {&lt;/PRE&gt;&lt;PRE class=alt&gt;            S1 = s1;&lt;/PRE&gt;&lt;PRE&gt;            S2 = s2;&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Statement S1 { get; set; }&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Statement S2 { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Assign : Statement&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Assign(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; variable, Expression expression)&lt;/PRE&gt;&lt;PRE&gt;        {&lt;/PRE&gt;&lt;PRE class=alt&gt;            Variable = variable;&lt;/PRE&gt;&lt;PRE&gt;            Expression = expression;&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; Variable { get; set; }&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Expression { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; If : Statement&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; If(Expression condition, Statement @then)&lt;/PRE&gt;&lt;PRE&gt;            : &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;(condition, @then, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Skip())&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; If(Expression condition, Statement @then, Statement @&lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            Condition = condition;&lt;/PRE&gt;&lt;PRE class=alt&gt;            Then = @then;&lt;/PRE&gt;&lt;PRE&gt;            Else = @&lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Condition { get; set; }&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Statement Then { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Statement Else { get; set; }&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; While : Statement&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; While(Expression condition, Statement body)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            Condition = condition;&lt;/PRE&gt;&lt;PRE class=alt&gt;            Body = body;&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Expression Condition { get; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Statement Body { get; set; }&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;After we defined our language, we can just use it to construct our program, or use a help of a scanner/parser. What we care here is just to translate both expressions and statements nodes.&lt;/P&gt;
&lt;P&gt;The way we are going to access our variables is through a heap. Our heap is a function that takes a variable name as a string and returns an integer (I assume we deal only with integer types)&lt;/P&gt;
&lt;P align=center&gt;heap := var =&amp;gt; int&lt;/P&gt;
&lt;P&gt;We will translate an expression into a function that takes a heap (heap function) and returns an integer value. For example, the addition expression will use the heap to return the result of the sum.&lt;/P&gt;
&lt;P align=center&gt;expression := heap =&amp;gt; int&lt;/P&gt;
&lt;P&gt;Statement will get translated into a function that takes a heap and returns another heap. For example, the assignment statements, will take the current heap and return a new heap that contains the new variable.&lt;/P&gt;
&lt;P align=center&gt;statement := heap =&amp;gt; heap&lt;/P&gt;
&lt;P align=left&gt;The HeapFunc is declared as a delegate:&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;delegate&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; HeapFunc(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; variable);&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;The code for expression translation is simple and straight forward:&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=rem&gt;// returns a function that takes a heap and returns an integer&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;        Func&amp;lt;HeapFunc, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt;&amp;gt; TranslateExpression(Expression e)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArgumentNullException(&lt;SPAN class=str&gt;"Expression cannot be null"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Int)&lt;/PRE&gt;&lt;PRE&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// whatever the heap is, return the value&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h =&amp;gt; ((Int)e).Value);&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Variable)&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// use the heap to lookup the variable name&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h =&amp;gt; h(((Variable)e).Name));&lt;/PRE&gt;&lt;PRE&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Plus)&lt;/PRE&gt;&lt;PRE&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the left expression into a function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var f1 = TranslateExpression(((Plus)e).Left);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the right exression into a function&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var f2 = TranslateExpression(((Plus)e).Right);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// run the functions on the given heap to get integers and sum them&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h =&amp;gt; f1(h) + f2(h));&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (e &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Multiply)&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// similar to the plus expression&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                var f1 = TranslateExpression(((Multiply)e).Left);&lt;/PRE&gt;&lt;PRE&gt;                var f2 = TranslateExpression(((Multiply)e).Right);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h =&amp;gt; f1(h) * f2(h));&lt;/PRE&gt;&lt;PRE&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; NotSupportedException(&lt;SPAN class=str&gt;"Not supported expression."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;The code for statement translation is shown next:&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=rem&gt;// returns a function that takes a heap and returns a heap.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;        Func&amp;lt;HeapFunc, HeapFunc&amp;gt; TranslateStatement(Statement s)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (s == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ArgumentNullException(&lt;SPAN class=str&gt;"Expression cannot be null"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (s &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Skip)&lt;/PRE&gt;&lt;PRE&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// just return the same heap&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h =&amp;gt; h);&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (s &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Assign)&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                Assign assign = (Assign)s;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the expression&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var f = TranslateExpression(assign.Expression);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// the resulted heap will check if the variable is the one responsible for&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// if so return the result of the expression, else use the previous heap to look up.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h) =&amp;gt; (var =&amp;gt; var == assign.Variable ? f(h) : h(var));&lt;/PRE&gt;&lt;PRE&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (s &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Seq)&lt;/PRE&gt;&lt;PRE&gt;            {&lt;/PRE&gt;&lt;PRE class=alt&gt;                Seq seq = (Seq)s;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// translate the first statement&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                var f1 = TranslateStatement(seq.S1);&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// translate the second statement&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                var f2 = TranslateStatement(seq.S2);&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// apply the first translation on the heap, which will return a new heap&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// that will be applied to the second translation.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h) =&amp;gt; f2(f1(h));&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (s &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; If)&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                If @&lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; = (If)s;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the condition expression&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var fcond = TranslateExpression(@&lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;.Condition);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the then statement&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var fthen = TranslateStatement(@&lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;.Then);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the else statement&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var felse = TranslateStatement(@&lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;.Else);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// apply the heap to the condition function. If the value is not zero, use&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=rem&gt;// the heap returned by applying fthen, otherwise use the heap returned by &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// applying felse.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h) =&amp;gt; (fcond(h) != 0 ? fthen(h) : felse(h));&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (s &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; While)&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                While @&lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; = (While)s;&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the condition expression&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var fcond = TranslateExpression(@&lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt;.Condition);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// translate the body statement&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                var fbody = TranslateStatement(@&lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt;.Body);&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=rem&gt;// apply the body multiple times then return the final heap.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (h) =&amp;gt; {&lt;/PRE&gt;&lt;PRE class=alt&gt;                    &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; (fcond(h) != 0)&lt;/PRE&gt;&lt;PRE&gt;                    {&lt;/PRE&gt;&lt;PRE class=alt&gt;                        h = fbody(h);&lt;/PRE&gt;&lt;PRE&gt;                    }&lt;/PRE&gt;&lt;PRE class=alt&gt;                    &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; h;&lt;/PRE&gt;&lt;PRE&gt;                };&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; NotSupportedException(&lt;SPAN class=str&gt;"Statement not supported."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;            }&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;STRONG&gt;Sample:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;I wrote a simple example to show how we can translate a simple program into a functional code. My example returns the sum of numbers between 0 and 10.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=rem&gt;// this is our initial heap. our heap is empty, so calling this function &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=rem&gt;// sould just fail because we have no variable&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; InitialHeapFun(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; variable)&lt;/PRE&gt;&lt;PRE&gt;        {&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Exception(&lt;SPAN class=str&gt;"cannot find variable '"&lt;/SPAN&gt; + variable + &lt;SPAN class=str&gt;"'"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Run()&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=rem&gt;// sum := 0&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=rem&gt;// i := 10&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=rem&gt;// while (i)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=rem&gt;//  sum := sum + i&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=rem&gt;//  i := i - 1&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=rem&gt;// end&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;            Statement myProgram = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Seq(&lt;/PRE&gt;&lt;PRE class=alt&gt;                &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Assign(&lt;SPAN class=str&gt;"sum"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Int(0)),&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Seq(&lt;/PRE&gt;&lt;PRE class=alt&gt;                    &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Assign(&lt;SPAN class=str&gt;"i"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Int(10)),&lt;/PRE&gt;&lt;PRE&gt;                    &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; While(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Variable(&lt;SPAN class=str&gt;"i"&lt;/SPAN&gt;),&lt;/PRE&gt;&lt;PRE class=alt&gt;                        &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Seq(&lt;/PRE&gt;&lt;PRE&gt;                            &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Assign(&lt;SPAN class=str&gt;"sum"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Plus(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Variable(&lt;SPAN class=str&gt;"sum"&lt;/SPAN&gt;), &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Variable(&lt;SPAN class=str&gt;"i"&lt;/SPAN&gt;))),&lt;/PRE&gt;&lt;PRE class=alt&gt;                            &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Assign(&lt;SPAN class=str&gt;"i"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Plus(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Variable(&lt;SPAN class=str&gt;"i"&lt;/SPAN&gt;), &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Int(-1)))&lt;/PRE&gt;&lt;PRE&gt;                        )&lt;/PRE&gt;&lt;PRE class=alt&gt;                    )&lt;/PRE&gt;&lt;PRE&gt;                )&lt;/PRE&gt;&lt;PRE class=alt&gt;            );&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=rem&gt;// translate the program into (heap=&amp;gt;heap)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;            var f = TranslateStatement(myProgram);&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=rem&gt;// run the program using our initial heap&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;            var heap = f(InitialHeapFun);&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=rem&gt;// print the sum value. this outputs 55&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;            Console.WriteLine(heap(&lt;SPAN class=str&gt;"sum"&lt;/SPAN&gt;));&lt;/PRE&gt;&lt;PRE&gt;        }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;There are a lot of other cool examples that would benefit from this method of translation. For example, we could translate an XML file that contains different actions. The result function will run much faster using just function calls. You can think of it as an XML compiler. &lt;/P&gt;
&lt;P&gt;The code is attached for your convenience.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9387883" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/haniatassi/attachment/9387883.ashx" length="8593" type="text/plain" /><category domain="http://blogs.msdn.com/haniatassi/archive/tags/expression/default.aspx">expression</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Xml/default.aspx">Xml</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Statement/default.aspx">Statement</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Functional+programming/default.aspx">Functional programming</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Translation/default.aspx">Translation</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Compiler/default.aspx">Compiler</category></item><item><title>Silverlight debugging in Windows Azure</title><link>http://blogs.msdn.com/haniatassi/archive/2009/01/16/silverlight-debugging-in-windows-azure.aspx</link><pubDate>Fri, 16 Jan 2009 20:27:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9329610</guid><dc:creator>hania</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/haniatassi/comments/9329610.aspx</comments><wfw:commentRss>http://blogs.msdn.com/haniatassi/commentrss.aspx?PostID=9329610</wfw:commentRss><description>&lt;p&gt;To debug silverlight applications and controls in Windows Azure, you need to have the following components installed:&lt;/p&gt;  &lt;p&gt;1- SilverLight 2 and &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=C22D6A7B-546F-4407-8EF6-D60C8EE221ED&amp;amp;displaylang=en" target="_blank"&gt;SilverLight tools for Visual Studio&lt;/a&gt; (Most likely you already have these since you are developing Silverlight in Visual Studio.&lt;/p&gt;  &lt;p&gt;2- January 2008 CTP of both the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80e3eabf-0507-4560-aeb6-d31e9a70a0a6" target="_blank"&gt;Azure SDK&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8e90b639-1ef0-4e21-bb73-fc22662911bc " target="_blank"&gt;Visual Studio Tools&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;To enable Silverlight debugging, go to the web role’s properties and then to the Web page. Make sure you enable Silverlight in the debuggers section at the bottom of the page.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/SilverlightdebugginginWindowsAzure_84E5/Silverlight_debugging_4.jpg"&gt;&lt;img title="Silverlight_debugging" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="344" alt="Silverlight_debugging" src="http://blogs.msdn.com/blogfiles/haniatassi/WindowsLiveWriter/SilverlightdebugginginWindowsAzure_84E5/Silverlight_debugging_thumb_1.jpg" width="686" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;If Silverlight debugging is enabled you cannot debug any script in the page. To debug your script, you need to disable Silverlight debugging as you cannot debug both at the same time.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9329610" width="1" height="1"&gt;</description></item><item><title>Generating the Lambda Expression dynamically</title><link>http://blogs.msdn.com/haniatassi/archive/2008/10/28/generating-the-lambda-expression-dynamically.aspx</link><pubDate>Wed, 29 Oct 2008 01:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9021119</guid><dc:creator>hania</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/haniatassi/comments/9021119.aspx</comments><wfw:commentRss>http://blogs.msdn.com/haniatassi/commentrss.aspx?PostID=9021119</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The last post, I showed a simple way to build a lexicon scanner in .NET. We can now extend on the scanner and build a parser that generates a Lambda expression that can be compiled and called for further use. The parser I used is just a top-down recursive parser that builds up the Expression tree. The main method is &lt;I style="mso-bidi-font-style: normal"&gt;BodyExpression&lt;/I&gt; that returns the Expression object.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The class &lt;I style="mso-bidi-font-style: normal"&gt;LambdaCalc&lt;/I&gt;, holds all the logic. You can pass a string that will get parsed into a lambda expression. For example:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT size=3&gt;&lt;SPAN style="BACKGROUND: white; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;LambdaCalc&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt; lc = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;LambdaCalc&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"(a, b) =&amp;gt; -a + 2 * b"&lt;/SPAN&gt;);&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT size=3&gt;&lt;SPAN style="BACKGROUND: white; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;Console&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;.WriteLine(lc.Function(1, 2));&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT face=Calibri size=3&gt;Function is a property of a delegate type declared as:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT size=3&gt;&lt;SPAN style="BACKGROUND: white; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;public&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt; &lt;SPAN style="COLOR: blue"&gt;delegate&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;double&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;params&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;double&lt;/SPAN&gt;[] args);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT face=Calibri size=3&gt;So, the way we pass arguments to our lambda calculator is through an array of doubles. Internally, in the generated lambda expression, all parameter references are converted into array references. The previous example would generate the following lambda expression:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;FONT size=3&gt;args =&amp;gt; (-args[0] + (2 * args[1]))&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT face=Calibri size=3&gt;To generate a Lambda Expression, you need to use one of the Lambda static methods inside the Expression class. Using the generic version, allows us to strongly define the delegate that the lambda expression will map to. &lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;For our case, this is how I generated the Lambda expression:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT size=3&gt;&lt;SPAN style="BACKGROUND: white; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;Expression&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;gt; lambdaExpr = &lt;SPAN style="COLOR: #2b91af"&gt;Expression&lt;/SPAN&gt;.Lambda&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;Func&lt;/SPAN&gt;&amp;gt;(body, &lt;SPAN style="COLOR: blue"&gt;this&lt;/SPAN&gt;.funcParamsArg);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="BACKGROUND: white; FONT-FAMILY: 'Courier New'; mso-highlight: white; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT face=Calibri size=3&gt;&lt;EM&gt;body&lt;/EM&gt;: is an expression that got parsed using our &lt;I style="mso-bidi-font-style: normal"&gt;BodyExpression&lt;/I&gt; method.&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT face=Calibri size=3&gt;&lt;EM&gt;funcParamsArg&lt;/EM&gt;: is of type &lt;I style="mso-bidi-font-style: normal"&gt;ParameterExpression&lt;/I&gt; and it’s the argument that will get used by the lambda expression.&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;FONT face=Calibri size=3&gt;The &lt;I style="mso-bidi-font-style: normal"&gt;BodyExpression&lt;/I&gt; method eventually calls also other methods inside the Linq Expression class, for example, we use Expression.Add(leftExpr, rightExpr), to generate the additive expression, and the same goes for multiplication and so on.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT face=Calibri size=3&gt;The thing that worth mentioning is that in order to use the argument from inside the body, you need to use the same ParameterExpression object, otherwise you would get the following exception when compiling your Lambda Expression:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;FONT size=3&gt;System.InvalidOperationException: Lambda Parameter not in scope&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;I attached the code bellow for the parser. You need the code from LambdaCalcScanner for this to work.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9021119" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/haniatassi/attachment/9021119.ashx" length="8412" type="text/plain" /><category domain="http://blogs.msdn.com/haniatassi/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Lambda+Expression/default.aspx">Lambda Expression</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Parser/default.aspx">Parser</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Linq/default.aspx">Linq</category></item><item><title>Writing a simple lexicon scanner in .NET</title><link>http://blogs.msdn.com/haniatassi/archive/2008/10/23/Writing-a-simple-scanner-in-.NET.aspx</link><pubDate>Fri, 24 Oct 2008 08:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9014188</guid><dc:creator>hania</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/haniatassi/comments/9014188.aspx</comments><wfw:commentRss>http://blogs.msdn.com/haniatassi/commentrss.aspx?PostID=9014188</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;I came across Linq and the new Lambda Expression classes in .NET 3.0. I thought, it would be a good idea to dynamically build a lambda expression from a math string, something like: (a + b) * 1.5. The string is parsed into a lambda expression and then is compiled into a delegate. Then, if you well, you can call the delegate to get the result of the formula. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;So, in other words, we are building a scanner and a parser. The first part that I will talk about here is building a scanner using the Regex class in .NET.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The tokens that we need to scan for are defined next:&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=rem&gt;// Tokens that represent the input&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;internal&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;enum&lt;/SPAN&gt; Token&lt;/PRE&gt;&lt;PRE class=alt&gt;{&lt;/PRE&gt;&lt;PRE&gt;    OpenParan, CloseParan,&lt;/PRE&gt;&lt;PRE class=alt&gt;    Arrow,&lt;/PRE&gt;&lt;PRE&gt;    Comma,&lt;/PRE&gt;&lt;PRE class=alt&gt;    Plus, Minus, Multiply, Divide,&lt;/PRE&gt;&lt;PRE&gt;    Constant,&lt;/PRE&gt;&lt;PRE class=alt&gt;    Variable,&lt;/PRE&gt;&lt;PRE&gt;    Other       &lt;SPAN class=rem&gt;// Represents unrecognized charachters&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;HR&gt;

&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The regular expression pattern then is defined next:&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=rem&gt;// The pattern used with the regular expression class to scan the input&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;const&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; Pattern = &lt;SPAN class=str&gt;@"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;        (?'OpenParan' \( ) | (?'CloseParan' \) ) |&lt;/PRE&gt;&lt;PRE&gt;        (?'Arrow' =&amp;gt; ) |&lt;/PRE&gt;&lt;PRE class=alt&gt;        (?'Comma' ,  ) |&lt;/PRE&gt;&lt;PRE&gt;        (?'Plus' \+ ) | (?'Minus' - ) | (?'Multiply' \* ) | (?'Divide' / ) |&lt;/PRE&gt;&lt;PRE class=alt&gt;        (?'Constant' (\.\d+|\d+(\.\d+)?) ) |&lt;/PRE&gt;&lt;PRE&gt;        (?'Variable' [a-zA-Z]\w* ) |&lt;/PRE&gt;&lt;PRE class=alt&gt;        (?'Other' [^ \r\n\t])";&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=rem&gt;// Regular expression used to scan the input&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; Regex MathRegex = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Regex(Pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | &lt;BR&gt;RegexOptions.Singleline | RegexOptions.Compiled);&lt;/PRE&gt;&lt;/DIV&gt;
&lt;HR&gt;

&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The pattern basically tries to find any of the groups and name each group by the given name. We also assign the group ‘Other’ to anything else that we couldn’t match.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The scanner then can be implemented as an enumerable method that returns the found tokens.&amp;nbsp;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=rem&gt;// Enumurable to get tokens from the given expression (scanner)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;TokenEntity&amp;gt; GetLambdaCalcTokens(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; exp)&lt;/PRE&gt;&lt;PRE class=alt&gt;{&lt;/PRE&gt;&lt;PRE&gt;    Token[] tokens = Enum.GetValues(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(Token)).OfType&amp;lt;Token&amp;gt;().ToArray();&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (Match m &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; MathRegex.Matches(exp))&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=rem&gt;// Check which token is matched by this match object&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (Token token &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; tokens)&lt;/PRE&gt;&lt;PRE class=alt&gt;        {&lt;/PRE&gt;&lt;PRE&gt;            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (m.Groups[token.ToString()].Success)&lt;/PRE&gt;&lt;PRE class=alt&gt;            {&lt;/PRE&gt;&lt;PRE&gt;                &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; TokenEntity(&lt;/PRE&gt;&lt;PRE class=alt&gt;                    token,&lt;/PRE&gt;&lt;PRE&gt;                    m.Index,&lt;/PRE&gt;&lt;PRE class=alt&gt;                    m.Value);&lt;/PRE&gt;&lt;PRE&gt;            }&lt;/PRE&gt;&lt;PRE class=alt&gt;        }&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// return the end string token, to indecate we are done&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;yield&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; TokenEntity(Token.Other, exp.Length, &lt;SPAN class=str&gt;"\0"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;HR&gt;

&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The only problem with using enumerable is that it doesn’t allow us to peek forward without moving next. This could be a problem with complex parsers, but the parser that I am writing here is simple enough that can be written without this feature.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The previous method is written as an extension on the string, so it can be easily called on any string like “(a) =&amp;gt; a + 1.5”.GetLambdaCalcTokens()&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The class TokenEntity is defined as:&lt;/FONT&gt;&lt;/P&gt;
&lt;HR&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=rem&gt;// Holds token info&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;internal&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; TokenEntity&lt;/PRE&gt;&lt;PRE class=alt&gt;{&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; TokenEntity(Token token, &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; startPos, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Token = token;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.StartPos = startPos;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Value = &lt;SPAN class=kwrd&gt;value&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// Token type&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Token Token { get; &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=rem&gt;// Start position in the original string&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; StartPos { get; &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set; }&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// Value&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; Value { get; &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; set; }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ToString()&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.Format(&lt;SPAN class=str&gt;"{0} at {1}: {2}"&lt;/SPAN&gt;, Token, StartPos, Value);&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;HR&gt;

&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Running the previous code on: "(a, b) =&amp;gt; ; a + b * 0.1" , results with the following tokens:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;OpenParan at 0: (&lt;BR&gt;Variable at 1: a&lt;BR&gt;Comma at 2: ,&lt;BR&gt;Variable at 4: b&lt;BR&gt;CloseParan at 5: )&lt;BR&gt;Arrow at 7: =&amp;gt;&lt;BR&gt;Other at 10: ;&lt;BR&gt;Variable at 12: a&lt;BR&gt;Plus at 14: +&lt;BR&gt;Variable at 16: b&lt;BR&gt;Multiply at 18: *&lt;BR&gt;Constant at 20: 0.1&lt;BR&gt;Other&amp;nbsp;at 21:&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;I am attaching the source code for the simple scanner. I will follow next with the parser and how we can build lambda expression dynamically.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9014188" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/haniatassi/attachment/9014188.ashx" length="3275" type="text/plain" /><category domain="http://blogs.msdn.com/haniatassi/archive/tags/lampda/default.aspx">lampda</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/expression/default.aspx">expression</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/Regex/default.aspx">Regex</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/scanner/default.aspx">scanner</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/haniatassi/archive/tags/lexicon/default.aspx">lexicon</category></item></channel></rss>