<?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>Eric White's Blog</title><link>http://blogs.msdn.com/b/ericwhite/</link><description /><dc:language>en</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>Leaving Microsoft, Blog Moving to EricWhite.com</title><link>http://blogs.msdn.com/b/ericwhite/archive/2011/01/19/leaving-microsoft-blog-moving-to-ericwhite-com.aspx</link><pubDate>Wed, 19 Jan 2011 16:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10117694</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2011/01/19/leaving-microsoft-blog-moving-to-ericwhite-com.aspx#comments</comments><description>&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Due to personal obligations (moving away from Seattle) it is with sadness that I&amp;rsquo;m announcing that I&amp;rsquo;m leaving Microsoft.&amp;nbsp; My last day at Microsoft will be January 21.&amp;nbsp; This will be the last post on this blog.&amp;nbsp; I will be commencing to blog at &lt;a class="eric-link" href="http://EricWhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;.&amp;nbsp; Here is what I'm planning for the near future on my new blog:&lt;/p&gt;
&lt;ul&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;span style="float: right; width: 30%; margin: 0 8px 6px 8px; border: 1px black solid; padding: 8px 5px 15px 8px; text-align: center;"&gt;This blog is inactive.&lt;br /&gt;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="text-align: center; border: thin black solid; background-color: #eee; padding: 6px 8px 6px 8px; border-radius: 4px; margin-top: 1px;"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;Blog TOC&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;I want to explore some simple and powerful ways to build parameterized server-side document generation systems.&amp;nbsp; I&amp;rsquo;m envisioning a blog post series that will be fun to write.&amp;nbsp; The code that I&amp;rsquo;ll be releasing on my blog will be under a license similar to code published on my MSDN blog.&amp;nbsp; You can alter the code if necessary, and embed it in your projects as you wish.&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;I plan to explore the SharePoint server object model in detail, writing lots of code samples, as a way of filling in gaps in my knowledge.&amp;nbsp; I&amp;rsquo;ll be blogging those snippets.&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;I will be completing the blog post series on &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/06/29/writing-a-recursive-descent-parser-using-c-and-linq.aspx"&gt;writing a recursive descent parser for SpreadsheetML formulas&lt;/a&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;While the blog map that I maintain on this blog will be frozen, I&amp;rsquo;ll maintain a &lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;new blog map on ericwhite.com&lt;/a&gt; that encompasses content on this blog as well as my new blog.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;I want to say thanks to all the folks with whom I&amp;rsquo;ve worked.&amp;nbsp; Microsoft is filled with brilliant, hardworking people, and it is an honor to have worked with you.&amp;nbsp; While here, I have had the chance to work on some of the coolest technology in the world: LINQ to XML, Open XML, Office, and SharePoint.&amp;nbsp; You guys rock!&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Over the years, I have regularly talked with many of you (both inside and outside of Microsoft) about Open XML &amp;ndash; explaining markup and suggesting approaches to the design of solutions.&amp;nbsp; I really enjoy sharing what I&amp;rsquo;ve learned, so please continue to contact me with questions via email, or if you want to chat by phone, I&amp;rsquo;m happy to do so by appointment.&amp;nbsp; I also enjoy discussing Office or SharePoint development.&amp;nbsp; Contact me at eric at ericwhite.com.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Connect with me on &lt;a class="eric-link" href="http://www.linkedin.com/in/ericwhitedev"&gt;LinkedIn&lt;/a&gt;, or &lt;a class="eric-link" href="http://twitter.com/ericwhitedev"&gt;follow me on twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a class="eric-link" title="Eric White, software developer" href="http://www.linkedin.com/in/ericwhitedev" target="Eric White on LinkedIn"&gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_viewmy_160x33.gif" alt="Eric White, software developer" width="160" height="33" border="0" /&gt;&lt;/a&gt; &lt;a class="eric-link" href="http://twitter.com/ericwhitedev"&gt;&lt;img class="alignnone size-full wp-image-12" title="FollowMe" src="http://ericwhite.com/blog/wp-content/uploads/2011/01/FollowMe.png" alt="" width="152" height="41" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10117694" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/LINQ/">LINQ</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category></item><item><title>Using the OData Rest API for CRUD Operations on a SharePoint List</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/17/using-the-odata-rest-api-for-crud-operations-on-a-sharepoint-list.aspx</link><pubDate>Fri, 17 Dec 2010 21:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10106655</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/17/using-the-odata-rest-api-for-crud-operations-on-a-sharepoint-list.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;SharePoint 2010 exposes list data via OData.&amp;nbsp; This post contains four super-small code snippets that show how to Create, Read, Update, and Delete items in a SharePoint list using the OData Rest API.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;This post is one in a series on using the OData REST API to access SharePoint 2010 list data.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="color: black; font-family: Calibri; font-size: medium;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/Getting-Started-using-the-OData-REST-API-to-Query-a-SharePoint-List.aspx" class="eric-link"&gt;Getting Started using the OData REST API to Query a SharePoint List&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="color: black; font-family: Calibri; font-size: medium;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/17/Using-the-OData-Rest-API-for-CRUD-Operations-on-a-SharePoint-List.aspx" class="eric-link"&gt;Using the OData Rest API for CRUD Operations on a SharePoint List&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;These snippets work as written with the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=751fa0d1-356c-4002-9c60-d539896c66ce&amp;amp;displaylang=en" class="eric-link"&gt;2010 Information Worker Demonstration and Evaluation Virtual Machine&lt;/a&gt;.&amp;nbsp; That VM is a great way to try out SharePoint 2010 development.&amp;nbsp; Also see &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/13/how-to-install-and-activate-the-iw-demo-evaluation-hyper-v-machine.aspx" class="eric-link"&gt;How to Install and Activate the IW Demo/Evaluation Hyper-V Machine&lt;/a&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;See the first post in this series, &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/getting-started-using-the-odata-rest-api-to-query-a-sharepoint-list.aspx" class="eric-link"&gt;Getting Started using the OData REST API to Query a SharePoint List&lt;/a&gt;, for detailed instructions on how to build an application that uses OData to query a list.&amp;nbsp; These snippets use the list that I describe how to build in that post.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Query a List&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Gears.Data;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// query&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt; dc =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"http://intranet/_vti_bin/listdata.svc"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.Credentials = &lt;span style="color: #2b91af;"&gt;CredentialCache&lt;/span&gt;.DefaultNetworkCredentials;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; result = &lt;span style="color: blue;"&gt;from&lt;/span&gt; d &lt;span style="color: blue;"&gt;in&lt;/span&gt; dc.Inventory&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;select&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title = d.Title,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description = d.Description,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cost = d.Cost,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; d &lt;span style="color: blue;"&gt;in&lt;/span&gt; result)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Create an Item&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Gears.Data;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// create item&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt; dc =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"http://intranet/_vti_bin/listdata.svc"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.Credentials = &lt;span style="color: #2b91af;"&gt;CredentialCache&lt;/span&gt;.DefaultNetworkCredentials;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InventoryItem&lt;/span&gt; newItem = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InventoryItem&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newItem.Title = &lt;span style="color: #a31515;"&gt;"Boat"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newItem.Description = &lt;span style="color: #a31515;"&gt;"Little Yellow Boat"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newItem.Cost = 300;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;dc.AddToInventory(newItem);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.SaveChanges();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Update an Item&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Gears.Data;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// update item&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt; dc =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"http://intranet/_vti_bin/listdata.svc"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.Credentials = &lt;span style="color: #2b91af;"&gt;CredentialCache&lt;/span&gt;.DefaultNetworkCredentials;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InventoryItem&lt;/span&gt; item = dc.Inventory&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(i =&amp;gt; i.Title == &lt;span style="color: #a31515;"&gt;"Car"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .FirstOrDefault();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Title = &lt;span style="color: #a31515;"&gt;"Car"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Description = &lt;span style="color: #a31515;"&gt;"Super Fast Car"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Cost = 500;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;dc.UpdateObject(item);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.SaveChanges();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Delete an Item&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Gears.Data;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// delete item&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt; dc =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"http://intranet/_vti_bin/listdata.svc"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.Credentials = &lt;span style="color: #2b91af;"&gt;CredentialCache&lt;/span&gt;.DefaultNetworkCredentials;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;InventoryItem&lt;/span&gt; item = dc.Inventory&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(i =&amp;gt; i.Title == &lt;span style="color: #a31515;"&gt;"Car"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .FirstOrDefault();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;dc.DeleteObject(item);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.SaveChanges();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10106655" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OData/">OData</category></item><item><title>Comparing Excel Automation to Excel Services</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx</link><pubDate>Thu, 16 Dec 2010 22:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10106211</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;In a previous post, I &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;compared and contrasted Word Automation to Word Automation Services&lt;/a&gt;.&amp;nbsp; There is a similar contrast between Excel Automation and Excel Services, although there is less overlap in functionality when compared to the two approaches for Word.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx" class="eric-link"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx" class="eric-link"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx" class="eric-link"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx" class="eric-link"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx" class="eric-link"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Excel Automation&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Excel Automation is a technology where you can write a .NET application that uses the Excel client executable to accomplish some task such as creating a spreadsheet, querying a spreadsheet for content, or modifying the content of a spreadsheet.&amp;nbsp; Its roots are COM &amp;ndash; in addition to using .NET to link to the Primary Interop Assemblies, you can use C++ or VB6 (or any other technology that can consume COM) to automate the Excel client application.&amp;nbsp; In other words, you write a program that runs Excel.&amp;nbsp; There is a rich object model that you can use to manipulate workbook, worksheets, ranges, cells, comments, etc.&amp;nbsp; This technology has been around for years.&amp;nbsp; If you are an experienced Excel developer, then you have probably used Excel Automation at one time or another.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The user operates a .NET managed application that in turn runs the Excel 2007 or Excel 2010 client.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/7633.Img1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;To make this completely clear, the following small console application starts Excel, creates a workbook and worksheet, sets the value of a cell, saves it, and then causes the Excel application to quit.&amp;nbsp; You need to add a reference to the Excel 2010 PIA.&amp;nbsp; You find this on the COM tab.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/3324.Img2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Note that the following sample uses the feature C# 4.0 that allows you to omit arguments that have default values.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Excel = Microsoft.Office.Interop.Excel;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Excel.&lt;span style="color: #2b91af;"&gt;Application&lt;/span&gt; app = &lt;span style="color: blue;"&gt;new&lt;/span&gt; Excel.&lt;span style="color: #2b91af;"&gt;Application&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; app.Visible = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Excel.&lt;span style="color: #2b91af;"&gt;Workbook&lt;/span&gt; workbook = app.Workbooks.Add();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Excel.&lt;span style="color: #2b91af;"&gt;Worksheet&lt;/span&gt; sheet = workbook.ActiveSheet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sheet.Cells[1, 1] = &lt;span style="color: #a31515;"&gt;"Hello World!"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; workbook.SaveAs(&lt;span style="color: #a31515;"&gt;@"E:\Temp\Test.xlsx"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Microsoft.Office.Interop.Excel.&lt;span style="color: #2b91af;"&gt;_Application&lt;/span&gt;)app).Quit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;This scenario, where you are programmatically generating spreadsheets, is where you should be using the Open XML SDK instead of Excel automation.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;However, there are scenarios where we recommend that instead of using the Open XML SDK, you should automate Excel in some fashion.&amp;nbsp; If you are altering or modifying the workbook (other than simple setting of cell values), then you should automate Excel.&amp;nbsp; Altering spreadsheets using the Open XML SDK is involved.&amp;nbsp; Inserting a row or column using the Open XML SDK would involve parsing formulas and modifying the parsed formulas, a fairly involved operation.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;In addition, just as with Word, many customers find it is advantageous to integrate Excel into their application, or to extend Excel to augment their applications functionality.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Excel Services&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Excel Services is a service application that enables you to load, calculate, and display Microsoft Excel workbooks on Microsoft SharePoint Server 2010. Excel Services was first introduced in Microsoft Office SharePoint Server 2007.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;By using Excel Services, you can reuse and share Excel workbooks on SharePoint Server 2010 portals and dashboards. For example, financial analysts, business planners, or engineers can create content in Excel and share it with others by using a SharePoint Server 2010 portal and dashboard&amp;mdash;without writing custom code. You can control what data is displayed, and you can maintain a single version of your Excel workbook.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You cannot use Excel Services to create new workbooks or to edit existing workbooks. To author a workbook for use with Excel Services, you can use the Open XML SDK, Microsoft Office Excel 2007, or Microsoft Excel 2010.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;There are four primary interfaces for Excel Services:&lt;/p&gt;
&lt;ul&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;An Excel Web Access Web Part, which enables you to view and interact with a live workbook by using a browser&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;Excel Web Services for programmatic access&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;An ECMAScript (JavaScript, JScript) object model for automating and customizing, and to drive the Excel Web Access control and help build more compelling, integrated solutions&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;A Representational State Transfer (REST) API for accessing workbook parts directly through a URL&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;See the &lt;a href="http://msdn.microsoft.com/en-us/library/ms546696.aspx" class="eric-link"&gt;Excel Services Overview&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;To Summarize&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can use Excel Automation or the Open XML SDK to create workbooks.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can use Excel Automation, the Open XML SDK, or Excel Services to retrieve contents of workbooks.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can use Excel Automation to alter workbooks, with the exception that in some cases you can use the Open XML SDK to set values of cells.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10106211" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office/">Office</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category></item><item><title>Microsoft Word 2010 Developer Building Blocks</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx</link><pubDate>Wed, 15 Dec 2010 20:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10105523</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Extending Microsoft Word 2010 is one of the most effective ways to augment content and enable richer collaboration around documents.&amp;nbsp; There are many ways to extend Microsoft Word 2010 and integrate user-friendly and powerful document editing into your application.&amp;nbsp; Extending Word is the most common way to develop for Microsoft Office.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx" class="eric-link"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx" class="eric-link"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx" class="eric-link"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx" class="eric-link"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx" class="eric-link"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;In this series of posts, I'll be publishing a post on each of the Office client applications, listing the developer building blocks for it.&amp;nbsp; I&amp;nbsp;put the various developer building blocks into one of four categories:&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;User Interface Extensions &amp;ndash; You use these building blocks to create custom ribbons, custom user interfaces, extend content menus, and more.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Canvas Extensions &amp;ndash; Available only in Microsoft Word and Microsoft Excel , canvas extensions are those extensibility points that enable you to add controls to the surface of a document or spreadsheet.&amp;nbsp; You can add controls to the surface of a document to create more interactivity for users.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Programmability Extensions &amp;ndash; In combination with user interface and canvas extensions, you use programmability extensions to build customizations and add-ins.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Supported for Previous Versions &amp;ndash; listed for completeness, instead of using these legacy technologies,&amp;nbsp;Microsoft recommends using newer approaches for programmability using managed add-ins, customizations, and user interface extensions.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;In addition to extending the Word user interface on client computers, developers take advantage of services on servers such as Word Automation Services or WCF services to build distributed applications with rich functionality.&amp;nbsp; Using the Open XML SDK on servers enables you to develop enterprise-quality bulk document generation applications that perform well and are robust.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Developer Center: &lt;a href="http://msdn.microsoft.com/office/word" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Word Developer Center&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Articles: &lt;a href="http://msdn.microsoft.com/en-us/library/ff433639.aspx" class="eric-link"&gt;Word 2010 Technical Articles&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Articles: &lt;a href="http://msdn.microsoft.com/en-us/office/bb330659" class="eric-link"&gt;Word 2007 Technical Articles&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Videos: &lt;a href="http://msdn.microsoft.com/en-us/office/ff606189.aspx" class="eric-link"&gt;Word Visual How Tos&lt;/a&gt;&lt;/p&gt;
&lt;h3 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;User Interface Extensions&lt;/span&gt;&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; padding-top: 0in; border: windowtext 1pt solid;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Building Block&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#ActionPane" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Action Pane&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Extend the user interface by creating a customizable pane for document-level solutions.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#Backstage" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Backstage&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Customize the backstage view enables you to display information about documents to users.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#ContextMenu" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Context Menu&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Customize the context menu to make custom features easy to use.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#CustomTaskPane" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Custom Task Pane&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Extend the user interface by creating a customizable pane for application-level solutions.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#DocumentInformationPanel" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Document Information Panel&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Enable users to enter metadata about a document.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#Ribbon" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Ribbon&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Customize the ribbon to augment the editing experience of the document and make the features of your add-in more discoverable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Canvas Extensions&lt;/span&gt;&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; padding-top: 0in; border: windowtext 1pt solid;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Building Block&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#ContentControls" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Content Controls&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use content controls to give structure to documents.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#UserControls" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;User Controls&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Add Windows Forms or WPF controls to the surface of a document to build interactive documents.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Programmability Extensions&lt;/span&gt;&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; padding-top: 0in; border: windowtext 1pt solid;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Building Block&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#ApplicationLevelAddIns" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Application Level Add-Ins&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Develop a managed add-in that users can use to interact with Word documents.&amp;nbsp; An installed solution can operate on any open document.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#Automation" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Automation&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use automation to build an executable (external to Word) that can control Word, including starting Word, setting and getting ranges of text, saving the document, and more.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#AltChunk" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;AltChunk&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use the altChunk functionality of Open XML to merge content from other Open XML documents, HTML documents, and more into a new document.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#BusinessDataConnectivityObjectModel" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Business Data Connectivity Object Model&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Connect to BCS data through SharePoint.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#CustomXMLParts" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Custom XML Parts&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Embed and associate XML documents in a word-processing document.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#DocumentLevelCustomization" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Document Level Customization&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Develop a managed add-in that users can use to interact with Word documents.&amp;nbsp; The solution is attached to a specific document or template.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#LocalDatabase" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Local Database&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Include a database file, such as a SQL Server Express (.mdf) file or a Microsoft Office Access (.mdb) file, in your Visual Studio Tools for Office solution.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#OpenXmlSdk" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Open XML SDK&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use the Open XML SDK to generate Word documents.&amp;nbsp; In addition to generating documents, the Open XML SDK enables developers to make extensive modifications to a document such as replacing the contents of a paragraph.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#VisualBasicforApplications" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Visual Basic for Applications&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use Visual Basic for Applications (unmanaged code) that is connected to and persisted with a specific document.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Supported for Previous Versions&lt;/span&gt;&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; padding-top: 0in; border: windowtext 1pt solid;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Building Block&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#ActiveXControlsonWordDocument" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;ActiveX Controls on Word Document&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use ActiveX controls on the surface of a document to create interactive documents.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#ActiveXControlsonUserForm" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;ActiveX Controls on User Form&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use ActiveX controls on a user form to build interactive solutions.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#COMExtensions" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;COM Extensions&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use unmanaged code to create a COM based add-in.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#CommandBars" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Command Bars&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Customize command bars to enable users to carry out actions.&amp;nbsp; Instead of using command bars, we recommend extending the ribbon.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="223" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 167.4pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="#SmartDocuments" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Smart Documents&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="402" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 2.1pt; width: 301.5pt; padding-right: 2.1pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Use XML to define custom task pane content that automatically synchronizes help, instructions, and programmable controls with the user's position in the document.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ActionPane" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Action Pane&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;An actions pane is a customizable task pane that is attached to a specific Microsoft Office Word document in a document-level solution. &amp;nbsp;It is hosted inside the Office task pane along with other built-in task panes. &amp;nbsp;This real-estate can be docked to the right, bottom, left, or right of the document or spreadsheet.&amp;nbsp; It can also be a floating window.&amp;nbsp; You can use Windows Forms controls or WPF controls in an action pane.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SDK: &lt;a href="http://msdn.microsoft.com/en-us/library/7we49he1.aspx" class="eric-link"&gt;Actions Pane Overview&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;How Do I: &lt;a href="http://msdn.microsoft.com/en-us/vbasic/cc337991.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Use WPF Controls Inside an Excel Actions Pane?&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa942839.aspx" class="eric-link"&gt;Features Available by Office Application and Project Type&lt;/a&gt;&lt;span class="MsoHyperlink"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ActiveXControlsonWordDocument" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;ActiveX Controls on Word Document&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can add controls to your documents to create interactive documents, such as online forms.&amp;nbsp; Instead of using ActiveX controls, Microsoft recommends using Windows Forms or WPF controls.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb221252(v=office.12).aspx" class="eric-link"&gt;Using ActiveX Controls on Word Documents&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ActiveXControlsonUserForm" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;ActiveX Controls on User Form&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can use ActiveX controls to create user forms.&amp;nbsp; Instead of building user forms using ActiveX, Microsoft recommends building forms using Windows Forms or WPF.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa140269(v=office.10).aspx" class="eric-link"&gt;Effectively Using ActiveX Form Controls in Microsoft Word&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb221183(office.12).aspx" class="eric-link"&gt;OLE Programmatic Identifiers&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="AltChunk" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;AltChunk&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The altChunk functionality of the Open XML file formats enables easy merging of documents.&amp;nbsp; You can merge content from multiple sources (other Open XML documents, HTML, plain text, and more) into a single document.&amp;nbsp; After using the Open XML SDK to set up the document that imports alternative content, if you want to convert the document so that the new content is transformed to typical Open XML WordprocessingML, you need to open and save the document using Word 2010.&amp;nbsp; Alternatively, you can use Word Automation Services to process the document and import the alternative content.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2008/10/27/how-to-use-altchunk-for-document-assembly.aspx" class="eric-link"&gt;How to Use altChunk for Document Assembly&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2009/04/19/comparison-of-altchunk-to-the-documentbuilder-class.aspx" class="eric-link"&gt;Comparison of altChunk to the DocumentBuilder Class&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/03/11/formats-supported-for-altchunk.aspx" class="eric-link"&gt;Formats Supported for altChunk&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/01/22/inserting-content-that-contains-images-using-altchunk.aspx" class="eric-link"&gt;Inserting Content That Contains Images Using altChunk&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ff742315.aspx" class="eric-link"&gt;Developing with SharePoint 2010 Word Automation Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ApplicationLevelAddIns" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Application Level Add-Ins&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;This type of add-in&amp;rsquo;s functionality is available regardless of which document, spreadsheet, or presentation is opened.&amp;nbsp; An example of this variety is a department-wide or corporate-wide application that enables some level of functionality that every employee of the department or corporation needs to access on a regular basis.&amp;nbsp; As an example, &lt;a href="http://www.microsoft.com/showcase/en/us/details/cd7d86ce-d53f-4adc-b3ed-bdced4462522" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Lexis for Microsoft Office&lt;/span&gt;&lt;/a&gt; is an Office customization targeting legal firms.&amp;nbsp; Users need to execute the same code for every document, so it is implemented as an application-level managed add-in.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/d2tx7z6d.aspx" class="eric-link"&gt;Office Development in Visual Studio&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb386298.aspx" class="eric-link"&gt;Architecture of Application-Level Add-Ins&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb157876.aspx" class="eric-link"&gt;Programming Application-Level Add-Ins&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb264456.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Managing Task Panes in Multiple Word and InfoPath Documents&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb608620(VS.100).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Managing Custom Task Panes in Multiple Application Windows&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb608621.aspx" class="eric-link"&gt;Expose an object in an application-level add-in to other Microsoft Office solutions&lt;/a&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SDK: &lt;a href="http://msdn.microsoft.com/en-us/library/ms254954.aspx" class="eric-link"&gt;Microsoft.Office.Interop.Word Namespace&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Automation" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Automation&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Word Automation is a technology where you can write a .NET application that uses the Word client executable to accomplish some task such as creating a document, querying a document for content, or modifying the content of a document.&amp;nbsp; Its roots are COM &amp;ndash; in addition to using .NET to link to the Primary Interop Assemblies, you can use C++ or VB6 (or any other technology that can consume COM) to automate the Word client application.&amp;nbsp; In other words, you write a program that runs Word.&amp;nbsp; There is a rich object model that you can use to manipulate paragraphs, ranges, comments, etc.&amp;nbsp; This technology has been around for years.&amp;nbsp; If you are an experienced Office developer who needed to generate a large number of documents (prior to the introduction of the Open XML SDK), then you have probably used Word Automation at one time or another.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The user operates a .NET managed application that in turn runs the Word 2007 or Word 2010 client.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/4606.Img1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Instead of generating word-processing documents using Word Automation, we recommend using the Open XML SDK together with Word Automation Services.&amp;nbsp; The Open XML SDK and Word Automation Services are &amp;lsquo;server hardened&amp;rsquo;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Backstage" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Backstage&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Clicking the File tab takes you to the customizable Microsoft Office Backstage view. Backstage view helps you discover and use the features that fall outside the authoring features on the Ribbon. Ribbon, Mini toolbar and galleries all help you work &lt;b&gt;&lt;i&gt;&lt;span style="text-decoration: underline;"&gt;in&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; your documents; backstage view helps you work &lt;b&gt;&lt;i&gt;&lt;span style="text-decoration: underline;"&gt;with&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; your documents.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The following screen clipping shows the customizable backstage view.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/2022.Img2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/office/ff808348.aspx" class="eric-link"&gt;Backstage View Developer Center&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ee691833(office.14).aspx" class="eric-link"&gt;Introduction to the Office 2010 Backstage View for Developers&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ff955606.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;What's New for Developers in Office 2010&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ee815851.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Customizing the Office 2010 Backstage View for Developers&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="BusinessDataConnectivityObjectModel" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Business Data Connectivity Object Model&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Business Connectivity Services (BCS) brings line-of-business data into SharePoint 2010.&amp;nbsp; SharePoint 2010 makes this data available to the Office client applications through the Business Data Connectivity Object Model (BDC OM).&amp;nbsp; The following diagram shows how the Office clients (J) access BCS data through the BDC client runtime (K).&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/0815.Img3.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://technet.microsoft.com/en-us/sharepoint/ee518675.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Business Connectivity Services Resource Center&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;TechNet: &lt;a href="http://technet.microsoft.com/en-us/library/ee661740.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Business Connectivity Services overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/ee556385.aspx" class="eric-link"&gt;Understanding Business Connectivity Services Client Cache to Optimize Your Solutions&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/ee559359.aspx" class="eric-link"&gt;When Is the Cache Refreshed?&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog: &lt;a href="http://blogs.msdn.com/b/bcs/archive/2010/02/19/overview-of-bcs-advanced-code-based-solutions.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Overview of BCS Advanced Code-Based Solutions&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="COMExtensions" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;COM Extensions&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can build a Component Object Model (COM) Office add-in using C++, VB6, or other languages that can consume COM libraries.&amp;nbsp; Microsoft does not recommend using COM extensions for new development.&amp;nbsp; Microsoft does not recommend building COM based add-ins using C# or VB.NET.&amp;nbsp; Instead, you should build an application-level add-in or a document-level customization using Visual Studio.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa140480(v=office.10).aspx" class="eric-link"&gt;Creating COM Add-ins in Office Developer&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa165191(v=office.10).aspx" class="eric-link"&gt;Building COM Add-ins for the Visual Basic Editor&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Office Online: &lt;a href="http://office.microsoft.com/en-us/help/enable-or-disable-add-ins-in-office-programs-HA010034127.aspx" class="eric-link"&gt;Enable or disable add-ins in Office programs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="CommandBars" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Command Bars&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The command bars object model exposes objects, collections, properties, and methods that you can use to show, hide, and modify existing command bars and command bar controls, and create new ones. &amp;nbsp;In addition, you can specify a Microsoft&amp;reg; Visual Basic&amp;reg; for Applications (VBA) procedure to run when a user clicks a command bar button or to respond to events triggered by a command bar or command bar control. Instead of using command bars, Microsoft recommends extending the ribbon.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa141022(office.10).aspx" class="eric-link"&gt;Manipulating Command Bars and Command Bar Controls with VBA Code&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;How To &lt;a href="http://support.microsoft.com/kb/303017" class="eric-link"&gt;Use Automation to Create Office Command Bars and Controls with Visual Basic .NET&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ContentControls" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Content Controls&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Content controls are bounded and potentially labeled regions in a document that serve as containers for specific types of content. Using content controls in Word 2007 and Word 2010, you can create document templates with rich, structured blocks of content.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/office/gg278014.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Word Content Controls Resource Center&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;How to: &lt;a href="http://msdn.microsoft.com/en-us/library/bb386200(VS.90).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Add Content Controls to Word Documents&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Walkthrough: &lt;a href="http://msdn.microsoft.com/en-us/library/bb398244(VS.90).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Binding Content Controls to Custom XML Parts&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Video: &lt;a href="http://msdn.microsoft.com/en-us/office/cc315062.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;How Do I: Use Word Content Controls?&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Visual How-To: &lt;a href="http://msdn.microsoft.com/en-us/library/bb510135(office.12).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Mapping Word 2007 Content Controls to Custom XML Using the XMLMapping Object&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ContextMenu" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Context Menu&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Customizing the context menu provides a convenient way for users to access functionality for your application-level add-in or document-level customization.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ee691832.aspx" class="eric-link"&gt;Customizing Context Menus in Office 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="CustomTaskPane" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Custom Task Pane&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Custom task panes consist of screen real-estate that co-exists with the open document or spreadsheet within the Office client.&amp;nbsp; This real-estate can be docked to the right, bottom, left, or right of the document or spreadsheet.&amp;nbsp; It can also be a floating window.&amp;nbsp; You can use Windows Forms controls or WPF controls in an action pane.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa942864.aspx" class="eric-link"&gt;Custom Task Panes Overview&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb608620(VS.100).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Managing Custom Task Panes in Multiple Application Windows&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="CustomXMLParts" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Custom XML Parts&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Custom XML parts enable you to store arbitrary XML of your own design in the package of a document.&amp;nbsp;&amp;nbsp; The most common use for custom XML parts is to associate data in the parts with content controls in the document.&amp;nbsp; However, you can use custom XML parts for any purpose that you like.&amp;nbsp; For example, your managed add-in may need to keep some data for some important functionality.&amp;nbsp; It can keep that data in a custom XML part, so that the data always accompanies the document.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Walkthrough: &lt;a href="http://msdn.microsoft.com/en-us/library/bb398244.aspx" class="eric-link"&gt;Binding Content Controls to Custom XML Parts&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Video How to: &lt;a href="http://msdn.microsoft.com/en-us/library/cc837159(VS.90).aspx" class="eric-link"&gt;Binding Content Controls to Custom XML Parts&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog Post: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2008/10/19/creating-data-bound-content-controls-using-the-open-xml-sdk-and-linq-to-xml.aspx" class="eric-link"&gt;Creating Data-Bound Content Controls using the Open XML SDK and LINQ to XML&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="DocumentLevelCustomization" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Document Level Customization&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Using document-level customizations,.NET managed assemblies (code-signed for security purposes) are attached directly to each document, so if you send the document to a new user, they can open the document and use the custom functionality without explicitly installing an add-in.&amp;nbsp; For example, a tax analysis department needs to systematically analyze documents for their tax implications and then communicate that analysis back to the document author.&amp;nbsp; The result of that analysis is associated with a specific document, so it makes sense to build a document-level customization that manages the process of assessing and optimizing the tax implications of that document.&amp;nbsp; A typical deployment might include an application-level add-in that is used by the tax analysis firm that produces a document that is customized with a document-level customization.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb157892.aspx" class="eric-link"&gt;Developing Document-Level Customizations for Word&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/zcfbd2sk.aspx" class="eric-link"&gt;Architecture of Document-Level Customizations&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/xst4e83b.aspx" class="eric-link"&gt;Cached Data in Document-Level Customizations&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;How Do I: &lt;a href="http://msdn.microsoft.com/en-us/office/cc510253.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Attach or Detach a VSTO Assembly from a Word Document?&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="DocumentInformationPanel" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Document Information Panel&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Often in document management systems, users are asked&amp;mdash;usually at the point when they are saving their documents&amp;mdash;to provide metadata (properties) for their documents. &amp;nbsp;Document information panels enable users to specify all the properties on a document at once, in one place, at any point when they are working with that document.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SDK: &lt;a href="http://msdn.microsoft.com/en-us/library/ms550037.aspx" class="eric-link"&gt;Document Information Panel Overview&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="LocalDatabase" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Local Database&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can include a database file, such as a SQL Server Express (.mdf) file or a Microsoft Office Access (.mdb) file, in your Visual Studio Tools for Office solution. This enables end users to maintain a local database in situations where maintaining a centralized database is not required, for example in a inventory solution where the data is embedded inside the document, and used on a single computer.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/b7c29639.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Using Local Database Files in Office Solutions Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="OpenXmlSdk" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Open XML SDK&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can work directly with the Open XML file formats (DOCX, XLSX, and PPTX files) using the Open XML SDK.&amp;nbsp; When you use the Open XML SDK, you are not directly customizing Microsoft Office, but are instead directly generating or modifying Office documents.&amp;nbsp; The bulk generation of documents using the Open XML SDK is much faster than automating Word.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/office/bb265236" class="eric-link"&gt;Open XML Developer Center&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog: &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2008/10/20/eric-white-s-blog-s-table-of-contents.aspx#Open_XML" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Eric White&amp;rsquo;s Blog&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Blog: &lt;a href="http://blogs.msdn.com/b/brian_jones/archive/2010/04/06/zeyad-rajabi-s-open-xml-sdk-blog-map.aspx" class="eric-link"&gt;Zeyad Rajabi&amp;rsquo;s Open XML SDK Blog Map&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Ribbon" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Ribbon&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The key benefit of customizing the ribbon is that it makes features of your application more discoverable.&amp;nbsp; Users can see tabs that you add to the ribbon.&amp;nbsp; They click on the tab, and then see buttons and other controls that help them understand the capabilities of your Office application.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb386097.aspx" class="eric-link"&gt;Ribbon Overview&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;How to: &lt;a href="http://msdn.microsoft.com/en-us/library/bb608616.aspx" class="eric-link"&gt;Get Started Customizing the Ribbon&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Walkthrough: &lt;a href="http://msdn.microsoft.com/en-us/library/bb386104.aspx" class="eric-link"&gt;Creating a Custom Tab by Using the Ribbon Designer&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Walkthrough: &lt;a href="http://msdn.microsoft.com/en-us/library/aa942955.aspx" class="eric-link"&gt;Creating a Custom Tab by Using Ribbon XML&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SmartDocuments" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Smart Documents&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Developers can create Word or Excel Smart Documents augmented with programmable pieces that help users create or modify them. Reusing boilerplate text, implementing business rules for how a document should be formatted or completed, and routing a document through an approval process are all procedures that Office Smart Documents can simplify.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Instead of using Smart Documents, we recommend building application-level or document-level managed add-ins.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN Magazine: &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc164042.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Create Word and Excel Smart Documents with C++ and XML&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SDK: &lt;a href="http://msdn.microsoft.com/en-us/library/bb190880(v=office.11).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Smart Documents SDK&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SDK: &lt;a href="http://msdn.microsoft.com/en-us/library/aa296022(v=office.11).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Understanding XML Expansion Packs&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Office Online: &lt;a href="http://office.microsoft.com/en-us/word-help/about-smart-documents-HP003091674.aspx" class="eric-link"&gt;About smart documents&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="UserControls" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;User Controls&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can add Windows Forms or WPF controls to the surface of a document, enabling richer interaction in the document for users.&amp;nbsp; You can bind controls to data.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/0x6hstz2.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Windows Forms Controls on Office Documents Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/ms178765.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Limitations of Windows Forms Controls on Office Documents&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/bb157941.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Using Windows Forms Controls on Word Documents&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/ad7sfx3w.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Binding Data to Controls in Office Solutions&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;How to: &lt;a href="http://msdn.microsoft.com/en-us/library/wfk2wb04.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Populate Documents with Data from a Database&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="VisualBasicforApplications" style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;VisualBasicforApplications&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Visual Basic for Applications (VBA) is an implementation of Microsoft's event-driven programming language Visual Basic 6.&amp;nbsp; Most Microsoft Office applications include an integrated editing and debugging environment for VBA.&amp;nbsp; VBA enables developers to build user defined functions and automate processes that access the Word document and customize the user interface.&amp;nbsp; Applications built with the 64-bit version of Office 2010 can reference larger address spaces, and therefore provide the opportunity to use more physical memory than ever, potentially reducing the overhead spent moving data in and out of physical memory.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/library/ee814735(office.14).aspx" class="eric-link"&gt;Getting Started with VBA in Office 2010&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ff604039.aspx" class="eric-link"&gt;Getting Started with VBA in Word 2010&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa141471(office.10).aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Signing a VBA Project&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/kw65a0we.aspx" class="eric-link"&gt;Word Object Model Overview&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Office online:&amp;nbsp; &lt;a href="http://office.microsoft.com/en-us/excel-help/digitally-sign-a-macro-project-HA001231781.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Digitally sign a macro project&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Technical Article: &lt;a href="http://msdn.microsoft.com/en-us/library/ee691831.aspx" class="eric-link"&gt;Compatibility Between the 32-bit and 64-bit Versions of Office 2010&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/library/bb814696.aspx" class="eric-link"&gt;Interoperability between VBA and Visual Studio Tools for the Office System (3.0)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10105523" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office/">Office</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category></item><item><title>How to Install and Activate the IW Demo/Evaluation Hyper-V Machine</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/13/how-to-install-and-activate-the-iw-demo-evaluation-hyper-v-machine.aspx</link><pubDate>Mon, 13 Dec 2010 15:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10104067</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/13/how-to-install-and-activate-the-iw-demo-evaluation-hyper-v-machine.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=751fa0d1-356c-4002-9c60-d539896c66ce&amp;amp;displaylang=en" class="eric-link"&gt;2010 Information Worker Demonstration and Evaluation Virtual Machine&lt;/a&gt; is the easiest way to evaluate SharePoint development.&amp;nbsp;&amp;nbsp;The VM&amp;nbsp;comes complete with an installed, working copy of SharePoint 2010, Visual Studio, Office 2010, and much, much more.&amp;nbsp; The installation instructions mention that you can connect the virtual machine to the internet and activate it for 180 days.&amp;nbsp; However, it had been long ago enough since I last performed this process that I had forgotten a couple of details, and had one of those scratching-my-head experiences, so I&amp;rsquo;m noting the steps to do this.&amp;nbsp; Actually, I had intended to write this info down the last time I forgot how to activate the VM, but I neglected to, and so was doomed to repeat my experience.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;While I am documenting the key points on activating, I&amp;rsquo;m also going to note some of my favorite ways to configure these machines &amp;ndash; my personal preferences.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Enable virtualization technology in the BIOS.&amp;nbsp; Sometimes the setting can be difficult to find &amp;ndash; it was under &lt;b&gt;Security&lt;/b&gt; on one of my desktop machines.&amp;nbsp; On my Lenovo laptop, it is pretty obvious.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;If you don&amp;rsquo;t remember to enable this, while following the IW Demo VM installation instructions, you will receive the error:&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; color: black; font-size: medium;"&gt;&lt;span style="background-color: #c0c0c0;"&gt;&lt;b&gt;An error occurred while attempting to start the selected virtual machine(s).&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&amp;lsquo;2010-7a&amp;rsquo; could not initialize.&lt;br /&gt;&lt;br /&gt;The virtual machine could not be started because the hypervisor is not running.&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;If you have forgotten to enable it, and then receive the error, and then enable it, then remember that you have to &lt;b&gt;physically power-off&lt;/b&gt; the CPU after changing the BIOS settings, not just reboot, otherwise the BIOS setting change isn&amp;rsquo;t in effect.&amp;nbsp; That little tidbit was paid for with an embarrassing amount of time. :)&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For running virtual machines, I prefer to boot to an install of Windows Server 2008 R2 that has as little as possible installed on it.&amp;nbsp; I install the Hyper-V role, and if a laptop, I install the Wireless LAN Service, and that is about all.&amp;nbsp; If the default display drivers work well enough, I don&amp;rsquo;t bother installing specialized display drivers.&amp;nbsp; I actually prefer not to.&amp;nbsp; I would never host IIS on a machine that is hosting Hyper-V VMs.&amp;nbsp; The more memory you preserve in the host operating system, the more memory is available to various configurations of hosted VMs, some of which are tight in 8GB.&amp;nbsp; I would never attempt to run on a machine with less than 8GB.&amp;nbsp; I always make my laptop dual-boot.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;When you initially set-up Hyper-V on the host computer, you are given an option of creating a network adapter for the wired internet port.&amp;nbsp; You need to do this because you will be temporarily connecting the virtual machine to the internet to activate.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Download the various RAR files, expand them, and follow the procedures in the Virtual Machine Setup Guide that accompanies the IW Demo/Eval VM.&amp;nbsp; To try your hand at development, you only need to install and run Virtual Machine &amp;ldquo;A&amp;rdquo;.&amp;nbsp; Once it is running, you can log in, write and compile code, and extend SharePoint in a variety of ways.&amp;nbsp; The instructions include the following note:&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;Activation of the operating system in the virtual machine is OPTIONAL. Please do NOT perform the following steps unless your initial 10 day evaluation period expires.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Because it was said so emphatically, I feel obligated to repeat it.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; At this point, because you have followed the procedures in the VM installation instructions, if you open the Virtual Network Manager in Hyper-V Manager, you will see two networks.&amp;nbsp; You added the internal network while following the VM installation procedures, and the other network is there because you responded positively to including it when installing the Hyper-V role.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img height="371" width="411" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/5444.Img1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While the VM is shut down, open the Settings for the Demo VM.&amp;nbsp; You will see there is only the one network adapter.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img height="356" width="413" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/1781.Img2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Click &lt;b&gt;Add Hardware&lt;/b&gt;, click &lt;b&gt;Network Adapter&lt;/b&gt;, and click &lt;b&gt;Add&lt;/b&gt;.&amp;nbsp; Add a network adapter for the Local Area Connection.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img height="464" width="460" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/3487.Img3.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Because you are adding the network adapter for the wired network (not wireless), even if you have a wireless connection on your laptop, you need to &lt;strong&gt;physically connect the computer to a network&lt;/strong&gt; that has access to the internet.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;7.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Start the VM and let it boot.&amp;nbsp; After logging into the VM, you should be able to browse the internet.&amp;nbsp; You can then activate Windows Server 2008 R2 as usual.&amp;nbsp; Click &lt;b&gt;Start&lt;/b&gt;, right-click &lt;b&gt;Computer&lt;/b&gt;, and then click &lt;b&gt;Properties&lt;/b&gt;.&amp;nbsp; Windows will inform you that the Windows license is valid for 180 days.&amp;nbsp; Shut down the VM.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Open the settings for the Demo VM, and &lt;strong&gt;remove the network adapter for the Local Area Connection&lt;/strong&gt;.&amp;nbsp; The VM is not designed to be connected to the internet, and will not operate properly while connected.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Finally, Tristan Watkins has a great post on &lt;a href="http://tristanwatkins.com/index.php/optimising-the-sharepoint-2010-iw-demo-vm-1/" class="eric-link"&gt;Optimizing the SharePoint 2010 IW Demo VM&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10104067" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Hyper_2D00_V/">Hyper-V</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category></item><item><title>Getting Started using the OData REST API to Query a SharePoint List</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/getting-started-using-the-odata-rest-api-to-query-a-sharepoint-list.aspx</link><pubDate>Thu, 09 Dec 2010 22:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10102905</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/getting-started-using-the-odata-rest-api-to-query-a-sharepoint-list.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SharePoint 2010 exposes list data via OData. &amp;nbsp;I&amp;rsquo;m currently working on an article around SharePoint and OData.&amp;nbsp; As part of this effort, at various points, I&amp;rsquo;ll blog some of my intermediate samples.&amp;nbsp; This post details the minimum number of steps to query a SharePoint list using OData.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on using the OData REST API to access SharePoint 2010 list data.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/Getting-Started-using-the-OData-REST-API-to-Query-a-SharePoint-List.aspx" class="eric-link"&gt;Getting Started using the OData REST API to Query a SharePoint List&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/17/Using-the-OData-Rest-API-for-CRUD-Operations-on-a-SharePoint-List.aspx" class="eric-link"&gt;Using the OData Rest API for CRUD Operations on a SharePoint List&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;By far, the easiest way to get started with SharePoint development is to use the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=751fa0d1-356c-4002-9c60-d539896c66ce&amp;amp;displaylang=en" class="eric-link"&gt;2010 Information Worker Demonstration and Evaluation Virtual Machine&lt;/a&gt; that runs using Hyper-V.&amp;nbsp; The instructions in this and future related posts will be for that virtual machine.&amp;nbsp; If you have setup your own development environment with a different machine name, it is easy enough to adjust these procedures to work with your own servers.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Procedure: Query a SharePoint list using OData&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp; Download, extract, and boot the virtual machine.&amp;nbsp; The download includes detailed instructions.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp; Log into the virtual machine.&amp;nbsp; Use the username brads.&amp;nbsp; The password is pass@word1.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp; Create a new list.&amp;nbsp; Name the list &amp;lsquo;Inventory&amp;rsquo;.&amp;nbsp; Create a two new columns: Description, and Cost.&amp;nbsp; Make the type of the Description column be &amp;lsquo;Single line of text&amp;rsquo;.&amp;nbsp; Make the type of the Cost column be &amp;lsquo;Currency&amp;rsquo;.&amp;nbsp; Enter a couple of rows of sample data.&lt;br /&gt;&lt;br /&gt;After completing this task, my list looked like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/3806.Img1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp; Start Visual Studio 2010 in the virtual machine.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp; Create a new project.&amp;nbsp; Click &lt;b&gt;File -&amp;gt; New -&amp;gt; Project&lt;/b&gt;.&amp;nbsp; Select a directory for the project.&amp;nbsp; Set the name of the project to &lt;b&gt;Gears&lt;/b&gt;.&amp;nbsp; The New Project dialog box will look something like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/1007.Img2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp; Right click on the &lt;b&gt;References&lt;/b&gt; node in the Solution Explorer window, and click &lt;b&gt;Add Service Reference&lt;/b&gt;.&amp;nbsp; Enter &lt;b&gt;http://intranet/_vti_bin/listdata.svc&lt;/b&gt; for the address.&amp;nbsp; Change the namespace to &lt;b&gt;Data&lt;/b&gt;.&amp;nbsp; The Add Service Reference dialog box will look like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/4606.Img3.jpg" border="0" /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Click &lt;b&gt;OK&lt;/b&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;7.&amp;nbsp;&amp;nbsp;&amp;nbsp; Copy and paste the following code into Program.cs:&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Gears.Data;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; Gears&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt; dc =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;TeamSiteDataContext&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"http://intranet/_vti_bin/listdata.svc"&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.Credentials = &lt;span style="color: #2b91af;"&gt;CredentialCache&lt;/span&gt;.DefaultNetworkCredentials;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; result = &lt;span style="color: blue;"&gt;from&lt;/span&gt; d &lt;span style="color: blue;"&gt;in&lt;/span&gt; dc.Inventory&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;select&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title = d.Title,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description = d.Description,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cost = d.Cost,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; d &lt;span style="color: blue;"&gt;in&lt;/span&gt; result)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;8.&amp;nbsp;&amp;nbsp;&amp;nbsp; Press F5 to run.&amp;nbsp; If everything worked, you will see something like the following:&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/7128.Img4.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10102905" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OData/">OData</category></item><item><title>Understanding the Difference between Custom Task Panes and Action Panes</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx</link><pubDate>Thu, 09 Dec 2010 17:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10102758</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;To the user, custom task panes and action panes have an identical appearance.&amp;nbsp; Custom task panes and action panes consist of some screen real-estate that co-exists with the open document or spreadsheet within the Office client.&amp;nbsp; This real-estate can be docked to the right, bottom, left, or right of the document or spreadsheet.&amp;nbsp; It can also be a floating window.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx" class="eric-link"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx" class="eric-link"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx" class="eric-link"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx" class="eric-link"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx" class="eric-link"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The following screen clipping shows a custom task pane for an application-level add-in.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/4520.Img1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The following shows an action pane associated with a spreadsheet.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/3527.Img2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;As you can see, custom task panes and action panes look very similar.&amp;nbsp; There is one key difference.&amp;nbsp; Custom task panes are associated with an application-level add-in in Excel, InfoPath, Outlook, PowerPoint, and Word.&amp;nbsp; Action panes are associated with a document-level customization in Word and Excel only.&amp;nbsp; With an application-level add-in, if the custom task pane is visible, it is visible regardless of which document or spreadsheet is the active one.&amp;nbsp; With a document-level customization, the action pane is visible only if the customized document or spreadsheet is active.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Note that it is more common to build application-level add-ins and to use custom task panes.&amp;nbsp; If you are building a document-level add-in, make sure that your scenario requires the additional complexity of attaching a code-signed assembly to documents and/or spreadsheets.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;A note on nomenclature: As delivered, the Office client applications make use of task panes for a variety of purposes.&amp;nbsp; The styles window (which you have probably used frequently) is a task pane.&amp;nbsp; Most often, you see the styles task pane as a floating window, however, you are free to dock it to one side of the application.&amp;nbsp; When you create a task pane for a managed add-in, it is a &lt;i&gt;custom task pane&lt;/i&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/3108.Img3.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;There are a few final points to make about the difference between application-level add-ins and document-level add-ins.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;With application-level add-ins, it is significantly easier to operate on all open documents or workbooks if you need to.&amp;nbsp; Document-level add-ins, in contrast, are designed to work with one specific document.&amp;nbsp; If you need to process or programmatically examine any or all open documents or spreadsheets, you should use an application-level add-in.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The root object when working with application-level add-ins is an Application object.&amp;nbsp; In the case of Word, it is an object that implements the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.application.aspx" class="eric-link"&gt;Microsoft.Office.Interop.Word.Application&lt;/a&gt; interface.&amp;nbsp; For Excel, it is &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.application.aspx" class="eric-link"&gt;Microsoft.Office.Interop.Excel.Application&lt;/a&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The root object when working with document-level customizations is a document or spreadsheet.&amp;nbsp; For Word, the root object implements the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.document.aspx" class="eric-link"&gt;Microsoft.Office.Interop.Word.Document&lt;/a&gt; interface.&amp;nbsp; For Excel, it is &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbook.aspx" class="eric-link"&gt;Microsoft.Office.Interop.Excel.Workbook&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10102758" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office/">Office</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category></item><item><title>Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx</link><pubDate>Wed, 08 Dec 2010 15:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10102096</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The most important technology for building Office applications is that of managed customizations (including application-level managed add-ins, and document-level customizations).&amp;nbsp; Understanding the architecture and capabilities of managed customizations enables you to place the various developer technologies in context.&amp;nbsp; It is important to know which building blocks are integral to managed customizations, which building blocks provide the foundation for managed customizations, and which building blocks commonly are used in conjunction with managed customizations to provide users with the necessary functionality.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx" class="eric-link"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx" class="eric-link"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx" class="eric-link"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx" class="eric-link"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx" class="eric-link"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;As I mentioned in &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Overview of Office 2010 Application Development&lt;/span&gt;&lt;/a&gt;, managed customizations consists of .NET classes that wrap the underlying COM libraries.&amp;nbsp; Because add-ins wrap COM libraries, there are some differences between these class hierarchies when compared to other .NET class libraries.&lt;/p&gt;
&lt;ul&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;You rarely instantiate objects.&amp;nbsp; Instead, in your code in a managed add-in, you are passed an already created object graph that represents the underlying document or spreadsheet.&amp;nbsp; You then navigate from one object to another in the object graph.&amp;nbsp; Instead of explicitly instantiating new objects, you often request the framework to create one.&amp;nbsp; In the post, &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;, the code example shows requesting the paragraphs collection to create a new paragraph.&amp;nbsp; This is, in effect, a factory method that creates a paragraph object.&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;In some cases, the programming interface does not follow the naming conventions for .NET.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Other than these differences, while the class hierarchies for each of the various applications are extensive, they are straightforward and easy to use.&amp;nbsp; For example, in the Word object model, you commonly work with the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.application.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Application&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.document.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Document&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.paragraph.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Paragraph&lt;/span&gt;&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.range.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Range&lt;/span&gt;&lt;/a&gt; classes.&amp;nbsp; See the &lt;a href="http://msdn.microsoft.com/en-us/library/kw65a0we.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Word Object Model Overview&lt;/span&gt;&lt;/a&gt; for more information.&amp;nbsp; In the Excel object model, you commonly work with the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.application.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Application&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbook.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Workbook&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.worksheet.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Worksheet&lt;/span&gt;&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Range&lt;/span&gt;&lt;/a&gt; classes.&amp;nbsp; See the &lt;a href="http://msdn.microsoft.com/en-us/library/wss56bz7.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Excel Object Model Overview&lt;/span&gt;&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You can build managed add-ins for Word, Excel, Outlook, PowerPoint, Project, Visio, and InfoPath.&amp;nbsp; For the other applications, you need to use COM or other developer technologies to extend them.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;One key difference between writing COM interfaces and writing a managed add-in is that when building applications using the COM interfaces, you could place ActiveX controls in the document or spreadsheet.&amp;nbsp; When writing a managed add-in, you use host items and host controls, which extend the underlying COM interface with some amount of additional functionality, a few more events, and the ability to use .NET Windows Forms controls on the surface of the document.&amp;nbsp; See &lt;a href="http://msdn.microsoft.com/en-us/library/9z4e3456.aspx" class="eric-link"&gt;&lt;span style="color: windowtext; text-decoration: none; text-underline: none;"&gt;Host Items and Host Controls Overview&lt;/span&gt;&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;When you create a new Office 2010 project in Visual Studio, you must pick from one of a variety of project templates.&amp;nbsp; Following are the project templates for C#.&amp;nbsp; VB.NET, of course, has the same set of templates.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/2185.ProjectTypes.png" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The following table details the varieties of add-ins:&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="MsoNormalTable" style="border-collapse: collapse;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; padding-top: 0in; border: windowtext 1pt solid;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Project Template Name&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Excel 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Excel 2010 Template&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Document-level customization that creates and customizes an Excel template&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Excel 2010 Workbook&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Document-level customization that creates and customizes an Excel workbook&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;InfoPath 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Outlook 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;PowerPoint 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Project 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Visio 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Word 2010 Add-in&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Application-level add-in&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Word 2010 Document&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Document-level customization that creates and customizes a Word document&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="187" valign="top" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 1.95in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Word 2010 Template&lt;/p&gt;
&lt;/td&gt;
&lt;td width="451" valign="top" style="border-bottom: windowtext 1pt solid; border-left: #f0f0f0; padding-bottom: 0in; background-color: transparent; padding-left: 5.4pt; width: 4.7in; padding-right: 5.4pt; border-top: #f0f0f0; border-right: windowtext 1pt solid; padding-top: 0in;"&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Document-level customization that creates and customizes a Word template&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&amp;nbsp;The difference between a document-level add-in that creates a template and a document-level add-in that creates a document or workbook is that when the user uses the add-in to create a template (either a document or spreadsheet), the user opens a template to create a local copy as a new document.&amp;nbsp; They cannot modify the original template unless they are given special permissions.&amp;nbsp; See &lt;a href="http://msdn.microsoft.com/en-us/library/8553caee.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Office Project Templates Overview&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/dtzt2by3.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Document vs. Template Solutions&lt;/span&gt;&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;SDK: &lt;a href="http://msdn.microsoft.com/en-us/library/aa942839.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Features Available by Office Application and Project Type&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Developer Center: &lt;a href="http://msdn.microsoft.com/en-us/vsto/default.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;VSTO Developer Center&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/hy7c6z9k.aspx" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Office Solutions Development Overview&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10102096" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office/">Office</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category></item><item><title>What is the Difference between ‘Word Automation’ and ‘Word Automation Services’?</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx</link><pubDate>Tue, 07 Dec 2010 14:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10101363</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo; are two developer building blocks that have similar names, and have overlapping functionality, but are very different pieces of technology.&amp;nbsp; I received some email about the post &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt; where readers were confused about this, so here is the scoop.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx" class="eric-link"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx" class="eric-link"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx" class="eric-link"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx" class="eric-link"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx" class="eric-link"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Word Automation&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Word Automation is a technology where you can write a .NET application that uses the Word client executable to accomplish some task such as creating a document, querying a document for content, or modifying the content of a document.&amp;nbsp; Its roots are COM &amp;ndash; in addition to using&amp;nbsp;.NET to link to the &lt;a href="http://msdn.microsoft.com/en-us/library/15s06t57.aspx" class="eric-link"&gt;Primary Interop Assemblies&lt;/a&gt;, you can use C++ or VB6 (or any other technology that can consume COM) to automate the Word client application.&amp;nbsp; In other words, you write a program that runs Word.&amp;nbsp; There is a rich object model that you can use to manipulate paragraphs, ranges, comments, etc.&amp;nbsp; This technology has been around for years.&amp;nbsp; If you are an experienced Office developer who needed to generate a large number of documents (prior to the introduction of the Open XML SDK), then you have probably used Word Automation at one time or another.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;The user operates a .NET managed application that in turn runs the Word 2007 or Word 2010 client.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/4846.WordAutomation.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;To make this completely clear, the following small console application starts Word, adds a paragraph, saves it, and then causes the Word application to quit.&amp;nbsp; You need to add a reference to the Word 2010 PIA.&amp;nbsp; You find this on the COM tab.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/0451.AddPiaRef.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Note that the following sample uses the feature C# 4.0 that allows you to omit arguments that have default values.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Word = Microsoft.Office.Interop.Word;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Word.&lt;span style="color: #2b91af;"&gt;Application&lt;/span&gt; app = &lt;span style="color: blue;"&gt;new&lt;/span&gt; Word.&lt;span style="color: #2b91af;"&gt;Application&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; app.Visible = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Word.&lt;span style="color: #2b91af;"&gt;Document&lt;/span&gt; doc = app.Documents.Add();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Word.&lt;span style="color: #2b91af;"&gt;Range&lt;/span&gt; range = doc.Content;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Word.&lt;span style="color: #2b91af;"&gt;Paragraph&lt;/span&gt; paragraph = range.Paragraphs.Add();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paragraph.Range.Text = &lt;span style="color: #a31515;"&gt;"Hello World!"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: blue;"&gt;object&lt;/span&gt; saveChanges = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc.SaveAs2(&lt;span style="color: #a31515;"&gt;@"E:\Temp\Test.docx"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Microsoft.Office.Interop.Word.&lt;span style="color: #2b91af;"&gt;_Application&lt;/span&gt;)app).Quit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;This scenario, where you are programmatically generating word-processing documents, is where you should be using the Open XML SDK instead of Word automation.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Word Automation Services&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Word Automation Services is a service that runs under SharePoint Server 2010 (both Standard and Enterprise) that can convert documents to and from various formats, and can update content inside Word documents, such as calculated fields (like the table-of-contents).&amp;nbsp; Word Automation Services is specifically designed to complement the Open XML SDK for server-side scenarios.&amp;nbsp; Some tasks, such as repagination, updating fields, and importing altChunk elements are difficult to accomplish when using the Open XML SDK, so if your scenario requires those areas of functionality, it&amp;rsquo;s great to use the Open XML SDK together with Word Automation Services.&amp;nbsp; Both the Open XML SDK and Word Automation Services are &amp;lsquo;server hardened&amp;rsquo;.&amp;nbsp; You can build systems that generate and process hundreds or thousands of documents per day.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;To use Word Automation Services, you must write code that runs on the SharePoint server; you cannot directly access Word Automation Services from a client computer.&amp;nbsp; The Managed Client Object Model does not include a programming interface to Word Automation Services.&amp;nbsp; See &lt;a href="http://msdn.microsoft.com/en-us/library/ff742315.aspx" class="eric-link"&gt;Developing with SharePoint 2010 Word Automation Services&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;However, there is an easy way to work around the server-side limitation of Word Automation Services:&lt;/p&gt;
&lt;ul&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal"&gt;Write a WCF service that runs on the SharePoint server computer that exposes the functionality that you need in your client application.&lt;/div&gt;
&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;
&lt;div class="MsoNormal"&gt;Write your client application to consume that WCF service, integrating Word Automation Services functionality into the client application.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/4137.WordAutomationServices.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;You might have a scenario where you want to generate a PDF or XPS document based on user input in the client application.&amp;nbsp; To implement this, you need to expose functions in the WCF service that can take a Word document as input, and returns a PDF or XPS document.&amp;nbsp; You can then use the Open XML SDK to generate an Open XML word-processing document, and then use your WCF service to do the conversion.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Excel Automation vs Excel Services&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;Excel has the same possibilities.&amp;nbsp; You can write a program that automates the Excel client application to accomplish certain scenarios.&amp;nbsp; Alternatively, you can use Excel Services (part of SharePoint Server 2010 Enterprise) to implement functionality.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;In contrast to Word, there are scenarios where using Excel automation is the only way to accomplish specific tasks.&amp;nbsp; If you need to modify a spreadsheet, such as inserting or deleting a row or column, then the appropriate technology may be to automate the Excel client application.&amp;nbsp; Inserting a row or column using the Open XML SDK would involve parsing formulas and modifying the parsed formulas, a fairly involved operation.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10101363" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office/">Office</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Word+Automation+Services/">Word Automation Services</category></item><item><title>Understanding the Three Approaches to Office Development using VSTO</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx</link><pubDate>Thu, 02 Dec 2010 16:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10099586</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;When using Visual Studio Tools for Office (VSTO), there are three basic approaches to Office development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Application-Level Managed Add-In&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Document-Level Customization&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Office Automation&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx" class="eric-link"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx" class="eric-link"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx" class="eric-link"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx" class="eric-link"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx" class="eric-link"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx" class="eric-link"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx" class="eric-link"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx" class="eric-link"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium; color: black;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx" class="eric-link"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Under the covers, the Office client applications use COM to expose their functionality.&amp;nbsp; One of the uses of COM in Office is to develop an &lt;i&gt;add-in&lt;/i&gt;, which is code that the Office client application loads and runs as the user operates the Office client application.&amp;nbsp; There are specific mechanisms that Office uses for add-ins, including placing DLLs in appropriate places, configuring code access security to enable running the code, and creating registry entries so that the Office client applications know of the existence of the add-in.&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Visual Studio Tools for Office layers a .NET managed programming interface on top of the COM interfaces.&amp;nbsp; This is immensely valuable &amp;ndash; the Microsoft developers who built VSTO take care of many issues around building COM applications, and free us up to develop the functionality that meets our customers&amp;rsquo; needs.&amp;nbsp; The .NET run-time is a managed run-time; hence the name of an add-in built using VSTO is a &lt;i&gt;managed add-in&lt;/i&gt;.&amp;nbsp; The .NET assemblies that are layered over COM are called the &lt;a href="http://msdn.microsoft.com/en-us/library/15s06t57.aspx" class="eric-link"&gt;Office Primary Interop Assemblies&lt;/a&gt; (often called PIAs).&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;There are two approaches to building a customization of Office.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="eric-para" style="text-indent: 0in; margin: 0in 0in 10pt; tab-stops: .5in; font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Application-level&amp;nbsp;add-in&lt;/b&gt; &amp;ndash; This type of add-in&amp;rsquo;s functionality is available regardless of which document, spreadsheet, or presentation is opened.&amp;nbsp; An example of this variety is a department-wide or corporate-wide application that enables some level of functionality that every employee of the department or corporation needs to access on a regular basis.&amp;nbsp; As an example, &lt;a href="http://www.microsoft.com/showcase/en/us/details/cd7d86ce-d53f-4adc-b3ed-bdced4462522" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;Lexis for Microsoft Office&lt;/span&gt;&lt;/a&gt; is an Office customization targeting legal firms.&amp;nbsp; Users need to execute the same code for every document, so it is implemented as an application-level managed add-in.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="eric-para" style="text-indent: 0in; margin: 0in 0in 10pt; tab-stops: .5in; font-family: Calibri; font-size: medium; color: black;"&gt;&lt;b&gt;Document-level customization&lt;/b&gt; &amp;ndash; This type of functionality is part of the document.&amp;nbsp; In this scenario, .NET managed assemblies (code-signed for security purposes) are attached directly to each document, so if you send the document to a new user, they can open the document and use the add-in&amp;rsquo;s functionality without explicitly installing an add-in.&amp;nbsp; For example, a tax analysis department needs to systematically analyze documents for their tax implications and then communicate that analysis back to the document author.&amp;nbsp; The result of that analysis is associated with a specific document, so it makes sense to build a document-level add-in that manages the process of assessing and optimizing the tax implications of that document.&amp;nbsp; Actually, in this case you might have an application-level add-in that is used by the tax analysis firm that produces a document that is customized with a document-level add-in.&lt;br /&gt;&lt;br /&gt;In another case, a large consulting and accounting firm produces spreadsheets that implement sophisticated calculations that would be difficult to implement directly using Excel formulas.&amp;nbsp; They use a document-level add-in so that they can send spreadsheets to associates in other firms or to their customer, and those recipients can take advantage of the code in the document-level add-in.&amp;nbsp; Note that with Office 2007 and Office 2010, document-level customizations are available only for Word and Excel.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;The third approach to use the COM interfaces (both directly and through the PIAs) is &lt;b&gt;Office Automation&lt;/b&gt;.&amp;nbsp; You can develop an automation application that runs an Office client application to perform some specific task.&amp;nbsp; Your application may have the appearance of a traditional Windows application.&amp;nbsp; It may even be a simple console application.&amp;nbsp; When you run this application, under the covers, the application runs the Office application (such as Word 2010 or Excel 2010) and uses it to accomplish the desired task.&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Applications that use Office Automation are not intended for unattended server-side automation.&amp;nbsp; The Office client applications are, at their core, user applications.&amp;nbsp; They may put up dialog boxes and require user input.&amp;nbsp; The issues around server-side Office client automation are &lt;a href="http://support.microsoft.com/kb/257757" class="eric-link"&gt;&lt;span style="color: #0000ff;"&gt;well-known&lt;/span&gt;&lt;/a&gt;.&amp;nbsp; Instead of using Office automation, the modern approach is to use the Open XML SDK combined with &lt;a href="http://msdn.microsoft.com/en-us/library/ff742315.aspx" class="eric-link"&gt;Word Automation Services&lt;/a&gt;.&amp;nbsp; The Open XML SDK and Word Automation Services are server-hardened tools.&amp;nbsp; You can accomplish many word-processing scenarios using them.&amp;nbsp; The resulting application will be much more reliable, and will have better performance than if you build it using Office automation.&amp;nbsp; There are very few word-processing scenarios where it is better to automate Office than to use the Open XML SDK and Word Automation Services.&amp;nbsp; Note that while the name of Word Automation Services has the word 'Automation' in it, Word Automation Services is not automating Office on the server.&amp;nbsp; Word Automation Services is a service that comes with SharePoint Server 2010.&amp;nbsp;&amp;nbsp;It is a service that you can use in combination with the Open XML SDK to accomplish word-processing scenarios.&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;In contrast, there are many Excel scenarios where we recommend using Office automation (although not unattended server-side automation).&amp;nbsp; Modification of an Excel spreadsheet is fairly involved.&amp;nbsp; For instance, if you insert a row, you probably want to update all formulas that reference cells below the inserted row.&amp;nbsp; This is not trivial, and would rely on a formula parser and a fair amount of logic.&amp;nbsp; Instead, for many scenarios, it is better to use Excel automation.&amp;nbsp; Another approach to accomplishing some scenarios is to use Excel Services, which is a service that comes with SharePoint Server 2010 Enterprise.&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Regardless of whether you are building an application-level add-in or a document-level customization, your extensions fall into one of two categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Your extension may enhance the user interface.&amp;nbsp; For example, you may develop an extension that adds a new tab to the ribbon, and exposes functionality through an action pane or custom task pane (more on these shortly).&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Your extension may directly manipulate open documents, spreadsheets, or presentations.&amp;nbsp; For example, you may develop an application that inserts a pre-formatted table with data retrieved from a corporate database.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;Typically, a application-level managed add-in&amp;nbsp;or document-level customization will do both of these &amp;ndash; it extends the user interface, and when the user operates the user interface, it manipulates the open document in some fashion.&lt;/p&gt;
&lt;p class="eric-para" style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;"&gt;In the next post, I'm going to discuss some of the notable points about Office development using VSTO, and compare that to&amp;nbsp;more conventional&amp;nbsp;C# / VB.NET development.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10099586" width="1" height="1"&gt;</description></item><item><title>Office Application Scenarios</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx</link><pubDate>Tue, 30 Nov 2010 14:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10098349</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Many developers identify and document developer scenarios while designing software before writing functional specifications.&amp;nbsp; Sometimes this process consists of the construction of &amp;lsquo;story boards&amp;rsquo; that show how the user moves from point A to point B to accomplish a specific task.&amp;nbsp; Sometimes you may do formal use-case analysis.&amp;nbsp; You may even mock up a scenario using PowerPoint or a modeling tool.&amp;nbsp; In most development organizations, you write a formal specification that outlines and details the scenario.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are a few general types of scenarios.&lt;/p&gt;
&lt;ul&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;Scenarios that retrieve external data from a line-of-business system and surface that data for users.&amp;nbsp; In these scenarios, you typically will generate documents, spreadsheets, or presentations from that data.&amp;nbsp; For example, you may provide an approach for sales people to pull sales projections and results from a server to create a status update PowerPoint presentation for a sales meeting.&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;Scenarios that make it easier (or perhaps simply possible) to accomplish a specific task.&amp;nbsp; You may have a mathematical optimizer written in FORTRAN that performs some heavy-duty number crunching, and integrates the results into a spreadsheet or word document.&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;Scenarios that augment the experience for a user.&amp;nbsp; You may build a system that retrieves reference material automatically for specific content in a document or spreadsheet.&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;Scenarios around document generation.&amp;nbsp; You may generate hundreds or thousands of Open XML document based on data stored in SharePoint lists or external systems, and then convert to PDF and print them.&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;Scenarios around process and procedure.&amp;nbsp; Scenarios can be as simple as a document approval process, or can be as involved as shepherding a RFP through generating a proposal to signing of a contract.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;These are a few examples of varieties of scenarios, but, of course, there are many more.&amp;nbsp; You implement each developer scenario by using one or more Office developer building blocks.&amp;nbsp; Of course, as systems designers, you must determine your own scenarios.&amp;nbsp; Then, your task is to be familiar with the available building blocks that you can use to implement your scenario.&amp;nbsp; In many cases, you have more than one option; each option has different characteristics, and one option might suit more than another for a particular scenario.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The building blocks vary for each Office application.&amp;nbsp; Word and Excel have the highest number of building blocks, which makes sense due to their heavy usage and large number of scenarios where you want to extend them.&amp;nbsp; In this article, I list the Office developer building blocks for each of the Office applications.&amp;nbsp; I explain the use case for each building block, and provide links to further information to help you get started.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developers typically extend a single Office application at a time.&amp;nbsp; You may need to extend Word 2010 to enable certain content authoring scenarios.&amp;nbsp; You may need to extend Excel 2010 to enable high-performance calculations that would be difficult to implement using just Excel.&amp;nbsp; You may need to enable sales people to build PowerPoint presentations that are directly targeted towards the specific customer they are seeing that day.&amp;nbsp; For each of these specific scenarios, you typically extend a single Office client application.&amp;nbsp; There are some scenarios where you need to work with word-processing documents, spreadsheets, and presentations simultaneously, such as the scenario presented in &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff519529.aspx"&gt;&lt;span style="color: #0000ff;"&gt;Assembling Documents on SharePoint 2010 Sites by Merging Content from Excel, PowerPoint, and Word&lt;/span&gt;&lt;/a&gt;, but for most scenarios you extend only one or another of the Office client applications.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Development of an Office application is singularly different from other types of development.&amp;nbsp; From the developer&amp;rsquo;s point of view, the Office clients comprise a framework &amp;ndash; a large framework with a remarkable set of capabilities, but first and foremost the Office clients are end-user applications.&amp;nbsp; This impacts our development in interesting ways.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10098349" width="1" height="1"&gt;</description></item><item><title>Overview of Office 2010 Application Development</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx</link><pubDate>Mon, 29 Nov 2010 15:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10097780</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can use a variety of approaches to extend Microsoft Office 2010.&amp;nbsp; There are multiple ways to extend each of the Microsoft Office applications&amp;rsquo; user interfaces and programmatically work with the underlying documents, spreadsheets, or presentations. The best way to accomplish your desired objective is not always obvious.&amp;nbsp; This article provides a high-level overview of Office 2010 as a development platform, and lists the &lt;b&gt;Office Developer Building Blocks&lt;/b&gt;, which are the technologies that you use to extend Microsoft Office.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; color: black; font-size: medium;" class="eric-para"&gt;I am a developer relatively new to Office client development.&amp;nbsp; It often is most useful for me to write about a technology immediately or soon after I learn it &amp;ndash; mentioning those aspects which stood out to me, and placing technologies in context to other developer technologies that I&amp;rsquo;ve used.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When you consider Office development, one of the complicating factors is that Office has been around for many, many years, and the developer approach toward Office development has evolved over those years.&amp;nbsp; It is pretty amazing that many applications that were written years ago using developer technologies of those days continue to operate correctly with Office 2010.&amp;nbsp; However, our job as developers is to know what the new developer approaches are, and to migrate from the old to the new.&amp;nbsp; There are good reasons why the Microsoft Office division releases new developer technologies and de-emphasizes older technologies.&amp;nbsp; It is a tribute to Office development team&amp;rsquo;s efforts that many of those old developer technologies still work on Office 2010, but except where absolutely necessary, for new development, we should use the new approaches.&amp;nbsp; While you should only use the recommended approaches for new development, it is valuable and educational to list every Office developer building block.&amp;nbsp; This is one of the goals of this series of blog posts.&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;A Short History of Office Development&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;WordBasic was introduced to Microsoft Word for Windows and Word for OS/2 in 1989.&amp;nbsp; I believe that it was the first Microsoft Office technology that enabled developers to manipulate documents programmatically.&amp;nbsp; A few years after that, Microsoft released Visual Basic for Applications, bringing new capabilities and a more normalized library.&amp;nbsp; COM-based interfaces followed, bringing Office development to C and Visual Basic.&amp;nbsp; Visual Studio Tools for Office (which are layered on top of the COM-based interfaces) followed, enabling developers to create &lt;i&gt;managed add-ins&lt;/i&gt;.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Visual Basic for Applications (VBA)&lt;/span&gt;&lt;/h2&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Many savvy users use VBA by recording a macro, then using the VBA editor to modify the macros.&amp;nbsp; This is a purely pragmatic developer experience.&amp;nbsp; Those users are concerned with getting the job done in as fast a manner as possible.&amp;nbsp; When using VBA in that fashion, VBA is not so much a development environment as an extended, super-powerful character-based user interface to Office documents.&amp;nbsp; There are companies that have developed extensive applications that used VBA as a development platform, but modern Office applications use Visual Studio Tools for Office to build managed add-ins.&amp;nbsp; However, there are scenarios where securely-signed VBA code meets the user&amp;rsquo;s needs better than any other approach.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Extending Office by using COM&lt;/span&gt;&lt;/h2&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The COM based interfaces for Office automation were real development platforms.&amp;nbsp; It was possible to build robust applications using COM and ActiveX, but if you used COM incorrectly, it was possible to build applications that were NOT robust, to say the least.&amp;nbsp; There were a variety of problems caused by multiple versions of dynamic link libraries.&amp;nbsp; This approach to application development was not for the faint of heart, but a detail-oriented developer could put together some cool functionality.&amp;nbsp; If you were a software vendor who built products that provided significant value on top of the Office applications, you could build great products, but the developers on your staff needed to be top-notch.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Managed Add-Ins using Visual Studio Tools for Office (VSTO)&lt;/span&gt;&lt;/h2&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The release of Visual Studio Tools for Office (VSTO), along with the Primary Interoperability Assemblies (PIA) significantly made it easier to develop.&amp;nbsp; The PIAs are specially coded .NET assemblies that provide a managed class library that wraps the underlying COM interfaces.&amp;nbsp; It is so much easier to build robust C# and VB.NET application than applications written in C / C++ using COM.&amp;nbsp; In development, frictional issues are those that you must deal with due to the underlying platform.&amp;nbsp; They add no value to your application, but are necessary for developing reliable software.&amp;nbsp; I&amp;rsquo;ve developed using both C / COM and C# / VB.NET, and can attest that when developing C / COM applications, you spend more time dealing with frictional issues than you spend when developing using the .NET languages.&amp;nbsp; When you build an add-in for Office using VSTO, it is called a &lt;i&gt;managed add-in&lt;/i&gt;.&amp;nbsp; I will examine managed add-ins in more detail after I describe what an Office application is.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Note: VSTO has been around since Visual Studio 2003 for document-level projects.&amp;nbsp; There were two versions of VSTO for Visual Studio 2005: VSTO 2005 and VSTO 2005 SE.&amp;nbsp; See &lt;a href="http://msdn.microsoft.com/en-us/library/aa942839(VS.80).aspx"&gt;Features Available by Product Combination&lt;/a&gt; for the differences in features.&amp;nbsp; See &lt;a href="http://msdn.microsoft.com/en-us/library/aa942839(VS.90).aspx"&gt;this topic&lt;/a&gt; for the features in Visual Studio 2008, and &lt;a href="http://msdn.microsoft.com/en-us/library/aa942839.aspx"&gt;this topic&lt;/a&gt; for features in Visual Studio 2010.&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;What is an Office Application&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To summarize, Office 2010 consists of a number of applications (in alphabetical order, Access, Excel, InfoPath, Lync, OneNote, Outlook, PowerPoint, Project, Visio, Word), each of which can be extended in specific ways.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Typically, an Office application uses a back-end system that enables collaboration between users or richer interaction with documents, spreadsheets, and presentations.&amp;nbsp; An application could connect to a high-performance installation of SQL Server or to web services; your managed add-in saves and retrieves data from the SQL server or the web services.&amp;nbsp; Alternatively, an Office application can be an extension of an existing line-of-business system &amp;ndash; pulling data from that system, and generating documents or spreadsheets based on information stored in that line-of-business system.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;With the release of Office 2010 and SharePoint 2010, the most effective way to enable collaboration for users of your Office application is to base the application on SharePoint 2010.&amp;nbsp; SharePoint 2010&amp;rsquo;s integration with the Office client makes it easier to build features and implement scenarios that make it seamless to operate your Office application from either the Office client or from a browser.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In a separate article, &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/10/26/sharepoint-developer-building-blocks-technologies-for-creating-sharepoint-applications.aspx?wa=wsignin1.0"&gt;SharePoint Developer Building Blocks: Technologies for Creating SharePoint Applications&lt;/a&gt;, I enumerate the developer building blocks for SharePoint 2010.&amp;nbsp; Using the SharePoint developer building blocks in combination with the Office developer building blocks provides developers with a powerful set of tools for building enterprise applications.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In the next post, I'm going to examine Office development scenarios.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10097780" width="1" height="1"&gt;</description></item><item><title>Office/SharePoint Building Blocks and Developer Stories</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx</link><pubDate>Tue, 23 Nov 2010 16:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10095491</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;For the last few months, it has been my assigned job to think and write about Office and SharePoint development from a very high level.&amp;nbsp; I haven&amp;rsquo;t written &lt;b&gt;&lt;span style="text-decoration: underline;"&gt;any&lt;/span&gt;&lt;/b&gt; code (sadly).&amp;nbsp; Instead, I&amp;rsquo;ve been simply involved in a survey, first, of SharePoint 2010, followed by the Office 2010 client applications.&amp;nbsp; The first result of my efforts (as well as the efforts of many other individuals) was &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/10/26/sharepoint-developer-building-blocks-technologies-for-creating-sharepoint-applications.aspx?wa=wsignin1.0"&gt;SharePoint Developer Building Blocks: Technologies for Creating SharePoint Applications&lt;/a&gt;.&amp;nbsp; For a variety of reasons, I delayed publishing anything until that article was written and reviewed by appropriate people.&amp;nbsp; But I&amp;rsquo;m going to take a different tack with Office client development.&amp;nbsp; Over the next 2-3 weeks, I&amp;rsquo;m going to first blog my thoughts on Office client development from an overview level, and then cover each of the Office clients in a separate post.&amp;nbsp; As with the SharePoint article, I&amp;rsquo;m going to focus much more on &lt;b&gt;what&lt;/b&gt; you can do, and &lt;b&gt;why&lt;/b&gt; you want to do it, and less on &lt;b&gt;how&lt;/b&gt; to do it.&amp;nbsp; I&amp;rsquo;ll link to other videos, SDK documentation, Visual How-To articles, etc. that explain the &amp;lsquo;how&amp;rsquo;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on Microsoft Office 2010 application development. These posts will be published in the future as part of an MSDN article. As usual, after the MSDN article is published, I&amp;rsquo;ll place pointers in the blog posts to the article on MSDN.&lt;/p&gt;
&lt;ol&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/23/office-sharepoint-building-blocks-and-developer-stories.aspx"&gt;Office/SharePoint Building Blocks and Developer Stories&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/29/overview-of-office-2010-application-development.aspx"&gt;Overview of Office 2010 Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/11/30/office-application-scenarios.aspx"&gt;Office Application Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/02/understanding-the-three-approaches-to-office-development-using-vsto.aspx"&gt;Understanding the Three Approaches to Office Development using VSTO&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/07/what-is-the-difference-between-word-automation-and-word-automation-services.aspx"&gt;What is the Difference between &amp;lsquo;Word Automation&amp;rsquo; and &amp;lsquo;Word Automation Services&amp;rsquo;?&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/08/understanding-the-architecture-of-office-2010-managed-add-ins-and-customizations.aspx"&gt;Understanding the Architecture of Office 2010 Managed Add-Ins and Customizations&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/09/understanding-the-difference-between-custom-task-panes-and-action-panes.aspx"&gt;Understanding the Difference between Custom Task Panes and Action Panes&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/15/microsoft-word-2010-developer-building-blocks.aspx"&gt;Microsoft Word 2010 Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/12/16/comparing-excel-automation-to-excel-services.aspx"&gt;Comparing Excel Automation to Excel Services&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;So why the term &amp;lsquo;building blocks&amp;rsquo;?&amp;nbsp; I suppose the answer is that we haven&amp;rsquo;t found a better term.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;From my limited perspective on the bottom of the heap, inside the Microsoft Office division, as new version of the products are being developed, the folks in charge have various meetings where they introduce new features in SharePoint or Office, and the common term that is bandied around is &amp;lsquo;developer story&amp;rsquo;, as in, &amp;lsquo;What are the developer stories for Silverlight and SharePoint&amp;rsquo;, or &amp;lsquo;What&amp;rsquo;s the developer story for AJAX and SharePoint?&amp;rsquo;&amp;nbsp; Then, the job of writers and others is to &amp;lsquo;tell that story&amp;rsquo;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The term &amp;lsquo;developer story&amp;rsquo;&amp;nbsp;probably doesn't make&amp;nbsp;sense to developers who are not inside the Microsoft bubble here in Redmond, but to me, the term &amp;lsquo;developer story&amp;rsquo; is basically synonymous&amp;nbsp;with &amp;lsquo;developer building block&amp;rsquo;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One of the problems is that there isn&amp;rsquo;t any one thing that comprises building blocks.&amp;nbsp; In some cases, you code some declarative XML.&amp;nbsp; In others, you write C#/VB.NET code that uses a library.&amp;nbsp; In still others, you use SharePoint designer to put workflows together (workflows are essentially a declarative programming language).&amp;nbsp; Therefore, we couldn&amp;rsquo;t use the term library, language, programming interface, or any of the other terms that we use in taxonomies of developer technologies.&amp;nbsp; The same issue applies with Office client development.&amp;nbsp; There are specialized languages (VBA, Access Data Macros), COM libraries, .NET libraries that are layered on top of the COM libraries, declarative approaches, and more.&amp;nbsp; So building block is the term we&amp;rsquo;ll use.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When I&amp;rsquo;ve been examining first SharePoint, and then the Office client applications, sometimes it is a judgment call about whether some particular developer technology is listed as a building block.&amp;nbsp; My litmus test for this is &amp;lsquo;what do developers need to know about?&amp;rsquo;&amp;nbsp; To a certain extent, my judgment has been colored by my personal experience in coming up to speed as a SharePoint/Office developer.&amp;nbsp; If something confused me while learning about it, then I felt I needed to pick building blocks to prevent (if possible) others from having the same confusion.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In the next blog post, I&amp;rsquo;m going to write about the varieties of applications you can build with Office.&amp;nbsp; I&amp;rsquo;ll also define what an &amp;lsquo;Office client developer scenario&amp;rsquo; is.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;As I've been making my way through the vast subject of Microsoft Office client development, I've had many 'cool, I didn't know you could do that' experiences.&amp;nbsp; The best part of writing this series of blog posts is that it is going to be FUN to share those experiences.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10095491" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office/">Office</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category></item><item><title>Easy SharePoint 2010 Setup for Developers on Windows 7</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/11/02/easy-sharepoint-2010-setup-for-developers-on-windows-7.aspx</link><pubDate>Tue, 02 Nov 2010 18:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10084918</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/11/02/easy-sharepoint-2010-setup-for-developers-on-windows-7.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://blogs.msdn.com/b/cjohnson/"&gt;Chris Johnson&lt;/a&gt; and &lt;a class="eric-link" href="http://blogs.msdn.com/b/pstubbs/"&gt;Paul Stubbs&lt;/a&gt; have released some PowerShell scripts that make it easy to setup SharePoint 2010 on a Windows 7 developer workstation.&amp;nbsp; These scripts will install and configure the prerequisites to get up and running with SharePoint development.&amp;nbsp; All of the source is provided, so you can customize it.&amp;nbsp; Out of the box it will help you install:&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SharePoint Server 2010 + pre-requisites (Standalone)&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visual Studio 2010 Ultimate Edition&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Silverlight 4 Tools for Visual Studio&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression Studio 4 Ultimate&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Open XML SDK&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visual Studio SDK&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visual Studio SharePoint Power Tools&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Office 2010 Professional Plus&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SharePoint Designer 2010&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Visio 2010&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Chris Johnson has a &lt;a class="eric-link" href="http://blogs.msdn.com/b/cjohnson/archive/2010/10/28/announcing-sharepoint-easy-setup-for-developers.aspx"&gt;walk-through guide&lt;/a&gt;, as well as details on where to download.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10084918" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category></item><item><title>SharePoint Developer Building Blocks: Technologies for Creating SharePoint Applications</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/10/26/sharepoint-developer-building-blocks-technologies-for-creating-sharepoint-applications.aspx</link><pubDate>Tue, 26 Oct 2010 14:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10080939</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/10/26/sharepoint-developer-building-blocks-technologies-for-creating-sharepoint-applications.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can use a variety of languages, frameworks, object models, and tools to build scalable distributed web applications on the SharePoint 2010 development platform.&amp;nbsp; It can be difficult for a developer new to SharePoint to know what to use to accomplish various scenarios, or even what is possible.&amp;nbsp; This article provides a high-level overview of SharePoint as a development platform, compares and contrasts SharePoint development to other types of development, and lists the &lt;b&gt;SharePoint Developer Building Blocks&lt;/b&gt;, which are the technologies that you use to build a SharePoint application.&amp;nbsp; Perhaps the biggest challenge for you as a SharePoint developer is to understand what your choices are for building blocks, and to select the correct options that meet your architectural and design goals.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This is the MSDN article that I&amp;rsquo;ve been literally obsessing about for the last few weeks, to be published sometime in the near future.&amp;nbsp; After it is published on MSDN, I&amp;rsquo;ll update this post with a link to the MSDN article.&amp;nbsp; AJ May and Dallas Tester contributed to this article.&amp;nbsp; It was technically reviewed by Mike Morten, Mary Lee, Iouri Simernitski, Dallas Tester, Siew Moi Khor, Erika Ehrli Cabral, and Jim Corbin.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;I wrote this article with myself as the prospective reader (before learning about SharePoint 2010).&lt;/p&gt;
&lt;h1&gt;Table of Contents&lt;/h1&gt;
&lt;ol style="margin: 0in;"&gt;
&lt;li class="eric-para"&gt;&lt;a href="#Intro"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#WhatIs"&gt;What is a SharePoint Application?&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#Comparing"&gt;Comparing and Contrasting SharePoint Development with other Forms of Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="#BuildingScalable"&gt;Building Scalable .NET Web Applications&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="#VsDatabase"&gt;SharePoint Development vs. Database Application Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="#VsTraditional"&gt;SharePoint Development compared to Traditional Rich Client Development&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#LanguagesAndPlatforms"&gt;Languages and Platforms&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#SharePointApplicationDevelopmentTerms"&gt;SharePoint Application Development Terms&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#VarietiesOfSharePointApplications"&gt;Varieties of SharePoint Applications&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#SharePointCapabilities"&gt;SharePoint Capabilities&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#SharePointDeveloperScenarios"&gt;SharePoint Developer Scenarios&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#SharePointDeveloperBuildingBlocks"&gt;SharePoint Developer Building Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#DeveloperDashboard"&gt;Developer Dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#Accessibility"&gt;Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#SharePointDevelopmentTools"&gt;SharePoint Development Tools&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#SettingUpADevelopmentEnvironment"&gt;Setting up a Development Environment&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#ApplicationLifecycleManagement"&gt;Application Lifecycle Management (ALM)&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#Conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para"&gt;&lt;a href="#AdditionalResources"&gt;Additional Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="Intro"&gt;Introduction&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;From a high level, it is useful to examine SharePoint development from a number of different viewpoints, such as:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;How SharePoint development compares to and contrasts with other forms of development:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;o&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Scalable loosely coupled ASP.NET application development&lt;br /&gt;o&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Database application development&lt;br /&gt;o&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Traditional rich client development&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;What languages and frameworks must developers know?&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;How do document formats such as Open XML affect your application design?&amp;nbsp; What new scenarios are possible?&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This article presumes that the decision to use the SharePoint development platform has been already made.&amp;nbsp; This is the position that many developers are in.&amp;nbsp; In some cases, developers are assigned to a project that uses SharePoint as a platform.&amp;nbsp; In others, developers are proactively developing their skills.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;From a high level, the SharePoint 2010 developer architecture consists of a number of layers of technology.&amp;nbsp; It is an ASP.NET application that is built on SQL Server, and runs on Windows Server. The following diagram shows how a number of the more critical building blocks use underlying systems to provide necessary functionality.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Figure 1: Diagram of key building blocks and underlying systems&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/0882.Fig01.png" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;It can be a bit daunting to see the breadth of technologies that a SharePoint developer must know.&amp;nbsp; When I jumped into SharePoint development, I started from a spot similar to many other developers who enter SharePoint development.&amp;nbsp; I was a competent developer with in-depth experience in a few areas (in my case, C/C++/C#/.NET/LINQ/SQL/XML/Open XML), shallower experience in a number of areas, and a cursory knowledge of others.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;I had to deepen my knowledge in the following technologies:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ASP.NET&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ASP.NET Themes and Skins&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Html and CSS&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;JavaScript&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ASP.NET Web Parts&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;IIS&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;While I understood the architecture, as a developer I needed to learn the details of the following technologies almost from scratch.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;The SharePoint object model&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;The SharePoint managed client object model&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Silverlight and XAML&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Workflows&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WCF and web services&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SharePoint REST APIs&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Excel Services&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Windows Identity Foundation and claims-based identity&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Each of these technologies requires some amount of study. &amp;nbsp;The basic concepts are not difficult, but learning enough to be proficient can be a lengthy process.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In this article, I&amp;rsquo;m going to list some of my thoughts about various aspects of SharePoint development.&amp;nbsp; I&amp;rsquo;m going to correlate aspects of SharePoint development to previous experiences.&amp;nbsp; What was similar to previous development environments that I&amp;rsquo;ve worked in?&amp;nbsp; What was different?&amp;nbsp; I&amp;rsquo;m also going to discuss how I think of SharePoint development.&amp;nbsp; What comprises a SharePoint application?&amp;nbsp; What are my options for building one?&amp;nbsp; What is the big picture, and where do I need to drill down when implementing a particular scenario?&amp;nbsp; My goal is to outline the key aspects that you need to know in order to be effective at SharePoint development.&lt;/p&gt;
&lt;h1 id="WhatIs"&gt;What is a SharePoint Application?&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To summarize, SharePoint Server is a system with the following capabilities:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Sites &amp;ndash; Web Sites both inside and outside the firewall.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Communities &amp;ndash; Collaboration through wikis, blogs, and more.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Content &amp;ndash; Enterprise Content Management (ECM) &amp;ndash; Web Content Management (WCM) &amp;ndash; Publishing Systems.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Search &amp;ndash; SharePoint includes a search engine that you can customize for your needs.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Insights &amp;ndash; Business Intelligence (BI).&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Composite Applications &amp;ndash; includes data access, user interface, processes, and infrastructure.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint is a scalable architecture that can be appropriate for a few users, or 100,000 employees of a large corporation.&amp;nbsp; For web sites outside of the firewall, SharePoint for Internet Services allows you to build scalable, flexible web sites that you can maintain with the ease of maintaining a SharePoint site.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In most cases, when you build a SharePoint application, you are adding additional capabilities to the core functionality.&amp;nbsp; You may want to streamline the user interface for some important users.&amp;nbsp; You may want to provide some custom capabilities in several Web parts for a particular vertical market such as construction, law, or manufacturing.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In a few cases, you may build a stand-alone application that makes programmatic use of SharePoint&amp;rsquo;s capabilities.&amp;nbsp; The end user may never see the SharePoint user interface, or even be aware that the application is developed using SharePoint as part of its infrastructure.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Customization can be light or deep.&amp;nbsp; Your entire customization may consist of a single web part that enables some scenario in your group or team.&amp;nbsp; Or you may be building a complex commercial application that has data flow and processes.&amp;nbsp; You may have integration (deep or shallow) with external Customer Relationship Management (CRM) or Enterprise Resource Planning (ERP) systems.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint&amp;rsquo;s integration with the Microsoft Office 2010 system is important.&amp;nbsp; You can take advantage of this integration to build solutions such that no matter where your users are &amp;ndash; in an Office client application or in a web browser &amp;ndash; the features of your application are discoverable and convenient for them.&amp;nbsp; At various places in this article, I&amp;rsquo;ll discuss where SharePoint development intersects with Office 2010 client development.&lt;/p&gt;
&lt;h1 id="Comparing"&gt;Comparing and Contrasting SharePoint Development with other Forms of Development&lt;/h1&gt;
&lt;h2 id="BuildingScalable"&gt;Building Scalable .NET Web Applications&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can look at SharePoint development from the perspective of a developer who builds highly scalable, loosely coupled web applications that run on large server farms.&amp;nbsp; These applications need to be capable of handling hundreds or thousands of page views per minute.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;At its core, SharePoint is an ASP.NET application that runs on IIS and can have multiple web front end machines that handle load balancing.&amp;nbsp; SQL Server provides the integrity, scalability, robustness, and security of your data and documents that you store in your SharePoint sites.&amp;nbsp; Following are some important ways that scalability affects SharePoint development.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;API Design -&lt;/b&gt; Scalability drives certain characteristics of SharePoint&amp;rsquo;s programming interfaces.&amp;nbsp; It is easier to grasp SharePoint&amp;rsquo;s programming interfaces when you understand that they are designed to facilitate scalability.&amp;nbsp; For example, the &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537564.aspx"&gt;SharePoint 2010 Managed Client Object Model&lt;/a&gt;, while very similar in abstractions to the SharePoint server object model, is more complex because it allows you to explicitly control when you retrieve data or content from the server.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Solution Design -&lt;/b&gt; Scalability influences how you design a solution built on SharePoint.&amp;nbsp; You need to avoid designs that cause unnecessary computation or querying activity on the server.&amp;nbsp; You need to write applications that do not consume more resources than they should.&amp;nbsp; For instance, this means appropriately using &lt;a class="eric-link" href="#CollabAML"&gt;Collaborative Application Markup Language (CAML)&lt;/a&gt; and &lt;a class="eric-link" href="#LINQtoSharePoint"&gt;LINQ to SharePoint&lt;/a&gt; to query for list items.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Best Practices -&lt;/b&gt; Scalability is behind certain programming approaches and issues that are &amp;lsquo;best practices&amp;rsquo; of SharePoint development.&amp;nbsp; For example, certain objects in the SharePoint Object Model have unmanaged data associated with them, so you need to understand and follow the rules around object disposal.&amp;nbsp; Similarly, there are several best practices to keep in mind when working with large lists in SharePoint.&amp;nbsp; If you don&amp;rsquo;t follow those rules, you can negatively impact the farm.&amp;nbsp; See &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee705809.aspx"&gt;Best Practices with SharePoint Server&lt;/a&gt; for more information.&amp;nbsp; See also &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/aa973248.aspx"&gt;Best Practices: Using Disposable Windows SharePoint Services Objects&lt;/a&gt; and &lt;a class="eric-link" href="http://blogs.msdn.com/b/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx"&gt;Dispose Patterns by Example&lt;/a&gt;. You can &lt;a class="eric-link" href="http://blogs.msdn.com/b/rogerla/archive/2009/01/29/automate-sharepoint-dispose-code-reviews-with-spdisposecheck.aspx"&gt;Automate SharePoint Dispose() code reviews with SPDisposeCheck&lt;/a&gt;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;These are issues that are identical or similar to the issues that developers face who are building highly scalable web applications.&amp;nbsp; I heard a story about a SharePoint developer who wrote code to iterate over all documents in his site collections at regular intervals and assemble information to be presented in a tree control.&amp;nbsp; This worked fine in his test environment, but the code design presented a performance problem with real-world quantities of documents and list items.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Scalability affects solution design in two distinct ways.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Building distributable applications - Build solutions that will work properly when deployed on multiple web front ends (WFE).&amp;nbsp; For example, you could build a little Create/Retrieve/Update/Delete (CRUD) web service for &lt;a class="eric-link" href="#BCS"&gt;Business Connectivity Services (BCS)&lt;/a&gt; that stores data in a local XML file, but that would not work when deployed on a load-balancing farm.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Building applications that perform well &amp;ndash; For example, unless you know for certain that a list will contain few enough list items, don&amp;rsquo;t iterate over them using the object model; use LINQ to SharePoint instead, and give SharePoint a chance to optimize.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;For more information about how SharePoint is similar to and different from ASP.NET development, see &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee534978.aspx"&gt;Glide Path for the ASP.NET Developer&lt;/a&gt;.&amp;nbsp; See also &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff829215.aspx"&gt;SharePoint 2010 Development for ASP.NET Developers&lt;/a&gt;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556427.aspx"&gt;Best Practices with ASP.NET Developers&lt;/a&gt; contains guidance that will help you avoid pitfalls that can adversely impact performance, including guidance around object disposal, event receivers, large folders and lists, and code performance optimization.&lt;/p&gt;
&lt;h2 id="VsDatabase"&gt;&lt;a class="eric-link" name="vsDatabaseApplicationDevelopment"&gt;&lt;/a&gt;SharePoint Development vs. Database Application Development&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Database application development is one of the good vantage points for viewing SharePoint development.&amp;nbsp; Custom lists in a SharePoint site have much in common with database tables.&amp;nbsp; You can define columns in lists, with rich metadata about those columns.&amp;nbsp; Further, SharePoint lists can effectively have &amp;lsquo;foreign keys&amp;rsquo; defined, so that you can model more interesting scenarios that contain related data.&amp;nbsp; SharePoint provides cascade and restrict behavior for delete operations.&amp;nbsp; You can create these lists programmatically or declaratively, or you can write programs that work with lists that users have defined.&amp;nbsp; These lists can be visible or hidden.&amp;nbsp; You can use the security features of SharePoint to restrict access.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One aspect of SharePoint that is a direct parallel to SQL databases is that you use a non-procedural declarative query language to retrieve data.&amp;nbsp;&amp;nbsp; However, instead of using SQL, you use LINQ to SharePoint or CAML, which you write using XML.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint&amp;rsquo;s integration with database technology is deep.&amp;nbsp; You can use BCS to consume databases, web services, and just about any data source.&amp;nbsp; These data sources are represented as an External Content Type (ECT).&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;An interesting characteristic of the data capabilities of SharePoint is that it doesn&amp;rsquo;t have transactional guarantees.&amp;nbsp; You can&amp;rsquo;t, for instance, insert a list item in one table, and update a list item in another table, and be guaranteed that neither or both will take place.&amp;nbsp; SharePoint is not intended for use as a platform to implement transactional systems.&amp;nbsp; Instead, such transactional systems should be implemented in external databases that can provide the appropriate guarantees.&amp;nbsp; That data can then be brought into SharePoint using &lt;a class="eric-link" href="#BCS"&gt;BCS&lt;/a&gt;.&amp;nbsp; As you design your SharePoint application, you must take this characteristic into account.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A notable difference between the data capabilities of SharePoint and traditional database development is that SharePoint lists (comparable to database tables) are not necessarily rectangular.&amp;nbsp; In SharePoint, a content type defines the fields that comprise a list item (comparable to a row) in a list.&amp;nbsp; This can be thought of as the schema for a list item.&amp;nbsp; A SharePoint list can contain list items of more than one content type.&amp;nbsp; The following figure depicts a SharePoint list that contains items of two content types: LABOR, and MATERIAL.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/6622.Fig02.png" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This impacts how you design and develop applications that consume list items and the fields in list items.&amp;nbsp; If you require rectangular data, you can define lists such that they can contain only one content type.&amp;nbsp; If you allow non-rectangular data, when you iterate through list items, as necessary, you need to check for the content type and alter the behavior of your code accordingly.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Another interesting characteristic &amp;ndash; due to internal implementation details (not least of which is the point made in the previous paragraph), querying SharePoint using LINQ to SharePoint or CAML is quite a bit slower than querying tables using SQL.&amp;nbsp; You do not want to create a design where some list unintentionally grows to 50,000 or 100,000 items, and the user is free to attempt to bring the list up in a window in a browser.&amp;nbsp; SharePoint 2010 contains throttling features that prevent such designs from taking down the farm, but the experience to the user would be random and undesirable.&amp;nbsp; There are ways to handle lists with huge numbers of items.&amp;nbsp; You have to handle this issue intentionally.&amp;nbsp; For more information, see &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee557257.aspx"&gt;Handling Large Folders and Lists&lt;/a&gt;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint is built upon SQL Server.&amp;nbsp; Document libraries and SharePoint lists are stored in a database.&amp;nbsp; You see this whenever you see architectural diagrams of a SharePoint installation.&amp;nbsp; The actual SharePoint database isn&amp;rsquo;t particularly relevant to you as a SharePoint developer &amp;ndash; you never directly access this database.&amp;nbsp; You always use the programming interfaces to alter sites, lists, and document libraries.&amp;nbsp; However, you can use that same SQL Server installation to host a database that you consume directly or via BCS, so it can be a part of the infrastructure that you use to build a SharePoint application.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access Services allows you, with limitations, to publish Access databases to a SharePoint site.&amp;nbsp; This opens up interesting possibilities for allowing SharePoint users to share data in a convenient form.&lt;/p&gt;
&lt;h3&gt;Client-Side Data Access Technologies&lt;/h3&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can programmatically access SharePoint data from client computers.&amp;nbsp; When accessing data from client computers, SharePoint uses networking technologies to send the request to SharePoint Foundation or SharePoint Server and to retrieve the results of the request from SharePoint.&lt;/p&gt;
&lt;table style="border: currentColor; border-collapse: collapse;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; padding-top: 0in; border: windowtext 1pt solid;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#BcsClientSideApi"&gt;Client-Side BCS Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables online and offline access to data in ECTs.&amp;nbsp; You can access this object model from a Microsoft Office Word, Excel, or PowerPoint managed add-in.&amp;nbsp; This is sometimes the most powerful and convenient way to access data that is external to SharePoint in an application.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WebServices"&gt;Custom WCF Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables high-performance designs where you host custom WCF services on the SharePoint server.&amp;nbsp; The WCF service can access data and documents through the server object model, and allow the client to access the data and documents through the service that you implement.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelServicesECMAScriptInterface"&gt;Excel Services ECMAScript / JavaScript Browser Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables you to customize, automate, and drive the Excel Web Access Web Part control on a page&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelServicesRESTAPI"&gt;Excel Services REST API&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables you to access workbook parts or elements directly through a URL.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelWebServices"&gt;Excel Services Web Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables applications to calculate, set, and extract values from workbooks, and to refresh external data connections.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ECMAScriptClientObjectModel"&gt;ECMAScript / JavaScript Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables JavaScript / ECMAScript programs to access SharePoint data.&amp;nbsp; This programming interface is a variant of the &lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;Managed Client Object Model&lt;/a&gt;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enables .NET applications (including stand-alone applications, Silverlight applications, and ASP .NET applications) to access SharePoint data.&amp;nbsp; This framework is similar to the server object model, with additional semantics that allow you to control network traffic to and from the server.&amp;nbsp; It is important to know and use CAML when using the client object model.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ODataRestApi"&gt;REST / OData Data Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Provides a RESTful programming interface to lists, list items, and more.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SharePointWebServices"&gt;SharePoint Web Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Provides Web service methods that you can use to work remotely with a deployment of SharePoint Foundation.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WebDAV"&gt;Web-based Distributed Authoring and Versioning (WebDAV)&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Consists of a set of methods, headers, and content-types that augment HTTP/1.1 to allow for the creation and management of resource collections.&amp;nbsp; SharePoint support for WebDAV allows you to upload and download documents.&amp;nbsp; WebDAV (&lt;a class="eric-link" href="http://tools.ietf.org/html/rfc4918"&gt;RFC 4918&lt;/a&gt;) is a working document of the Internet Engineering Task Force (IETF).&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Server-Side Data Access Technologies&lt;/h3&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When writing code that runs directly on the server, regardless of whether you are building a sandboxed solution or farm solution, you can specify your data queries in either CAML or using LINQ to SharePoint.&amp;nbsp; CAML returns weakly-typed &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.aspx"&gt;SPListItem&lt;/a&gt; objects, whereas LINQ to SharePoint returns strongly typed objects that are defined in generated code.&lt;/p&gt;
&lt;table style="border: currentColor; border-collapse: collapse;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; padding-top: 0in; border: windowtext 1pt solid;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#CollabAML"&gt;CAML&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;XML based non-procedural query language.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#LINQtoSharePoint"&gt;LINQ to SharePoint&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Language-Integrated Query&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In addition to using CAML or LINQ to SharePoint to query for a set of items, you can use the server object model to directly iterate through items in a list or library.&amp;nbsp; However, you should not do this unless you need to process all items in the list, and you know how many items are in the list. &amp;nbsp;I often design applications to be data driven.&amp;nbsp; I will design a list to contain some specific data that drives behavior.&amp;nbsp; My design might be such that I always know that there are a certain number of records, and that I need to process all records in order to drive my application behavior.&amp;nbsp; In this case, I would iterate directly through the items without querying using CAML or LINQ to SharePoint.&amp;nbsp; Note that this same approach does not work when using the Managed Client Object Model.&amp;nbsp; With the Managed Client Object Model, you must supply a CAML query when retrieving a collection of list items.&lt;/p&gt;
&lt;h2 id="VsTraditional"&gt;SharePoint Development compared to Traditional Rich Client Development&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In a &lt;a class="eric-link" href="http://www.informationweek.com/news/windows/microsoft_news/showArticle.jhtml?articleID=220700428"&gt;keynote speech&lt;/a&gt;, Steve Ballmer, CEO of Microsoft Corporation, called SharePoint Server &amp;lsquo;an operating system for the enterprise.&amp;rsquo;&amp;nbsp; SharePoint has much in common with an operating system:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SharePoint has storage.&amp;nbsp; Document libraries that contain hierarchies of folders are remarkably similar to files in directories in a file system.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SharePoint has a programmable user interface.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;As with an operating system, you can write code that runs at varying levels of privilege.&amp;nbsp; With SharePoint development, you can write code that needs to run with farm administrator privileges.&amp;nbsp; You can write code that runs in a sandboxed solution, and you can write ECMAScript / JavaScript that runs in the client browser.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;As with an operating system, you can write services, which provide necessary infrastructure for building SharePoint applications with complex dynamics.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Scale, once again, is the biggest difference.&amp;nbsp; Scale drives the programmability characteristics of SharePoint.&amp;nbsp; You can write software that runs with great performance across hundreds of servers, providing an entire enterprise with a consistent experience that increases collaboration and productivity. &amp;nbsp;Dealing with the issues of scalability is the price of admittance when moving from traditional application development to SharePoint development.&lt;/p&gt;
&lt;h1 id="LanguagesAndPlatforms"&gt;Languages and Platforms&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One question that is at the top of all new SharePoint developer&amp;rsquo;s minds is the following: &lt;i&gt;just how much do I need to learn?&lt;/i&gt;&amp;nbsp; It is interesting to list out the languages and platforms that you need to know when doing SharePoint development.&amp;nbsp; The first item in the list below is the most important.&amp;nbsp; Beyond that, it depends on what you&amp;rsquo;re doing.&amp;nbsp; It is not necessary to master every technology in the following list.&amp;nbsp; You need to learn only what is applicable to your current task.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;C# / VB.NET / .NET Framework &amp;ndash; You use the .NET platform in one form or another when building full-trust farm applications, sandboxed site-collection level solutions, or within a Silverlight application.&amp;nbsp; You will be a more effective developer if you understand the various LINQ technologies: LINQ to XML, LINQ to Entities, LINQ to SharePoint, and LINQ to SQL.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ASP.NET &amp;ndash; SharePoint is an ASP.NET application hosted in IIS.&amp;nbsp; It makes use of master pages and application pages, which allow you to standardize page look and feel.&amp;nbsp; It also makes use of Web Part pages and Web parts, which allow users to configure their own pages. &amp;nbsp;Web parts can be connected to each other so that you can create parent/child data editing capabilities or web mashup applications.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;HTML/CSS &amp;ndash; There are a number of places in SharePoint development where it is helpful to be able to write and understand HTML and CSS.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ECMAScript / JavaScript and the HTML Document Object Model (DOM) &amp;ndash; ECMAScript / JavaScript is a powerful tool in your tool-chest.&amp;nbsp; You can use the &lt;a class="eric-link" href="#ECMAScriptClientObjectModel"&gt;ECMAScript / JavaScript client object model&lt;/a&gt; or the &lt;a class="eric-link" href="#ODataRestApi"&gt;OData REST API&lt;/a&gt; from ECMAScript / JavaScript to get at data and documents in your sites.&amp;nbsp; JQuery and AJAX allow you to add rich interactivity.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Silverlight/XAML &amp;ndash; Silverlight is a development platform for creating engaging, interactive applications for many screens across the Web, desktop, and mobile devices.&amp;nbsp; You can use the managed client object model from within the Silverlight code to read and write site data and documents.&amp;nbsp; Expression Blend is an effective tool for designing Silverlight Web parts for SharePoint.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;XML &amp;ndash; You need to know how to code a valid XML document.&amp;nbsp; Regarding developing with XML, my personal recommendation is to learn and master LINQ to XML.&amp;nbsp; It is a more effective way of working with XML.&amp;nbsp; Knowing XSLT can be useful &amp;ndash; you can manually write custom XSLT list views, although the primary purpose of XSLT list views is to allow you to apply interesting formatting to a list using SharePoint Designer.&amp;nbsp; In other words, XSLT is more often used as the output of tooling rather than as a commonly used developer tool.&lt;/p&gt;
&lt;h1 id="SharePointApplicationDevelopmentTerms"&gt;SharePoint Application Development Terms&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To make it easier to talk about SharePoint application development, I&amp;rsquo;m going to define four terms (taken from the SharePoint marketing sites).&amp;nbsp; I&amp;rsquo;m defining them here so that I can discuss them more easily through the remainder of the article.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;b&gt;SharePoint application &amp;ndash;&lt;/b&gt; A SharePoint application consists of a number of customizations that taken together fills a particular market or customer need. &amp;nbsp;An application consists of some combination of custom Web parts, workflows, event handlers, content types, pre-defined lists, or any of the other technologies that you use to enhance SharePoint functionality.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;b&gt;SharePoint capabilities &amp;ndash;&lt;/b&gt; SharePoint capabilities are the key areas of SharePoint functionality.&amp;nbsp; Developers build on these areas of functionality to put together a solution where the whole is more than the sum of the parts.&amp;nbsp; These capabilities are in the areas of &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/sites/"&gt;Sites&lt;/a&gt;, &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/communities/"&gt;Communities&lt;/a&gt;, &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/composites/"&gt;Composites&lt;/a&gt;, &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/content/"&gt;Content&lt;/a&gt;, &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/insights/"&gt;Insights&lt;/a&gt;, and &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/search/"&gt;Search&lt;/a&gt;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;b&gt;SharePoint developer scenarios &amp;ndash; &lt;/b&gt;These are activities that a developer wants to enable for SharePoint users.&amp;nbsp; For example, a developer may want to allow the user to generate several hundred Word documents based on data stored in a SharePoint list, generate PDF or XPS files from those documents, and to print them or send them by email.&amp;nbsp; To accomplish this scenario, you will use a number of developer building blocks.&amp;nbsp; One possible implementation would be to use the Open XML SDK in a Web Part that is implemented as a sandboxed solution, then use SharePoint 2010 Word Services to convert from DOCX to PDF.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;b&gt;SharePoint developer building blocks &amp;ndash;&lt;/b&gt; These are the technologies in SharePoint that you use to do your development.&amp;nbsp; Examples are Web parts, workflows, event handlers, data, and services.&amp;nbsp; When you build an application, you develop using the building blocks so that the parts all work together.&lt;/p&gt;
&lt;h2 id="VarietiesOfSharePointApplications"&gt;Varieties of SharePoint Applications&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;What are the varieties of applications that SharePoint developers build?&amp;nbsp; This is similar to asking the question about the varieties of applications that you can build on an operating system.&amp;nbsp; Developers are creating new uses for SharePoint that cover a wide range of scenarios.&amp;nbsp; Here are a few varieties of applications.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Vertical Markets &amp;ndash;&lt;/b&gt; Vendors customize SharePoint for a variety of markets such as real-estate management, resort and entertainment management, or equipment rental.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Customized team applications &amp;ndash;&lt;/b&gt; Sometimes a custom application can help a department of a large organization meet their goals in a more organized and visible manner.&amp;nbsp; A testing organization could build a system to maintain a library of testing instruments and resources.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Content Publishing Systems &amp;ndash;&lt;/b&gt; These systems can be as simple as a site or site collection that is maintained by a single author.&amp;nbsp; They can be as complex as a technical document generation system used by hundreds of writers, developers, and managers.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Accounting Systems &amp;ndash;&lt;/b&gt; While Microsoft does not recommend that transactional systems be implemented in SharePoint, bringing data into SharePoint from external accounting systems significantly augments the user experience.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Management Information Systems &amp;ndash;&lt;/b&gt; Some automated management systems do not have the same transactional requirements as accounting systems.&amp;nbsp; You can maintain lists of customers, products, assets, and resources using SharePoint out-of-the-box, and when extended programmatically, you can provide as sophisticated of an experience as you want.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Sales and Marketing &amp;ndash;&lt;/b&gt; Many aspects of market and sales systems resemble management information systems.&amp;nbsp; Integration of SharePoint with CRM systems such as Microsoft Dynamics results in powerful hybrid applications.&amp;nbsp; In addition, mobile access to SharePoint sites provides road warriors with tools to interact with data necessary to do their job.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Project management &amp;ndash;&lt;/b&gt; The integration of Microsoft Project Server 2010 with SharePoint Server Enterprise provides project and portfolio management to help organizations prioritize investments, align resources and execute projects.&amp;nbsp; You can develop for Project Server using its API.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;While many examples of SharePoint applications fit into one of these categories, this list is certainly not complete.&amp;nbsp; I&amp;rsquo;m certain that someone somewhere has written a game that runs on SharePoint that takes advantage of the collaboration features.&amp;nbsp; I also would guess that someone has built a system that controls computer automated manufacturing systems using SharePoint lists, event handlers, etc.&amp;nbsp; Vendors serving other vertical markets such as computer aided design or architecture will invent their own variety of enhancements of SharePoint.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint is a general purpose platform.&amp;nbsp; The types of applications that you can build are nearly as varied as the types of applications that you can build for the Windows operating system.&lt;/p&gt;
&lt;h2 id="SharePointCapabilities"&gt;SharePoint Capabilities&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can find a lot of information about SharePoint capabilities from the &lt;a class="eric-link" href="http://sharepoint.microsoft.com/en-us/product/capabilities/Pages/default.aspx"&gt;Microsoft SharePoint 2010 Product Overview&lt;/a&gt;.&amp;nbsp; The capabilities include the following:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Sites &amp;ndash; &lt;/b&gt;You can develop and manage all of your business web sites using SharePoint 2010. &amp;nbsp;SharePoint 2010 provides a full set of tools that users can use to create any kind of site.&amp;nbsp; SharePoint provides infrastructure that simplifies site management.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Communities &amp;ndash;&lt;/b&gt; SharePoint 2010 provides collaboration tools that anyone can use to share ideas, find people and expertise, and locate business information.&amp;nbsp; SharePoint as delivered has many collaboration capabilities, but extending SharePoint in interesting ways can make collaboration proactive instead of reactive.&amp;nbsp; Integrating presence into SharePoint applications using Office Communications Server (OCS) makes it easier for colleagues to contact each other.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Content &amp;ndash;&lt;/b&gt; Publishing organizations come in a vast variety of forms &amp;ndash; from international press organizations to a small department that is responsible for publishing documentation for a product.&amp;nbsp; Organizations can use SharePoint 2010 to manage content and use Word 2010 to edit content.&amp;nbsp; I further divide the content capabilities into the following three sub-categories.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Publishing Systems &amp;ndash; &lt;/b&gt;You can use SharePoint Server 2010 to manage a comprehensive publishing system.&amp;nbsp; You may deliver the final product in PDF, XPS, or some other form.&amp;nbsp; Open XML is an especially powerful technology that you can use to build publishing systems.&amp;nbsp; You may need to write a sophisticated transformation from &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2008/10/20/eric-white-s-blog-s-table-of-contents.aspx#Open_XML_to_XHtml"&gt;Open XML to other forms such as XHtml&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Web content management &amp;ndash;&lt;/b&gt; Whether using SharePoint for Internet Services to build externally facing web sites, or using SharePoint for building wikis and pages inside the firewall, SharePoint allows users to build out rich content with a minimum of effort.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Enterprise content management &amp;ndash;&lt;/b&gt; Many organizations have a vast amount of &amp;lsquo;organizational experience&amp;rsquo;, often in the form of documents that are managed with revisions, approval processes, and metadata.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Search &amp;ndash;&lt;/b&gt; Customizing the search experience can be a core component of making the information come alive for your users.&amp;nbsp; You can customize to allow SharePoint&amp;rsquo;s search engine to search through custom documents.&amp;nbsp; You can customize search to allow it to search through ECTs.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Insights &amp;ndash;&lt;/b&gt; A recent survey asked CEOs of very large companies which issues were &amp;lsquo;top-of-mind&amp;rsquo; for them.&amp;nbsp; BI was mentioned most often as the top priority.&amp;nbsp; Excel Services and the ability to build dashboards are important for building powerful, flexible BI systems.&amp;nbsp; PerformancePoint services for SharePoint provide another option to deliver customizable BI dashboards.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Composites &amp;ndash;&lt;/b&gt; Create innovative solutions that combine customer user interfaces, data access, business logic, and services.&amp;nbsp; You can document and standardize business processes using workflows.&lt;/p&gt;
&lt;h2 id="SharePointDeveloperScenarios"&gt;SharePoint Developer Scenarios&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Many developers identify and document developer scenarios while designing software before writing functional specifications.&amp;nbsp; Sometimes this process consists of the construction of &amp;lsquo;story boards&amp;rsquo; that show how the user moves from point A to point B to accomplish a specific task.&amp;nbsp; Sometimes you may do formal use-case analysis.&amp;nbsp; You may even mock up a scenario using PowerPoint or a modeling tool.&amp;nbsp; In most development organizations, you write a formal specification that outlines and details the scenario.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are even more varieties of scenarios than there are varieties of applications.&amp;nbsp; However, there are a few general types of scenarios.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Scenarios that provide better user interfaces to existing SharePoint data.&amp;nbsp; For instance, you may want to display calculated values that are based on data in several SharePoint lists.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Scenarios that involve pulling in external data from external systems.&amp;nbsp; You may be connecting to a modern ERP or CRM system, or you may be connecting to a proprietary database that is implemented on UNIX using an emulator of ancient hardware architecture.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Scenarios around document generation.&amp;nbsp; You may generate hundreds or thousands of Open XML document based on data stored in SharePoint lists or external systems, then convert to PDF, etc.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Scenarios around process and procedure.&amp;nbsp; Scenarios can be as simple as a document approval process, or can be as involved as shepherding a RFP through generating a proposal to signing of a contract.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You implement each developer scenario by using one or more SharePoint developer building blocks.&amp;nbsp; Of course, as systems designers, you must determine your own scenarios.&amp;nbsp; Then, your task is to be familiar with the available building blocks that you can use to implement your scenario.&amp;nbsp; In many cases, you have more than one option; each option has different characteristics, and one option might suit more than another for a particular scenario.&amp;nbsp; To a large extent, you probably already know the direction you need to take.&amp;nbsp; A high-end marketing and design site or a luxury goods web site may from the outset plan to use Silverlight wherever necessary, whereas a part-time developer for a team site might be interested in whatever will get the job done in the fastest and easiest way.&lt;/p&gt;
&lt;h1 id="SharePointDeveloperBuildingBlocks"&gt;SharePoint Developer Building Blocks&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;At this point, I&amp;rsquo;ve discussed what a SharePoint application is.&amp;nbsp; I&amp;rsquo;ve also identified the several SharePoint capabilities that people find so valuable.&amp;nbsp; I&amp;rsquo;ve discussed developer scenarios, and provided a few examples of types of scenarios.&amp;nbsp; Next, I&amp;rsquo;ll cover the SharePoint developer building blocks.&amp;nbsp; What do you, as a developer, actually develop when building a SharePoint application?&lt;/p&gt;
&lt;h2&gt;Important Building Blocks&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;While the following table is presented in alphabetical order, not all building blocks have the same importance to you.&amp;nbsp; This section lists a few of the building blocks deserve to be called out separately.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;First and foremost, you need to learn about the &lt;a class="eric-link" href="#ServerObjectModel"&gt;server object model&lt;/a&gt;.&amp;nbsp; You will use this programming interface when you are building Web parts, workflows that incorporate custom actions, event receivers, and more.&amp;nbsp; Further, the managed client object model is based on the server object model.&amp;nbsp; Much of what you learn about the server object model applies to the client-side object model.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a class="eric-link" href="#WebParts"&gt;&lt;span style="background: white;"&gt;Web parts&lt;/span&gt;&lt;/a&gt; are the most common way to extend SharePoint.&amp;nbsp; Learning how to build a Web Part is a great way to started in SharePoint development.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a class="eric-link" href="#WorkFlow"&gt;Workflows&lt;/a&gt; enable you to codify and standardize business processes, and are one of the essential tools for implementing certain scenarios.&amp;nbsp; If you extend workflows using code, you use the &lt;a class="eric-link" href="#ServerObjectModel"&gt;server object model&lt;/a&gt;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a class="eric-link" href="#BCS"&gt;BCS&lt;/a&gt; makes data from outside SharePoint available to your SharePoint application.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Understanding &lt;a class="eric-link" href="#CollabAML"&gt;CAML&lt;/a&gt; and &lt;a class="eric-link" href="#LINQtoSharePoint"&gt;LINQ to SharePoint&lt;/a&gt; are key to building good SharePoint applications.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;To you as a developer, in addition to being end-user features of SharePoint Foundation, &lt;a class="eric-link" href="#DocumentLibraries"&gt;document libraries&lt;/a&gt; and &lt;a class="eric-link" href="#Lists"&gt;lists&lt;/a&gt; are programming resources.&amp;nbsp; Often, when designing a software system, you need to store configuration information that drives behavior of the application.&amp;nbsp; You can store such information in hidden lists, and restrict access to users as necessary.&amp;nbsp; This is most appropriate when you need to enable non-developers to maintain the application configuration.&amp;nbsp; Another approach is to place configuration XML files in a hidden, access restricted document library.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The following table lists the SharePoint developer building blocks that you can use to build a SharePoint application.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Figure 2 &amp;ndash; SharePoint 2010 Developer Building Blocks&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;b&gt;&lt;span style="color: #4f81bd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style="border: currentColor; border-collapse: collapse;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr style="page-break-inside: avoid; height: 148.45pt;"&gt;
&lt;td style="padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 148.45pt; padding-top: 0in; border: windowtext 1pt solid;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Building Block&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 148.45pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Description&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 148.45pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-top: 0in; margin-right: 5.65pt; margin-bottom: .0001pt; margin-left: 5.65pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/6232.SharePointFoundationVert.png" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 148.45pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-top: 0in; margin-right: 5.65pt; margin-bottom: .0001pt; margin-left: 5.65pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/7367.SharePointServerStandardVert.png" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 148.45pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-top: 0in; margin-right: 5.65pt; margin-bottom: .0001pt; margin-left: 5.65pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;img border="0" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/5164.SharePointServerEnterpriseVert.png" /&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#AccessServices"&gt;Access Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Publish Access databases to SharePoint&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: white; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Administration"&gt;Administration&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Programmatically administer SharePoint Foundation and Server&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Alerts"&gt;Alerts&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Send email or SMS&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 4.45pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 4.45pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#AspxPages"&gt;ASPX Pages&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 4.45pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Build Web pages with .NET code-behind&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 4.45pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 4.45pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 4.45pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 13pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#BCS"&gt;BCS&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Bring external data into SharePoint&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 13pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#BcsClientSideApi"&gt;BCS Client-Side API&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access BCS data from client computers&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 13pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#CollabAML"&gt;CAML&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Declarative query language expressed as XML&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ColumnAndFieldTypes"&gt;Column, Field Types&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Define domain definitions for data in lists and libraries.&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ContentTypes"&gt;Content Types&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Define prototypes for list items.&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#CustomActions"&gt;Custom Action&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Create links, toolbar buttons, menu items&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#CustomViews"&gt;Custom Views&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Define view for lists and document libraries&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Dashboards"&gt;Dashboards and KPIs&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Web part for reports, charts, and KPIs&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#DocumentLibraries"&gt;Document Libraries&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Storage for documents or files of any type&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#DocumentMetadata"&gt;Document Metadata&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Sophisticated document categorization&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ECMAScriptClientObjectModel"&gt;ECMAScript Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access SharePoint data from ECMAScript / JavaScript&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#EventReceivers"&gt;Event Receivers&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Provide behavior when SharePoint lists or libraries are updated&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelServices"&gt;Excel Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Load, calculate, and display Excel workbooks&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelServicesECMAScriptInterface"&gt;Excel Services ECMAScript Interface&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access the Excel Web Access Web Part control from ECMAScript&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelServicesRESTAPI"&gt;Excel Services REST API&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access workbook parts or elements directly through a URL&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelUDF"&gt;Excel Services User Defined Functions (UDF)&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Write high-performance functions for use in server-side spreadsheets&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ExcelWebServices"&gt;Excel Web Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access Excel Services programmatically using Web services&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Features"&gt;Features&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Unit of deployment&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#HealthRules"&gt;Health Rules&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Codify how you monitor health in a large installation&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#InfoPathFormsServices"&gt;InfoPath Forms Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Make forms to be filled out in a browser&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#LINQtoSharePoint"&gt;LINQ to SharePoint&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Use LINQ to query SharePoint lists and document libraries&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Lists"&gt;Lists&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;User editable storage of data&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 4.9pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 4.9pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 4.9pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access SharePoint data from client computers&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 4.9pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 4.9pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 4.9pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#MobilePagesControlsandAdaptors"&gt;Mobile Pages, Controls, and Adaptors&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Brings SharePoint data to phones&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ODataRestApi"&gt;OData REST APIs&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Provides REST access to SharePoint data using the OData proposed standard.&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 8.5pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 8.5pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#OfficeClientManagedAddIns"&gt;Office Client Managed Add-Ins&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 8.5pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enhance Office clients to use SharePoint data and documents&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 8.5pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 8.5pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 8.5pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#OpenXMLSDK"&gt;Open XML SDK&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Use Open XML for document generation and transformation&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#PerformancePointServices"&gt;Performance Point Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Build dashboards, scorecards, reports, and key performance indicators (KPIs)&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#PowerPivot"&gt;PowerPivot&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Create business intelligence solutions&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SandboxedSolutions"&gt;Sandboxed Solutions&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The Sandbox infrastructure isolates and shuts down bad code, preventing it from taking down the farm&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SearchCustomization"&gt;Search Customization&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Enable search through varied content, including ECTs.&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 7.6pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 7.6pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SecureStoreService"&gt;Secure Store Service&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 7.6pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Securely access legacy systems&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 7.6pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 7.6pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 7.6pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Security"&gt;Security&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Ensure that sensitive information is available only to authorized users&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ServerObjectModel"&gt;Server Object Model&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Server-side .NET API for accessing data and content&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Ribbon"&gt;Server Ribbon&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Customize the SharePoint ribbon&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#ServiceApplicationArchitecture"&gt;Service Application Architecture&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Create shared services that can be consumed by multiple SharePoint applications&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SharePointDialogFramework"&gt;SharePoint Dialog Framework&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;JavaScript programming interface for putting up dialog boxes and other client-side user interface elements&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SharePointThemes"&gt;SharePoint Themes&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Apply custom branding to a SharePoint site or site collection&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SharePointWebServices"&gt;SharePoint Web Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Access SharePoint data through Web services&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SilverlightWebPart"&gt;Silverlight Web Part&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Create user interfaces that are better looking and easier to use&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SiteDefinitions"&gt;Site Definition&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Create, configure, and provision SharePoint sites&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#SitePages"&gt;Site Pages&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;User customizable pages that conserve resources&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#TimerJobs"&gt;Timer Jobs&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Execute code at specific times or intervals&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#Variations"&gt;Variations&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Tailor sites for different cultures, markets, and languages&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#VisioServices"&gt;Visio Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Share and view Microsoft Visio drawings&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#VisualStudioSharePointToolsExt"&gt;Visual Studio SharePoint Tools Extensibility&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Extend Visual Studio to enable developers to create custom solutions more quickly&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.55pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.55pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WebDAV"&gt;WebDAV&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.55pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Upload and download files efficiently&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.55pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.55pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.55pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WebParts"&gt;Web Parts&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Web parts and Web part pages enable users to customize their user interface.&amp;nbsp; Building Web parts is the most common way to extend SharePoint.&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 16.15pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WebServices"&gt;Web Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Key component of building scalable, distributed, and loosely coupled SharePoint applications.&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 16.15pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WindowsIdentityFoundation"&gt;Windows Identity Foundation&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Provides claims-based identity services based on trusted providers&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 16.15pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 6.25pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 6.25pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WordAutomationServices"&gt;Word Automation Services&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 6.25pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Provides services to convert documents to and from various file formats&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 6.25pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 6.25pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 6.25pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="page-break-inside: avoid; height: 3.2pt;"&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="#WorkFlow"&gt;Workflows&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Automate business processes using tasks and forms&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; padding-right: 5.4pt; background: #4f81bd; height: 3.2pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="AccessServices"&gt;Access Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can use Access Services in Microsoft SharePoint Server 2010 to edit, update, and create linked Microsoft Access 2010 databases by using an Internet browser or the Access client.&amp;nbsp; You can use SQL Server Reporting Services to produce formatted reports.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://channel9.msdn.com/shows/Access/Microsoft-Access-2010-Demo/"&gt;The Access Show: Access 2010 demo of Access Services and web databases&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://technet.microsoft.com/en-us/library/ee692394.aspx"&gt;Access Services administration&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://technet.microsoft.com/en-us/library/ee662542.aspx"&gt;Using Access Services with SQL Reporting Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Administration"&gt;Administration&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The classes of the &lt;b&gt;Microsoft.SharePoint.Administration&lt;/b&gt; namespace provide developers with tools for programmatically deploying, migrating, maintaining, and administering their SharePoint sites and SharePoint-based solutions.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms475931.aspx"&gt;SharePoint Foundation Administration&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration(v=office.12).aspx"&gt;Microsoft.SharePoint.Administration Namespace&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/cc768558.aspx"&gt;The Administrative Object Model of Microsoft SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Alerts"&gt;Alerts&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Alerts provide a framework for automatically sending email or SMS notifications to SharePoint users.&amp;nbsp; Alerts can be attached to lists or list items.&amp;nbsp; Microsoft SharePoint Foundation provides a library of alert templates for common scenarios.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee535707.aspx"&gt;Building Block: Alerts&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/bb897925.aspx"&gt;Alerts in SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/bb802949.aspx"&gt;Alerts Overview&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/bb897864.aspx"&gt;Alert Object Model&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="AspxPages"&gt;ASP.NET Application Pages&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To build a custom user interface with specific application logic (written in C# or VB.NET in code-behind), a developer can use ASP.NET application pages (also called ASPX pages), which are a special variety of ASP.NET pages.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Your ASPX page will need to integrate with an ASP.NET master page.&amp;nbsp; The relationship between master pages and ASPX pages enable you to provide a consistent user interface across SharePoint sites and site collections.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Because they are traditional ASPX pages that can contain code-behind and be precompiled, they offer some performance advantages over Site Pages.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You cannot use application pages to host Web part zones or Web parts.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One characteristic of ASPX pages is that you have a number of options about where you place Silverlight controls.&amp;nbsp; For certain users, you can exclusively provide a Silverlight interface to large parts of the site, yet site maintainers can use SharePoint&amp;rsquo;s user interface.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms443795.aspx"&gt;Master Pages&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms464558.aspx"&gt;Sites and Pages&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/aa979592.aspx"&gt;SharePoint Page Types&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;MSDN: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee231581.aspx"&gt;Creating Application Pages for SharePoint&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee539040.aspx"&gt;Building Block: Pages and User Interface&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms438349.aspx"&gt;Cascading Style Sheets Class Usage in SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="BCS"&gt;Business Connectivity Services (BCS)&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;BCS provides infrastructure so that you can define a few methods (with specific prototypes) and bring data into SharePoint in such a way that users can view and modify that data directly from SharePoint.&amp;nbsp; External tables are called External Content Types (ECTs), and sometimes entities.&amp;nbsp; You can use ECTs as entities (as in entity/relationship theory).&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are three basic BCS mechanisms that you can use to bring external data into SharePoint.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;You can connect to a SQL database.&amp;nbsp; SQL Server is supported out-of-the-box.&amp;nbsp; With a bit of effort, you can connect to Oracle or other varieties of database servers.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;You can consume a Web Service that exposes a set of methods the follow specific patterns for the method prototypes.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;You can write .NET managed code (C# or VB) to connect to any variety of data.&amp;nbsp; There are two ways that you can extend through code:&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;You can write a .NET Assembly Connector to allow users to create ECTs to a set of predefined schemas.&amp;nbsp; The schemas can&amp;rsquo;t change without recompiling and redeploying.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;If you are building upon an underlying system that contains its own schema mechanism and definitions, you can write a Custom Connector that uses the underlying schema definition and allows users to create ECTs for any table in the underlying schema.&amp;nbsp; This is, of course, more work than writing a .NET Assembly Connector.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;External lists and external data columns are part of built-in user interface functionality that allows you to show and maintain data in ECTs.&amp;nbsp; You can create external lists either using the Web interface, SharePoint Designer, or Visual Studio 2010.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can expose your ECTs to the search engine, so that users can find data in them. By default you display data in a profile page.&amp;nbsp; You can customize the page, or customize what happens when a user clicks on an item in the search results.&amp;nbsp; For example, you could use a non-SharePoint website to display and maintain the item.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee557898.aspx"&gt;Business Connectivity Services Overview&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556826.aspx"&gt;Microsoft Business Connectivity Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee557949.aspx"&gt;Business Connectivity Services: How-tos and Walkthroughs&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee554911.aspx"&gt;Differences Between Using the .NET Assembly Connector and Writing a Custom Connector&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee558778.aspx"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;How to: &lt;/span&gt;Create External Lists in SharePoint&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee557243.aspx"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;How to: &lt;/span&gt;Create an External Content Type Based on a SQL Server Table&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff464424(office.14).aspx"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;How to: &lt;/span&gt;Connect to an Oracle Database Using Business Connectivity Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;How to: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee559346.aspx"&gt;Create a SharePoint List with External Data Columns&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Visual how-to: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff769953.aspx"&gt;Creating SharePoint 2010 Web Parts That Can Read and Write Data to External Data Sources&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Walkthrough: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee231515.aspx"&gt;Creating an External List in SharePoint by Using Business Data&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513153.aspx"&gt;Accessing External Data with Business Connectivity Services in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/sharepoint/archive/2009/12/03/walkthrough-of-creating-a-sharepoint-2010-external-list-using-visual-studio-2010-beta.aspx?wa=wsignin1.0"&gt;Walkthrough of creating a SharePoint 2010 external list using Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/04/27/searching-external-data-in-sharepoint-2010-using-business-connectivity-services.aspx?wa=wsignin1.0"&gt;Searching External Data in SharePoint 2010 Using Business Connectivity Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="BcsClientSideApi"&gt;Business Connectivity Services Client-Side API&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Using the BCS Client-Side API, you can create applications that have CRUD functionality for an ECT.&amp;nbsp; When building Microsoft Office managed add-ins, a convenient way to present the user interface is via task or action panes.&amp;nbsp; This allows your users to interact with BCS data while continuing to work in their document or spreadsheet.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;BCS Client-Side API provides a means for client applications to access data from BCS.&amp;nbsp; Further, you can configure BCS so that the data can be taken off-line.&amp;nbsp; When the client computer comes online again, changes are synchronized through BCS, using conflict resolution if necessary.&amp;nbsp; BCS Client-Side API is most often used from within an &lt;a class="eric-link" href="#OfficeClientManagedAddIns"&gt;Office 2010 client managed add-in&lt;/a&gt;, although it can be used from any .NET application.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can take the data offline so that your users can continue to review and modify the data in a cache.&amp;nbsp; If an offline user modifies data in such a way that it conflicts with modifications made by another user, you can write code to resolve those conflicts, and present appropriate options to your users.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff394635.aspx"&gt;Creating Advanced Code-Based Solutions Using Business Connectivity Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;How to: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee557917.aspx"&gt;Show External Data in Word Using Content Controls&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/bcs/archive/2010/02/19/overview-of-bcs-advanced-code-based-solutions.aspx"&gt;Overview of BCS Advanced Code-Based Solutions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="CollabAML"&gt;Collaborative Application Markup Language (CAML)&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Collaborative Application Markup Language (CAML) is an XML based query language that allows you to specify filters, sort order, and more.&amp;nbsp; You can specify exactly which fields in each item you want to retrieve.&amp;nbsp; This allows you to control the size of the query results.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;While there are certain circumstances where you can use LINQ to SharePoint instead of CAML for querying, CAML is still relevant in SharePoint 2010.&amp;nbsp; You use CAML when querying using the &lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;managed client object model&lt;/a&gt;.&amp;nbsp; When using the managed client object model, if you filter list items using LINQ instead of CAML, in the underlying system, the filtering happens after all items have been returned.&amp;nbsp; This can result in using more CPU and memory resources on the server than necessary.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms462365.aspx"&gt;Collaborative Application Markup Language Core Schemas&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms426449.aspx"&gt;Introduction to Collaborative Application Markup Language (CAML)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ColumnAndFieldTypes"&gt;Column and Field Types&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Column and field types allow you to define rich metadata for standardized fields and columns in SharePoint lists.&amp;nbsp; You can define a site column (in a site column gallery) of a specific data type that you can use throughout your site.&amp;nbsp; This is similar to defining domains in database schema design.&amp;nbsp; It allows you to ensure that columns in several lists use the same value space.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms446361.aspx"&gt;Custom Field Types&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms196085.aspx"&gt;Site Columns&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ContentTypes"&gt;Content Types&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can define a content type that is a prototype of a list item.&amp;nbsp; If you are using content types for a list, you can define that the list contain only items of one content type, or you can define that it can contain items of one of several content types.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms479905.aspx"&gt;Content Types&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms472236.aspx"&gt;Introduction to Content Types&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="CustomActions"&gt;Custom Actions&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A custom action represents a link, toolbar button, menu item, or any control that can be added to a toolbar or menu that appears in the UI. &amp;nbsp;You define custom actions by using a custom action element within a Feature definition file. &amp;nbsp;You can bind custom actions to a list type, content type, file type, or programmatic identifier (ProgID).&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms458635.aspx"&gt;Custom Action Element Type&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;How to: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms473643.aspx"&gt;Modify the User Interface Using Custom Actions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="CustomViews"&gt;Custom Views&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Defining custom views for SharePoint lists is a key tool in your toolkit.&amp;nbsp; You can programmatically define custom views for specific users or scenarios so that data is presented in the most convenient form.&amp;nbsp; A common use of custom views is to define the format of data for exporting to a spreadsheet for further processing.&lt;/p&gt;
&lt;p style="margin-left: .5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Note: A View in this context is different from a view in the context of SQL Server.&amp;nbsp; In SQL Server, a view is a database construct that defines a view into a table.&amp;nbsp; In this context, a view is a visible table presented in a page so that users can see some specific subset of the data in a SharePoint list.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office online: &lt;a class="eric-link" href="http://office.microsoft.com/en-us/sharepoint-designer-help/create-a-custom-list-view-HA010379079.aspx?CTT=1"&gt;Create or change a view&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewcollection.aspx"&gt;SPViewCollection Class&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff409382.aspx"&gt;SP.View Class&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff409050.aspx"&gt;SP.ViewCollection Class&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Dashboards"&gt;Dashboards and KPIs&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A dashboard is a solution for information workers that consolidates personal, team, corporate, or external information, and provides single-click access to analytical and collaborative tools. It brings an integrated view of a company's data resources to an individual's desktop, providing access to key business information.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Getting Started: &lt;a class="eric-link" href="http://office.microsoft.com/en-us/sharepoint-server-help/getting-started-introduction-to-the-business-intelligence-center-HA101809949.aspx?CTT=1"&gt;Introduction to the Business Intelligence Center&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office Online: &lt;a class="eric-link" href="http://office.microsoft.com/en-us/sharepoint-server-help/getting-started-with-dashboards-HA010380601.aspx"&gt;Getting started with dashboards&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office Online: &lt;a class="eric-link" href="http://office.microsoft.com/en-us/sharepoint-server-help/CH010373735.aspx"&gt;KPIs and Status Indicators&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee559635.aspx"&gt;Development Scenarios with PerformancePoint Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="DocumentLibraries"&gt;Document Libraries&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint document libraries are special forms of SharePoint lists.&amp;nbsp; They contain features such as the capability to keep major and minor versions of documents.&amp;nbsp; They can restrict access to documents based on identity.&amp;nbsp; You can define any number of columns that contain auxiliary information about each document in the library.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A very important feature of document libraries is that you can bind columnar data to metadata in the document.&amp;nbsp; When you check the document out of the library, the metadata is copied to the document, where it can be maintained by the user.&amp;nbsp; When the document is checked back into the document library, the updated metadata is copied back into the fields in the item in the document library.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Document libraries can contain files of any variety.&amp;nbsp; Document libraries can contain nested folders &amp;ndash; this makes a document library resemble a file system.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee538269.aspx"&gt;Files and Documents&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="DocumentMetadata"&gt;Document Metadata&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Document metadata is custom data that SharePoint stores for each document in a document library.&amp;nbsp; Your users can specify this data using the SharePoint Web user interface or using Microsoft Word.&amp;nbsp; You can programmatically set this data in an event handler as documents are added to a document library.&amp;nbsp; Your users can then filter and find documents using this data.&amp;nbsp; In addition, you can access this metadata in a &lt;a class="eric-link" href="#WorkFlow"&gt;SharePoint workflow&lt;/a&gt;, and alter workflow behavior based on metadata.&amp;nbsp; You typically define document metadata using &lt;a class="eric-link" href="#ContentTypes"&gt;Content Types&lt;/a&gt;.&amp;nbsp; Workflows can interact with this data.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A document information panel is a form that is displayed within the client application, and which contains fields for the document metadata. Document information panels enable users to enter important metadata about a file anytime they want, without having to leave the client application.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee559293.aspx"&gt;Metadata Navigation and Filtering&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms550037.aspx"&gt;Document Information Panel Overview&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ECMAScriptClientObjectModel"&gt;ECMAScript / JavaScript Client Object Model&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The ECMAScript / JavaScript Client Object Model is a variant of the managed client object model that you can use from ECMAScript / JavaScript.&amp;nbsp; You use the same methods and data types.&amp;nbsp; The same programming model applies.&amp;nbsp; As with the managed client object model, you control when you send network traffic to and from the server.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537247.aspx"&gt;Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee539429.aspx"&gt;Differences Between Managed and ECMAScript Object Models&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="EventReceivers"&gt;Event Receivers&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Event receivers enable you to write event handlers that are called when items are added, deleted, or modified in a SharePoint document library or list, as well as at other times.&amp;nbsp; Event handlers can be deployed either as a full-trust farm solution, or as a sandboxed solution.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/vcsharp/ff623003.aspx"&gt;How Do I: Create Event Receivers for SharePoint 2010 in Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee535057.aspx"&gt;Building Block: Event Handling&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms442323.aspx"&gt;Events in SharePoint Foundation 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff407965.aspx"&gt;Introduction to Events in SharePoint Foundation 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee231604.aspx"&gt;Walkthrough: Add Feature Event Receivers&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.speventreceiverdefinition.aspx"&gt;SPEventReceiverDefinition Class&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ExcelServices"&gt;Excel Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Excel Services enables users to load, calculate, and display Excel workbooks on Microsoft Office SharePoint Server 2010.&amp;nbsp; There are four primary programmatic interfaces for Excel Services.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Excel Web Access is a viewer page and an Excel Services Web Part that you can add to any Web parts page in SharePoint Server 2010. &amp;nbsp;Excel Web Access renders (in other words, creates the HTML for) live Excel workbooks on a Web page, and enables the user to interact with those workbooks.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Excel Web Services for programmatic access&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;An JavaScript object model for automating and customizing, and to drive the Excel Web Access control and help build more compelling, integrated solutions&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;A Representational State Transfer (REST) API for accessing workbook parts directly through a URL&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To further customize spreadsheets, you can extend Excel Calculation Services by creating &lt;a class="eric-link" href="#ExcelUDF"&gt;user-defined functions (UDFs)&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office Online: &lt;a class="eric-link" href="http://office.microsoft.com/en-us/sharepoint-server-help/CH010373735.aspx"&gt;Excel Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms584057.aspx"&gt;Excel Web Access&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms572330.aspx"&gt;Excel Web Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556354.aspx"&gt;Excel Services ECMAScript (JavaScript, JScript)&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556413.aspx"&gt;Excel Services REST API&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms519581.aspx"&gt;Getting Started with Excel Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms546204.aspx"&gt;Excel Services Development Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ExcelServicesECMAScriptInterface"&gt;Excel Services ECMAScript Interface&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The ECMAScript object model in Excel Services enables you to write code to automate, customize, and interact with the Excel Web Access Web Part control on a page. &amp;nbsp;By using the ECMAScript object model, you can build mashups and other integrated solutions that interact with Excel Web Access Web Part controls. &amp;nbsp;It also enables you to add more capabilities to your workbooks.&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556354.aspx"&gt;Excel Services ECMAScript (JavaScript, JScript)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ExcelServicesRESTAPI"&gt;Excel Services REST API&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The Excel Services REST API provides programmatic access to workbook parts or elements directly through a URL.&lt;/p&gt;
&lt;p style="margin-top: .75pt; margin-right: 0in; margin-bottom: .75pt; margin-left: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556413.aspx"&gt;Excel Services REST API&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ExcelUDF"&gt;Excel Services User Defined Functions (UDF)&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Excel Services User Defined Functions (UDF) enables you to write high-performance functions in C or C++ for use in server-side spreadsheets.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms493934.aspx"&gt;Excel Services User Defined Functions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ExcelWebServices"&gt;Excel Web Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can use Excel Web services to access Excel Services programmatically.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms572330.aspx"&gt;Excel Web Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Features"&gt;Features&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Features are a unit of deployment for SharePoint.&amp;nbsp; Deploying a Feature in a large farm ensures that the artifacts in the Features are installed on all servers. &amp;nbsp;Features can contain templates, pages, list definitions, event handlers, workflows, JavaScript source files, CSS files, and more.&amp;nbsp; Features can contain Feature Receivers, which are event handlers that run when the Feature is installed, uninstalled, activated, deactivated, or upgraded.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms460318.aspx"&gt;Using Features&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee535723.aspx"&gt;Feature Upgrade Overview&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee231604.aspx"&gt;Walkthrough: Add Feature Event Receivers&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="HealthRules"&gt;Health Rules&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint Health Analyzer monitors the health of SharePoint Foundation throughout a server farm by applying a set of health rules. &amp;nbsp;A health rule is executable code that is deployed in a compiled assembly at the server farm level and registered with SharePoint Health Analyzer. &amp;nbsp;When a rule is registered, a timer job is created to run the rule. &amp;nbsp;An item for the rule is then added to the &lt;b&gt;Health Analyzer Rule&lt;/b&gt; list under &lt;b&gt;Review rule definitions&lt;/b&gt; in the &lt;b&gt;Monitoring&lt;/b&gt; section of Central Administration.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff407856.aspx"&gt;Building Block: Health Rules&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536188.aspx"&gt;SharePoint Health Analyzer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="InfoPathFormsServices"&gt;InfoPath Forms Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;InfoPath Forms Services is a server technology that makes it possible for people to fill out forms in a Web browser. By managing forms in a central location, you can streamline business processes and improve relations with customers, partners, and suppliers.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developer Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/office/aa905434.aspx"&gt;InfoPath Developer Center&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office Online: &lt;a class="eric-link" href="http://office.microsoft.com/en-us/infopath-help/getting-started-with-infopath-2010-HA010370230.aspx"&gt;Getting started with InfoPath 2010&lt;/a&gt;&lt;span class="MsoHyperlink"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;TechNet: &lt;a class="eric-link" href="http://technet.microsoft.com/en-us/library/cc262498.aspx"&gt;Plan InfoPath Forms Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="LINQtoSharePoint"&gt;LINQ to SharePoint&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;LINQ to SharePoint is a LINQ query provider that enables you to write queries more naturally than when using CAML.&amp;nbsp; It is most useful when using the SharePoint server object model.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One important characteristic of LINQ to SharePoint is that it uses an approach of generated code so that your code uses a strongly-typed object model for accessing the data returned by a query.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;For developers interested in functional programming, LINQ to SharePoint serves as a data source for doing pure functional transformations.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537339.aspx"&gt;Managing Data with LINQ to SharePoint&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513151.aspx"&gt;Accessing SharePoint 2010 Data with Server-Side APIs&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2006/10/04/fp-tutorial.aspx"&gt;Query Composition using Functional Programming Techniques in C# 3.0&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Lists"&gt;Lists&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Custom lists in a SharePoint site provide a place to store data.&amp;nbsp; Using SharePoint lists to contain data that you access programmatically is a very important building block for developers.&amp;nbsp; In the section, &lt;a class="eric-link" href="#vsDatabaseApplicationDevelopment"&gt;SharePoint Development vs. Database Application Development&lt;/a&gt;, I describe how you can use SharePoint lists for parts of your database.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee534985.aspx"&gt;Building Block: Lists and Document Libraries&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536277.aspx"&gt;SharePoint List Data Model&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ManagedClientObjectModel"&gt;Managed Client Object Model&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The Managed Client Object Model provides access to SharePoint data from external .NET applications.&amp;nbsp; This API is sometimes called the client-side object model (CSOM).&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The managed client object model has three basic uses:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Managed .NET application &amp;ndash;&lt;/b&gt; You can use the managed client object model from most .NET applications, including rich client applications running on a user&amp;rsquo;s computer, or as part of a .NET server application.&amp;nbsp; You could write a WPF real-estate management application that runs on a client computer and pulls information from a SharePoint server using the managed client object model.&amp;nbsp; You could also enhance a traditional ASP.NET application to pull data using the client object model.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;Silverlight Web Part &amp;ndash;&lt;/b&gt; Code within a Silverlight control can use the client object model.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;HTML Web Part &amp;ndash;&lt;/b&gt; You can use a JavaScript version of the client object model.&amp;nbsp; It has exactly the same semantics, except that you use a JavaScript programming interface.&lt;/p&gt;
&lt;div style="border: solid windowtext 1.0pt; padding: 1.0pt 4.0pt 1.0pt 4.0pt; margin-left: .25in; margin-right: 0in;"&gt;
&lt;p style="border: none; padding: 0in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Alert: When you are using the managed client object model to query for items in a list, you should always form your queries using CAML, not LINQ.&amp;nbsp; If you use LINQ, there is a performance hit that is relational to the total number of items in the list.&amp;nbsp; In contrast, when using the &lt;a class="eric-link" href="#ServerObjectModel"&gt;server object model&lt;/a&gt;, we recommend using LINQ to SharePoint instead of CAML.&lt;/p&gt;
&lt;/div&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A common activity for client-side code is to upload and download documents and files to and from SharePoint document libraries.&amp;nbsp; In the managed client object model, the &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee667335.aspx"&gt;ClientOM.File.OpenBinaryDirect&lt;/a&gt; method and the &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee538285.aspx"&gt;ClientOM.File.SaveBinaryDirect&lt;/a&gt; method use WebDAV for uploading and downloading files.&amp;nbsp; Without building your own custom WCF service, WebDAV is the most efficient way to upload and download files.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537247.aspx"&gt;Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Technical Article: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee857094.aspx"&gt;Using the SharePoint Foundation 2010 Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Technical Article: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee956524(office.14).aspx"&gt;Using the SharePoint Foundation 2010 Managed Client Object Model with the Open XML SDK 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513152.aspx"&gt;Accessing SharePoint 2010 Data with Client-Side APIs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="MobilePagesControlsandAdaptors"&gt;Mobile Pages, Controls, and Adaptors&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint Foundation provides a set of mobile pages and mobile controls that is separate from the pages and controls that you see from desktop and laptop computers.&amp;nbsp; Mobile browsers can access certain Web parts by means of mobile Web Part adapters.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536690.aspx"&gt;Building Block: Mobile Pages, Controls, and Adapters&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ODataRestApi"&gt;OData REST APIs&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint 2010 publishes data as resources that are addressable by URIs using the &lt;a class="eric-link" href="http://www.odata.org/"&gt;OData protocol&lt;/a&gt;. &amp;nbsp;Data is accessed and changed by using standard HTTP verbs of GET, PUT, POST, and DELETE. &amp;nbsp;OData uses the entity-relationship conventions of the Entity Data Model to expose resources as sets of entities that are related by associations.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff521587.aspx"&gt;SharePoint Foundation REST Interface&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="OfficeClientManagedAddIns"&gt;Office Client Managed Add-Ins&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office Client managed add-ins are the way that you can extend the Office client applications and integrate them more deeply with SharePoint Foundation and SharePoint Server.&amp;nbsp; Building Office client managed add-ins is an effective way to make the features of your SharePoint application discoverable and easy to use for end users.&amp;nbsp; Deep integration of SharePoint data with Word documents or Excel spreadsheets results in an application where you have only one version of your critical data, helping to prevent decisions based on stale data.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can access SharePoint external content types through the &lt;a class="eric-link" href="#BcsClientSideApi"&gt;BCS client-side API&lt;/a&gt;.&amp;nbsp; You can access data and documents stored in SharePoint lists and documents using the &lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;managed client object model&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developer Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/office/default.aspx"&gt;Office Developers Center&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="OpenXMLSDK"&gt;Open XML SDK&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Most SharePoint users make extensive use of document libraries, and most documents in document libraries are stored in the Open XML file format.&amp;nbsp; Prior to the advent of Open XML, it was difficult to write code that directly accessed the contents of documents, but with the Open XML SDK, you have server-hardened tools to query and transform Open XML document.&amp;nbsp; Using Open XML from within a SharePoint application opens up new scenarios.&amp;nbsp; You can generate large numbers of documents, and automatically convert those documents from one format to another.&amp;nbsp; You can query the contents of existing documents and bring that content and data to your users in new and interesting ways.&amp;nbsp; For example, a product design team might use a specific document template for specifications, and each section of the specification may follow a convention that reports the state of the specification.&amp;nbsp; You could then write an application to process all specifications for a project, and generate a report for management that shows the overall state of the specification writing process.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Combining the power of the Open XML SDK with the power of Word Services, you can implement a large number of server-side scenarios with high performance.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Prior to the advent of Open XML, customers sometimes attempted to solve server-side document processing needs using Office automation.&amp;nbsp; Automating Microsoft Office applications on servers presents a set of well-known issues.&amp;nbsp; The solution is to use SharePoint 2010 and the Open XML SDK.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A common pattern for document generation in SharePoint 2010 is to generate them into a SharePoint document library.&amp;nbsp; Then, if necessary, you can use &lt;a class="eric-link" href="#WordAutomationServices"&gt;Word Automation Services&lt;/a&gt; to update fields in the document, or to import altChunk content.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developer Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/office/bb265236.aspx"&gt;Open XML Formats Resource Center&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;External link: &lt;a class="eric-link" href="http://www.ecma-international.org/publications/standards/Ecma-376.htm"&gt;ECMA 376-2&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;External link: &lt;a class="eric-link" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=51459"&gt;ISO/IEC 29500-2&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;KB article: &lt;a class="eric-link" href="http://support.microsoft.com/kb/257757"&gt;Considerations for server-side Automation of Office&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/EricWhite/"&gt;Eric White's Blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/brian_jones/archive/2010/04/06/zeyad-rajabi-s-open-xml-sdk-blog-map.aspx"&gt;Brian Jones&amp;rsquo; Blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2008/10/27/how-to-use-altchunk-for-document-assembly.aspx?wa=wsignin1.0"&gt;How to Use altChunk for Document Assembly&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="PerformancePointServices"&gt;PerformancePoint Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;PerformancePoint Services in Microsoft SharePoint Server 2010 is a performance management service that you can use to monitor and analyze your business. &amp;nbsp;It provides tools for building dashboards, scorecards, reports, and key performance indicators (KPIs).&amp;nbsp; Integrated analytics help employees move quickly from monitoring information to analyzing it and, when appropriate, sharing it throughout the organization.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee559635.aspx"&gt;Development Scenarios with PerformancePoint Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="PowerPivot"&gt;PowerPivot&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;PowerPivot gives users the power to create compelling self-service BI solutions, facilitates sharing and collaboration on user-generated BI solutions, and enables IT organizations to increase operational efficiencies through Microsoft SQL Server 2008 R2-based management tools.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;MSDN: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee210692.aspx"&gt;PowerPivot Overview&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;External: &lt;a class="eric-link" href="http://www.powerpivot.com/"&gt;PowerPivot.com&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: 10.0pt; margin-right: 0in; margin-bottom: .0001pt; margin-left: 0in; page-break-after: avoid; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" name="SandboxedSolutions"&gt;&lt;/a&gt;&lt;b&gt;&lt;span style="color: #4f81bd;"&gt;Sandboxed Solutions&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Sandboxed solutions are one approach to solving scalability problems when SharePoint users need to have specialized solutions built.&amp;nbsp; If every developer knew all best practices, followed them religiously, and always wrote perfect code, this wouldn&amp;rsquo;t be a problem.&amp;nbsp; However, code is not perfect, and bugs in code that runs with farm administrator rights can bring down the farm.&amp;nbsp; With sandboxed solutions, there is an infrastructure that watches code for thrown exceptions, and monitors memory and CPU use, among other things.&amp;nbsp; The misbehaving code gets stopped, and not the farm.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536577.aspx"&gt;Sandboxed Solutions&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff630175.aspx"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;How to: &lt;/span&gt;Creating Sandboxed Workflow Actions&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513156.aspx"&gt;Sandboxed Solutions for Web Parts in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SearchCustomization"&gt;Search Customization&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can customize search to index new and different types of content, including &lt;a class="eric-link" href="#BCS"&gt;ECTs&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556856.aspx"&gt;SharePoint Enterprise Search&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Technical Article: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/04/27/searching-external-data-in-sharepoint-2010-using-business-connectivity-services.aspx"&gt;Searching External Data in SharePoint 2010 Using Business Connectivity Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SecureStoreService"&gt;Secure Store Service&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Secure Store Service is a claims-aware authorization service that provides storage and mapping of credentials such as account names and passwords. It enables you to securely store data that provides credentials required for connecting to external systems and associating those credentials to a specific identity or group of identities.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee557754.aspx"&gt;Secure Store Service&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee554863.aspx"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;How to: &lt;/span&gt;Use Secure Store Service to Connect to an External System&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Security"&gt;Security&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Security features of SharePoint Foundation 2010, and the underlying ASP.NET and .NET Framework, help give you protection from unauthorized changes to your data, whether deliberate or inadvertent, and help ensure that sensitive information is available only to those authorized to see it.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537811.aspx"&gt;SharePoint Foundation Security&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ServerObjectModel"&gt;Server Object Model&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The SharePoint server object model allows you to write programs to access SharePoint lists and document libraries, site collections, sites, and a lot more.&amp;nbsp; Although the object model is very large, it is not inherently difficult.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When you are developing for SharePoint, things can become somewhat complex.&amp;nbsp; You may be developing a Web part, an event receiver, or code that runs as part of a workflow.&amp;nbsp; In all of these scenarios, you will be writing code that uses the server object model.&amp;nbsp; This means that your edit/compile/execute cycle will be more complex.&amp;nbsp; With each compilation, you may need to reinstall a SharePoint Feature, cycle Internet Information Services, or connect to another process for debugging.&amp;nbsp; Dealing with those issues while at the same time learning how the server object model works is not desirable.&amp;nbsp; Instead, while I was learning the server object model, I built small console applications that used the server object model.&amp;nbsp; I executed those console applications directly on the server.&amp;nbsp; When writing more complex code that would eventually end up in a Web part, I factored the code so that the code that used the server object model was isolated in one or a few classes in my application.&amp;nbsp; I factored code that used the Open XML SDK into its own set of classes.&amp;nbsp; This gave me a quick edit/compile/execute cycle for both the Open XML code and the server object model code.&amp;nbsp; Then, after all constituent parts are developed, it is easy to build and deploy a Web part that uses the debugged code.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Code that uses the SharePoint server object model can run with farm administrator privileges or as a sandboxed solution.&amp;nbsp; With sandboxed solutions, you have access to a subset of the API that is available to code that is running with farm administrator rights.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The SharePoint server object model can be divided into three hierarchies:&lt;/p&gt;
&lt;p style="margin-left: .25in; text-indent: -.25in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/cc768619.aspx"&gt;The Content Hierarchy of Microsoft SharePoint Foundation&lt;/a&gt; discusses the various classes that represent publishable items of data, such as list items. There are also classes that represent nested containers of data, such as lists, content databases, Web sites, collections of Web sites, and groupings of site collections called Web applications.&lt;/p&gt;
&lt;p style="margin-left: .25in; text-indent: -.25in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/cc768557.aspx"&gt;The Physical Objects Hierarchy of Microsoft SharePoint Foundation&lt;/a&gt; discusses the various classes that represent physical entities, such as servers and files, and containers of such entities, such as farms and folders.&lt;/p&gt;
&lt;p style="margin-left: .25in; text-indent: -.25in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/cc768564.aspx"&gt;The Services Hierarchy of Microsoft SharePoint Foundation&lt;/a&gt; discusses classes that represent Web services, Windows services, other types of services, and instances of services.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms473633.aspx"&gt;Server and Site Architecture: Object Model Overview&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee534973.aspx"&gt;Essential SharePoint Programming Tasks&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee538251.aspx"&gt;Using the SharePoint Foundation Server-Side Object Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms412748.aspx"&gt;Basic Object Model Tasks&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff512784.aspx"&gt;Digital Asset Management Programming Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff512791.aspx"&gt;Document Management Programming Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff465318.aspx"&gt;Records Management Programming Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee556337.aspx"&gt;Metadata and Taxonomy Programming Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff512785.aspx"&gt;Publishing Programming Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536577.aspx"&gt;Sandboxed Solutions&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513151.aspx"&gt;Accessing SharePoint 2010 Data with Server-Side APIs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Ribbon"&gt;Server Ribbon&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Customizing the SharePoint 2010 Server ribbon allows you to give an intuitive and powerful user interface to your SharePoint application.&amp;nbsp; The key point behind customizing the ribbon is to make features and capabilities of your custom SharePoint application discoverable to your users.&amp;nbsp; Customizing the ribbon is analogous to customizing the ribbon for the Office client applications.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee534959.aspx"&gt;Building Block: Server Ribbon&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee540027.aspx"&gt;Server Ribbon in SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537017.aspx"&gt;Architecture of the Server Ribbon&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee539395.aspx"&gt;Customizing the Server Ribbon&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513157.aspx"&gt;Creating Dialogs and Ribbon Controls for SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="ServiceApplicationArchitecture"&gt;Service Application Architecture&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The service application architecture enables you to create robust and scalable shared services that can be consumed by multiple SharePoint applications.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536263.aspx"&gt;Service Application Framework&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee536537.aspx"&gt;Service Application Framework Architecture&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://channel9.msdn.com/learn/courses/SharePoint2010Developer/ServicesArchitecture/ArchitecturalandLogicalOverview/"&gt;SharePoint 2010 Service Application Architecture&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://channel9.msdn.com/learn/courses/SharePoint2010Developer/ServicesArchitecture/CreatingCustomServiceApplications/"&gt;Creating Custom Service Applications&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SharePointDialogFramework"&gt;SharePoint Dialog Framework&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When building web parts or application pages, you may need to put up a dialog box of one sort or another.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff535984.aspx#pj14_CustomizeProjectCenter_CreatingPage"&gt;Creating a Page for a Modal Dialog Box&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ff462046.aspx"&gt;SharePoint 2010 UI Features&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/jfrost/archive/2009/11/08/how-to-display-a-sharepoint-dialog-from-ribbon-button-and-get-selected-item-context.aspx"&gt;How to Display a SharePoint Dialog from Ribbon Button and Get Selected Item Context&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513157.aspx"&gt;Creating Dialogs and Ribbon Controls for SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SharePointThemes"&gt;SharePoint Themes&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Themes, which are important when branding a SharePoint site, provide a quick and easy way to apply colors and fonts to sites in SharePoint 2010. &amp;nbsp;A change in theme cause the color of most page elements, such as background images, text, and hyperlinks, to change.&amp;nbsp; The fonts used for some page elements, such as titles, also changes.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;TechNet: &lt;a class="eric-link" href="http://technet.microsoft.com/en-us/library/ee424397.aspx"&gt;SharePoint Themes&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SharePointWebServices"&gt;SharePoint Web Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint has long provided a set of Web services to enable client interaction with SharePoint deployments.&amp;nbsp; Some of these are specifically designed for data retrieval and others include some data retrieval services.&amp;nbsp; The APIs of these data-providing Web services are still supported for backward compatibility and interoperability with Web service clients.&amp;nbsp; For reasons of both performance and ease, we recommend that you use either the &lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;client object model&lt;/a&gt; or the ADO.NET Data Services Framework to query SharePoint data.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee538665.aspx"&gt;SharePoint Foundation 2010 Web Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/websvclists.aspx"&gt;Lists Web service&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/websvcwebs.aspx"&gt;Webs Web service&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/websvcsites.aspx"&gt;WebSvcsites&lt;/a&gt;&lt;span class="MsoHyperlink"&gt; Web service&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/websvcsitedata.aspx"&gt;SiteData Web service&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/websvcdspsts.aspx"&gt;DspSts Web service&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Interoperability documentation: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/cc339475(v=office.12).aspx"&gt;SharePoint Products and Technologies Protocols&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Instead of using Web services, see the following:&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff521587.aspx"&gt;SharePoint Foundation REST Interface&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee537247.aspx"&gt;Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Technical Article: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee857094.aspx"&gt;Using the SharePoint Foundation 2010 Managed Client Object Model&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Technical Article: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee956524(office.14).aspx"&gt;Using the SharePoint Foundation 2010 Managed Client Object Model with the Open XML SDK 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513152.aspx"&gt;Accessing SharePoint 2010 Data with Client-Side APIs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SilverlightWebPart"&gt;Silverlight Web Part&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Silverlight Web parts are an important tool for building the best user interfaces.&amp;nbsp; There are times when nothing less than Silverlight will do.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Code Sample: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff803420.aspx"&gt;Silverlight List Viewer&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513155.aspx"&gt;Creating Silverlight User Interfaces for SharePoint 2010 Solutions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SiteDefinitions"&gt;Site Definitions&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A site definition is a set of files that includes a master XML configuration file that is stored on all front-end Web servers. &amp;nbsp;A site definition provides the basic blueprint for how sites look, what lists they include, their default navigational structures, and so on.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms434313.aspx"&gt;Site Types: WebTemplates and Site Definitions&lt;/a&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms434313(v=office.12).aspx"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="SitePages"&gt;Site Pages&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Site Pages provide an efficient means (in terms of both storage and CPU time) to allow for hundreds of thousands of Web pages where many are the same and a few are customized.&amp;nbsp; Unlike a traditional ASP.NET application, a physical ASPX page does not need to exist for every site page on the server. &amp;nbsp;SharePoint treats any site page that is not customized as a virtual file, which can allow a small number of files to appear in many places. &amp;nbsp;This is one of the many aspects of SharePoint that gives it scalability.&amp;nbsp; Without this capability, you would need far too many compiled ASPX pages for a large site.&amp;nbsp; Management of those pages would be unwieldy.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms464558.aspx"&gt;Sites and Pages&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/aa979592.aspx"&gt;SharePoint Page Types&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/kaevans/archive/2010/06/28/creating-a-sharepoint-site-page-with-code-behind-using-visual-studio-2010.aspx?wa=wsignin1.0"&gt;Creating a SharePoint Site Page With Code-Behind Using Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="TimerJobs"&gt;Timer Jobs&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Like a CRON job, a timer job is code that runs at a specific time. &amp;nbsp;An application may regularly need to process data in a SharePoint list, and perhaps modify data in an external system.&amp;nbsp; The developer can write a timer job for this that will run at 1am every morning.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://technet.microsoft.com/en-us/library/cc678870.aspx"&gt;Timer job reference&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Variations"&gt;Variations&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Variations enable you to tailor sites for different cultures, markets, and languages.&amp;nbsp; It is a feature that facilitates serving different content to different audiences.&amp;nbsp; Variations can help serve different content based on the language of the user.&amp;nbsp; In addition, variations can serve different content based on end-user devices, or any arbitrary distinction that you choose, such as brand or level of user expertise.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms493894.aspx"&gt;Variations and Multiple Languages Sites&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ecm/archive/2010/04/12/variations-in-sharepoint-2010-connecting-people-with-content.aspx"&gt;Variations in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="VisioServices"&gt;Visio Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Visio Services is a service application that enables users to share and view Microsoft Visio Web drawings. The service also enables data-connected Microsoft Visio 2010 Web drawings to be refreshed and updated from various data sources.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://technet.microsoft.com/en-us/library/ee663485.aspx"&gt;Visio Services overview&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="VisualStudioSharePointToolsExt"&gt;Visual Studio SharePoint Tools Extensibility&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The SharePoint tools in Visual Studio 2010 meet the requirements of many application development scenarios. However, you might discover cases where they do not provide functionality that you or other developers require. In these cases, you can extend the SharePoint tools to create the functionality that you need.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee256693.aspx"&gt;Visual Studio SharePoint Tools Extensibility&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/gg131919.aspx"&gt;Getting Started with SharePoint 2010 Developer Tools in Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="WebDAV"&gt;Web-based Distributed Authoring and Versioning (WebDAV)&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A common activity for client-side code is to upload and download documents and files.&amp;nbsp; You may need to retrieve documents from a SharePoint document library to the client computer, or upload documents from the client computer to a SharePoint document library.&amp;nbsp; You can use WebDAV directly, but an easy way to use WebDAV is to use the managed client object model.&amp;nbsp; The &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee667335.aspx"&gt;ClientOM.File.OpenBinaryDirect&lt;/a&gt; method and the &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee538285.aspx"&gt;ClientOM.File.SaveBinaryDirect&lt;/a&gt; method in the client object model use WebDAV for uploading and downloading files.&amp;nbsp; Without building your own custom WCF service, WebDAV is the most efficient way to upload and download files.&amp;nbsp; Note that WebDAV is limited to accessing files, not data.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;External link: &lt;a class="eric-link" href="http://tools.ietf.org/html/rfc4918"&gt;RFC 4918&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="WebParts"&gt;Web Parts&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint is an ASP.NET application.&amp;nbsp; It inherits a number of important aspects of ASP.NET, including the notions of web part pages, and web parts.&amp;nbsp; The classes that represent SharePoint Web parts derive from the appropriate ASP.NET classes.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Building SharePoint web parts accounts for more SharePoint developer hours than any other category (perhaps more than the rest put together).&amp;nbsp; Today, more than ever, users expect good looking, intuitive, and powerful user interfaces, and developing web parts is often the most effective approach.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Web parts can communicate with other web parts.&amp;nbsp; For example, they can be linked to enable parent/child form/list user interfaces when maintaining data.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;AJAX Web parts are a special category.&amp;nbsp; When your optimal user interface requires it, you can take advantage of AJAX architecture.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Silverlight Web parts are another special category.&amp;nbsp; There are times when nothing less than Silverlight will do.&amp;nbsp; I think that Silverlight web parts in SharePoint are the future.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Web parts can be built with code-behind, either in sandboxed or full-trust mode.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;On the client side, web parts can communicate with the SharePoint server using the &lt;a class="eric-link" href="#ManagedClientObjectModel"&gt;Managed Client Object Model&lt;/a&gt;, &lt;a class="eric-link" href="#ODataRestApi"&gt;REST APIs&lt;/a&gt;, or &lt;a class="eric-link" href="#SharePointWebServices"&gt;web services&lt;/a&gt;.&amp;nbsp; WCF is an option from within a Silverlight web part.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;While developers can build custom Web parts, SharePoint 2010 provides a number of build-in Web parts that can be useful in putting together a custom solution:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Some of the more common SharePoint built-in Web parts are:&lt;/p&gt;
&lt;table style="border: currentColor; border-collapse: collapse;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; padding-top: 0in; border: windowtext 1pt solid;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;List View Web Part&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff604021.aspx"&gt;List Views&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/sharepoint/archive/2009/12/02/sharepoint-2010-list-view-blog-series-part-1-introduction-to-the-new-list-view.aspx"&gt;SharePoint 2010 List View Blog Series&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office online: &lt;a class="eric-link" href="http://office.microsoft.com/en-gb/windows-sharepoint-services-help/about-the-list-view-web-part-HA001160914.aspx?CTT=1"&gt;About the List View Web Part&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Image Web Part&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office online: &lt;a class="eric-link" href="http://office.microsoft.com/en-gb/sharepoint-server-help/image-web-part-HA010024051.aspx"&gt;Image Web Part&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Site Users Web Part&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office online: &lt;a class="eric-link" href="http://office.microsoft.com/en-gb/windows-sharepoint-services-help/site-users-web-part-HA010081915.aspx?CTT=1"&gt;Site Users Web Part&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Chart Web Parts&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 239.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="319"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Office online: &lt;a class="eric-link" href="http://office.microsoft.com/en-gb/sharepoint-server-help/introduction-to-the-chart-web-part-HA101889216.aspx?CTT=1"&gt;Introduction to the Chart Web Part&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms476318.aspx"&gt;Web Parts in SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.aspx"&gt;Microsoft.SharePoint.WebPartPages Namespace&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee535520.aspx"&gt;Building Block: Web Parts&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff597538.aspx"&gt;Connect Web Parts in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee535898.aspx"&gt;JS Grid Control&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;How to: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee539027.aspx"&gt;Create a Basic JS Grid&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513148.aspx"&gt;Getting Started Building Web Parts in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513150.aspx"&gt;Building Blocks for Web Part Development in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513155.aspx"&gt;Creating Silverlight User Interfaces for SharePoint 2010 Solutions&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513156.aspx"&gt;Sandboxed Solutions for Web Parts in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff769953.aspx"&gt;Creating SharePoint 2010 Web Parts That Can Read and Write Data to External Data Sources&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://channel9.msdn.com/Blogs/matthijs/Advanced-Web-Part-Development-in-SharePoint-2010"&gt;Advanced Web Part Development in SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms438349.aspx"&gt;Cascading Style Sheets Class Usage in SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Code Sample: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff803420.aspx"&gt;Silverlight List Viewer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="WebServices"&gt;Web Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When you are building large distributed applications, best practice is to loosely couple them, using ASMX web services or WCF services to do the coupling.&amp;nbsp; You need to apply this same technique when building large scale SharePoint applications.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;As an example, Operational Research often requires deployment of a sophisticated mathematical optimizer to arrive at an optimal or near optimal solution to some problem.&amp;nbsp; This should be deployed on dedicated hardware, and exposed via Web services.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In some cases, you may want to build client applications that make use of sophisticated server-side functionality that scales to the maximum extent.&amp;nbsp; You may want to reduce extraneous network traffic to an absolute minimum.&amp;nbsp; In these cases, the best solution often is to host a WCF service on your SharePoint server.&amp;nbsp; Code in this service can use the server object model with full farm privileges, and supply the necessary functionality for the client application.&amp;nbsp; As appropriate, when building these types of services, you need to do attack surface analysis and threat modeling.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developer Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;WCF Developers Center&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/05/11/getting-started-building-a-wcf-web-service.aspx"&gt;Getting Started Building a WCF Web Service&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="WindowsIdentityFoundation"&gt;Windows Identity Foundation&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The claims-based identity model for Microsoft SharePoint Foundation 2010 and Microsoft SharePoint Server 2010 is built upon Windows Identity Foundation (WIF). Features of claims-based identity include:&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Authentication across users of Windows-based systems and systems that are not Windows-based.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Multiple authentication types.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Stronger real-time authentication.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;A wider set of principal types.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Delegation of user identity between applications.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When you build claims-aware applications, the user presents an identity to your application as a set of claims. One claim could be the user&amp;rsquo;s name, another might be an email address. The idea is that an external identity system is configured to give your application all the information that it needs about the user with each request, along with cryptographic assurance that the identity data that your application receives comes from a trusted source. Under this model, single sign-on is much easier to achieve.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developer Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ff660758.aspx"&gt;SharePoint 2010 Security Resource Center&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developer Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/security/aa570351.aspx"&gt;Windows Identity Foundation&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/06/18/consuming-a-claims-enabled-wcf-web-service-as-an-sharepoint-2010-external-content-type.aspx"&gt;Consuming a Claims-Enabled WCF Web Service as a SharePoint 2010 External Content Type&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="WordAutomationServices"&gt;Word Automation Services&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are some tasks that are difficult when using the Open XML SDK, such as repagination, conversion to other document formats such as PDF, or updating of field codes or the table of contents, fields, and other dynamic content in documents. Word Automation Services is a feature of SharePoint 2010 that can help in these scenarios. It is a shared service that provides unattended, server-side conversion of documents into other formats, and some other important pieces of functionality. It was designed from the outset to work on servers and can process high volumes of documents in a reliable and predictable manner.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee558278.aspx"&gt;Word Automation Services&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Technical Article: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff742315.aspx"&gt;Developing with SharePoint 2010 Word Automation Services&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="WorkFlow"&gt;Workflows&lt;/h2&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint workflows allow you to codify business process.&amp;nbsp; Workflow logic can be very simple or quite elaborate.&amp;nbsp; End users can use workflows to build no-code business solutions.&amp;nbsp; Developers can enhance workflows with C# code that is called at appropriate times.&amp;nbsp; Workflows can be deployed either as a full-trust farm solution, or as a sandboxed solution.&amp;nbsp; Examples of workflow use include claims processing, content approval, or purchasing processes.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ms416312.aspx"&gt;Workflows in SharePoint Foundation&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.workflow.aspx"&gt;Microsoft.SharePoint.Workflow&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff806156.aspx"&gt;&lt;span style="color: windowtext; text-decoration: none;"&gt;Walkthrough: &lt;/span&gt;Use SharePoint Full-Trust Workflow Activities with Business Connectivity Services&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513154.aspx"&gt;Developing Business Processes with SharePoint 2010 Workflows&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="DeveloperDashboard"&gt;Developer Dashboard&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Developing SharePoint applications can be a fairly complex undertaking.&amp;nbsp; If a page or a Web part does not perform well, it can be difficult to determine what is causing the delay or consuming resources.&amp;nbsp; SharePoint 2010 provides a developer dashboard that you can turn on to view performance metrics related to the page that is loading.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can turn on the developer dashboard by running the following Stsadm command:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;stsadm -o setproperty -pn developer-dashboard -pv OnDemand&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff829215.aspx"&gt;SharePoint 2010 Development for ASP.NET Developers&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff512745.aspx"&gt;Using the Developer Dashboard&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="Accessibility"&gt;Accessibility&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Microsoft adopted the Web Content Accessibility Guidelines 2.0 (WCAG 2.0) for SharePoint 2010, and set a goal for Level AA. Becoming a W3C recommendation on December 11th, 2008, WCAG 2.0 defines the expectations of and the techniques deployed in well-built, accessible Web sites.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;External link: &lt;a class="eric-link" href="http://www.w3.org/TR/WCAG20/"&gt;Web Content Accessibility Guidelines 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/sharepoint/archive/2010/03/09/accessibility-and-sharepoint-2010.aspx"&gt;Accessibility and SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="SharePointDevelopmentTools"&gt;SharePoint Development Tools&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are a number of tools that you use to build SharePoint 2010 applications.&lt;/p&gt;
&lt;table style="border: currentColor; border-collapse: collapse;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="padding-bottom: 0in; padding-left: 5.4pt; width: 2.7in; padding-right: 5.4pt; padding-top: 0in; border: windowtext 1pt solid;" valign="top" width="259"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Visual Studio 2010&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 243pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="324"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Visual Studio 2010 is the primary tool for professional developers on SharePoint 2010.&amp;nbsp; It contains a variety of pre-configured project types to make it as easy as possible to write code for your scenario.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 2.7in; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="259"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint Designer 2010&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 243pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="324"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SharePoint Designer 2010 enables you to create no-code SharePoint solutions that encompass a variety of common scenarios, from collaborative sites and web publishing to Line-Of-Business data integration, business intelligence solutions, and human workflows. Developers can use SharePoint Designer 2010 to get a quick start on SharePoint development projects.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0in; padding-left: 5.4pt; width: 2.7in; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="259"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Visio 2010&lt;/p&gt;
&lt;/td&gt;
&lt;td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0in; padding-left: 5.4pt; width: 243pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0in;" valign="top" width="324"&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Visio 2010 enables you and subject matter experts to author SharePoint workflows using drag-and-drop.&amp;nbsp; You can then import them into SharePoint Designer 2010 for further editing, and then execute them in SharePoint 2010.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee534965.aspx"&gt;SharePoint Foundation Development Tools&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;MSDN: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee330921.aspx"&gt;SharePoint Development in Visual Studio&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;MSDN Magazine: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/magazine/ee309510.aspx"&gt;Visual Studio 2010 Tools for SharePoint Development&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/gg131919.aspx"&gt;Getting Started with SharePoint 2010 Developer Tools in Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Download: &lt;a class="eric-link" href="http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&amp;amp;FamilyID=d88a1505-849b-4587-b854-a7054ee28d66"&gt;Microsoft SharePoint Designer 2010 (32 bit)&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/visio/archive/2009/11/23/sharepoint-workflow-authoring-in-visio-premium-2010-part-1.aspx"&gt;SharePoint Workflow Authoring in Visio Premium 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/vssharepointtoolsblog/"&gt;Visual Studio SharePoint Development Blog&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="SettingUpADevelopmentEnvironment"&gt;Setting up a Development Environment&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are several ways to set up a SharePoint 2010 development environment.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;My favorite approach is to use Windows Server 2008 R2, and set up my development machine using Hyper-V.&amp;nbsp; Immediately after installing everything, I take a snapshot.&amp;nbsp; This allows me to revert back to this clean state if necessary, although in my experience, it rarely is.&amp;nbsp; For the best experience, place the virtual hard drive on a drive other than where the host operating system resides.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;You can install on Windows Server 2008 (or R2) that is running directly on the server, not in a Hyper-V VM.&amp;nbsp; This can be an effective approach, although it loses the ability to revert to a snapshot.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;You can install on Windows 7 64-bit or Windows Vista 64-bit.&amp;nbsp; Some developers work for companies where they are prevented by policy from running server operating systems, so this can be a good solution.&amp;nbsp; In addition, if I were starting a long development project that would take several months to complete, I would install SharePoint 2010 on my laptop so that I could do development at opportune times, yet retain the ease of use of an end-user operating system.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee554869.aspx"&gt;Setting up a SharePoint 2010 Development Environment&lt;/a&gt;.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog post: &lt;a class="eric-link" href="http://blogs.msdn.com/b/cjohnson/archive/2010/08/11/sharepoint-development-environments-my-guidance.aspx"&gt;SharePoint development environments&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="ApplicationLifecycleManagement"&gt;Application Lifecycle Management (ALM)&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Application Lifecycle Management is the coordination of all aspects of software engineering&amp;mdash;including the formulation and communication of business and technical requirements, code design and architecture, project tracking, change management, coding, testing, debugging, and release management&amp;mdash;by using tools that facilitate and track collaboration among and within work teams.&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Resource Center: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/office/cc990283.aspx"&gt;Application Lifecycle Management Resource Center&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ff420387.aspx"&gt;Development Life Cycle for SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video: &lt;a class="eric-link" href="http://channel9.msdn.com/blogs/egibson/visual-studio-2010-seattle-simulcast-part-2-of-6-improving-software-development-across-the-lifecycle"&gt;Improving Software Development Across the Lifecycle with Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="Conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;With SharePoint Foundation 2010 and SharePoint Server 2010, SharePoint has evolved into a comprehensive development platform.&amp;nbsp; While many SharePoint applications are simple, SharePoint applications can very complex, using a large number of building blocks, all working together in concert.&amp;nbsp; Careful design of your application is necessary to ensure that your application is robust and can scale, and that the user interface of your application meets the needs of your users.&lt;/p&gt;
&lt;h1 id="AdditionalResources"&gt;Additional Resources&lt;/h1&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Code samples: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff512781.aspx"&gt;SharePoint Server 2010 Code Samples&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Code samples: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff803420.aspx"&gt;SharePoint Foundation 2010 Code Samples&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;SDK: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ee705809.aspx"&gt;Best Practices with SharePoint Server&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Articles: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/ff598603.aspx"&gt;SharePoint 2010 Technical Articles&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Videos: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ff405669.aspx"&gt;SharePoint 2010 Videos | SharePoint Conference 2009&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Video and hands-on lab: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513149.aspx"&gt;What Developers Need to Know About SharePoint 2010&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/sharepoint"&gt;SharePoint Team Blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Blog: &lt;a class="eric-link" href="http://blogs.msdn.com/b/sharepointdeveloperdocs/"&gt;Microsoft SharePoint Developer Documentation Team Blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;MSDN: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ee513147.aspx"&gt;Developer Getting Started Training&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;MSDN: &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/sharepoint/ff420377.aspx"&gt;Advanced Developer Training&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-bottom: .0001pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;a class="eric-link" href="http://www.microsoft.com/learning/en/us/training/sharepoint.aspx"&gt;Microsoft Training and Certification for SharePoint 2010&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10080939" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category></item><item><title>Building a Simple Recursive Descent Parser (Completed Simple Parser)</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/09/24/building-a-simple-recursive-descent-parser-completed-simple-parser.aspx</link><pubDate>Fri, 24 Sep 2010 04:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10067150</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/09/24/building-a-simple-recursive-descent-parser-completed-simple-parser.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In this post, I complete the recursive descent parser that will parse the simple grammar that I presented previously in this series.&amp;nbsp; In this post, I&amp;rsquo;ll examine in detail the NospaceExpression class, which needs to implement operator precedence.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt 0.5in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Note:&amp;nbsp; I have to apologize for the delay in writing this post.&amp;nbsp; First summer vacation took some time, and then I became involved in a project of writing two papers &amp;ndash; one that summarizes SharePoint application development, and another that summarizes Office Client application development.&amp;nbsp; I&amp;rsquo;ve been literally obsessing about every possible way that you as a developer can extend SharePoint Server 2010, and every way that you can extend the Office 2010 client applications.&amp;nbsp; The SharePoint paper is nearing publication.&amp;nbsp; The Office Client paper will be along in a bit.&amp;nbsp; While obsessing, it has been difficult for me to mentally switch tracks back to this series.&amp;nbsp; But here we go again&amp;hellip;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on using LINQ to write a recursive-descent parser for SpreadsheetML formulas.&amp;nbsp; &lt;span style="background-color: #ffff99;"&gt;You can find the complete list of posts &lt;/span&gt;&lt;a href="http://ericwhite.com/blog/map/recursive-descent-parser/"&gt;&lt;span style="background-color: #ffff99;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: #ffff99;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The NospaceExpression Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Here is the entire implementation of the NospaceExpression class.&amp;nbsp; I explained all of the code that has a gray background in the previous post, &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/08/03/building-a-simple-recursive-descent-parser-continued.aspx"&gt;Building a Simple Recursive Descent Parser (continued)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// nospace-expression = open-parenthesis expression close-parenthesis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / numerical-constant&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / prefix-operator expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / expression infix-operator expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (!symbols.Any())&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (symbols.First() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; &amp;amp;&amp;amp; symbols.Last() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1).SkipLast(1));&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;(), e, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;());&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; z2 = symbolsWithIndex.Zip(z, (v1, v2) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SymbolWithIndex = v1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Depth = v2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; operatorList = z2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(x =&amp;gt; x.Depth == 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.SymbolWithIndex.Index != 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;.Produce(x.SymbolWithIndex.Symbol) != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (operatorList.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; minPrecedence = operatorList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()]).Min();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; op = operatorList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Last(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()] == minPrecedence);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (op != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList1 = symbols.TakeWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e1 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e1 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList2 = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol).Skip(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e2 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e2 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt; io = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;(op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(e1, io, e2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; n = &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;.Produce(symbols);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(n);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: #2b91af;"&gt;PrefixOperator&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; p = &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt;.Produce(symbols.FirstOrDefault());&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (p != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1));&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(p, e);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Let&amp;rsquo;s work through the new code.&amp;nbsp; Let&amp;rsquo;s consider how the new code behaves when parsing the following formula:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;"1+((2+3)*4)^5"&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When determining if an expression has an infix operator, we specifically need to ignore operators that are in parentheses.&amp;nbsp; Those operators will have their chance to be recognized when NospaceExpression.Produce sees that an expression starts with an open parenthesis and ends with a close parenthesis, as processed by this code:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (!symbols.Any())&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (symbols.First() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; &amp;amp;&amp;amp; symbols.Last() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="background: #d9d9d9;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1).SkipLast(1));&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: #d9d9d9; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: #d9d9d9;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;(), e, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="background: #d9d9d9;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;So we need to ignore operators that are inside parentheses.&amp;nbsp; The easiest way to determine if an operator is inside of&amp;nbsp;parentheses is to use the Rollup extension method, as follows:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;});&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This use of the &lt;span style="background-color: #ffffff;"&gt;&lt;span style="background-image: none; background-attachment: scroll; background-repeat: repeat; background-position: 0% 0%;"&gt;&lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/02/15/rollup-extension-method-create-running-totals-using-linq-to-objects.aspx"&gt;Rollup extension method&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;returns a new collection of integers that has the same number of elements in it as the source collection.&amp;nbsp; The integer is the depth of parentheses at that point.&amp;nbsp; In the following snippet, I add a bit of code to print the items in the collection, and then exit:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; z)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(item);&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.Exit(0);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;When I run this example for the test formula "1+((2+3)*4)^5", I see:&lt;br /&gt;0&lt;br /&gt;0&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;2&lt;br /&gt;2&lt;br /&gt;2&lt;br /&gt;1&lt;br /&gt;1&lt;br /&gt;1&lt;br /&gt;0&lt;br /&gt;0&lt;br /&gt;0&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When looking for an infix operator, I can ignore all operators where the depth is not zero.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Later on, I&amp;rsquo;m going to need the index of the symbol of the infix operator that we find.&amp;nbsp; The next projection uses &lt;strong&gt;symbols&lt;/strong&gt; as its source, and projects an anonymous type that includes the symbol and its index:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbolsWithIndex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(item);&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.Exit(0);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;When I run this for the test formula, I see:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;{ Symbol = 1, Index = 0 }&lt;br /&gt;{ Symbol = +, Index = 1 }&lt;br /&gt;{ Symbol = (, Index = 2 }&lt;br /&gt;{ Symbol = (, Index = 3 }&lt;br /&gt;{ Symbol = 2, Index = 4 }&lt;br /&gt;{ Symbol = +, Index = 5 }&lt;br /&gt;{ Symbol = 3, Index = 6 }&lt;br /&gt;{ Symbol = ), Index = 7 }&lt;br /&gt;{ Symbol = *, Index = 8 }&lt;br /&gt;{ Symbol = 4, Index = 9 }&lt;br /&gt;{ Symbol = ), Index = 10 }&lt;br /&gt;{ Symbol = ^, Index = 11 }&lt;br /&gt;{ Symbol = 5, Index = 12 }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;And next, use the &lt;a href="http://msdn.microsoft.com/en-us/library/dd267698.aspx"&gt;Zip extension method&lt;/a&gt; to zip together the last two queries to create a list of items that contains:&lt;/p&gt;
&lt;p style="margin: 0in 0in 0pt 0.25in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;The symbol&lt;/p&gt;
&lt;p style="margin: 0in 0in 0pt 0.25in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Its index&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt 0.25in; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Its parenthesis depth&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;});&lt;br /&gt;&lt;span style="background: yellow; color: blue;"&gt;var&lt;/span&gt;&lt;span style="background: yellow;"&gt; z2 = symbolsWithIndex.Zip(z, (v1, v2) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background: yellow;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;SymbolWithIndex = v1,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;Depth = v2,&lt;/span&gt;&lt;br /&gt;&lt;span style="background: yellow;"&gt;});&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; z2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(item);&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.Exit(0);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This produces:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;{ SymbolWithIndex = { Symbol = 1, Index = 0 }, Depth = 0 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = +, Index = 1 }, Depth = 0 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = (, Index = 2 }, Depth = 1 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = (, Index = 3 }, Depth = 2 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = 2, Index = 4 }, Depth = 2 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = +, Index = 5 }, Depth = 2 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = 3, Index = 6 }, Depth = 2 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = ), Index = 7 }, Depth = 1 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = *, Index = 8 }, Depth = 1 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = 4, Index = 9 }, Depth = 1 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = ), Index = 10 }, Depth = 0 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = ^, Index = 11 }, Depth = 0 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = 5, Index = 12 }, Depth = 0 }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Next, we can look for any infix operators where the Depth == 0.&amp;nbsp; In addition, we filter out operators that are found in the very first position, because that will not be an infix operator, but instead a prefix operator.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z2 = symbolsWithIndex.Zip(z, (v1, v2) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SymbolWithIndex = v1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Depth = v2,&lt;br /&gt;});&lt;br /&gt;&lt;span style="background: yellow; color: blue;"&gt;var&lt;/span&gt;&lt;span style="background: yellow;"&gt; operatorList = z2&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;.Where(x =&amp;gt; x.Depth == 0 &amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;x.SymbolWithIndex.Index != 0 &amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: #2b91af;"&gt;InfixOperator&lt;/span&gt;&lt;span style="background: yellow;"&gt;.Produce(x.SymbolWithIndex.Symbol) != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;.ToList();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; operatorList)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(item);&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.Exit(0);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This produces a list of the two possible operators that are part of an expression that uses an infix operator:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;{ SymbolWithIndex = { Symbol = +, Index = 1 }, Depth = 0 }&lt;br /&gt;{ SymbolWithIndex = { Symbol = ^, Index = 11 }, Depth = 0 }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Next, of the operators that could possibly be the infix operator for this expression, we find the minimum precedence of any operators.&amp;nbsp; When implementing a top-down parser, we process operators with the least precedence before processing operators of higher precedence.&amp;nbsp; When looking at the expression tree, operators with the least precedence are nearer to the root of the tree.&amp;nbsp; Operators with the highest precedence will be closer to the leaves, so that they will be evaluated before the operators with lower precedence.&amp;nbsp; If this isn&amp;rsquo;t clear, I think that it will be when you see the entire parse tree.&amp;nbsp; In this particular case, we need to find the + operator, not the ^ operator, as + has lower precedence.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To enable processing of precedence of operators, I defined a small dictionary of operators and their precedence:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; OperatorPrecedence = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"^"&lt;/span&gt;, 3 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"*"&lt;/span&gt;, 2 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"/"&lt;/span&gt;, 2 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"+"&lt;/span&gt;, 1 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"-"&lt;/span&gt;, 1 },&lt;br /&gt;};&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In the following listing, the highlighted line finds the minimum precedence of the operators that are in play.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z2 = symbolsWithIndex.Zip(z, (v1, v2) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SymbolWithIndex = v1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Depth = v2,&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; operatorList = z2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(x =&amp;gt; x.Depth == 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.SymbolWithIndex.Index != 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;.Produce(x.SymbolWithIndex.Symbol) != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (operatorList.Any())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: blue;"&gt;int&lt;/span&gt;&lt;span style="background: yellow;"&gt; minPrecedence = operatorList&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;.Select(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()]).Min();&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; op = operatorList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Last(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()] == minPrecedence);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (op != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList1 = symbols.TakeWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e1 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e1 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList2 = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol).Skip(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e2 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e2 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt; io = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;(op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(e1, io, e2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;And finally, we find the infix operator:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z2 = symbolsWithIndex.Zip(z, (v1, v2) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SymbolWithIndex = v1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Depth = v2,&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; operatorList = z2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(x =&amp;gt; x.Depth == 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.SymbolWithIndex.Index != 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;.Produce(x.SymbolWithIndex.Symbol) != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (operatorList.Any())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; minPrecedence = operatorList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(o2 =&amp;gt;&lt;span style="background: yellow;"&gt; &lt;/span&gt;OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()]).Min();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: blue;"&gt;var&lt;/span&gt;&lt;span style="background: yellow;"&gt; op = operatorList&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;.Last(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()] == minPrecedence);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (op != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList1 = symbols.TakeWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: aqua;"&gt; e1 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList1);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e1 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList2 = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol).Skip(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: aqua;"&gt; e2 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList2);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e2 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt; io = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;(op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: lime; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: lime;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(e1, io, e2);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;If we found an operator, then we can new-up (highlighted in green) an instance of NoSpaceExpression, passing the symbols before and after the infix operator to Expression.Produce (highlighted in cyan).&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;After parsing the sample expression, &amp;ldquo;1+((2+3)*4)^5&amp;rdquo;, the parser produces the following parse tree:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;Formula &amp;gt;1+((2+3)*4)^5&amp;lt;&lt;br /&gt;&amp;nbsp; Expression &amp;gt;1+((2+3)*4)^5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;1+((2+3)*4)^5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumericalConstant &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SignificandPart &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WholeNumberPart &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DigitSequence &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfixOperator &amp;gt;+&amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffff00;"&gt;&amp;lt;=&amp;nbsp;the + operator has lower precedence, so is nearer to the root of the tree, and will be evaluated last&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Plus &amp;gt;+&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;((2+3)*4)^5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;((2+3)*4)^5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;((2+3)*4)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;((2+3)*4)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenParenthesis &amp;gt;(&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;(2+3)*4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;(2+3)*4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;(2+3)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NospaceExpression &amp;gt;(2+3)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenParenthesis &amp;gt;(&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;2+3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;2+3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumericalConstant &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SignificandPart &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WholeNumberPart &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DigitSequence &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;2&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfixOperator &amp;gt;+&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Plus &amp;gt;+&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NumericalConstant &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SignificandPart &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WholeNumberPart &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DigitSequence &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseParenthesis &amp;gt;)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfixOperator &amp;gt;*&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asterisk &amp;gt;*&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumericalConstant &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SignificandPart &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WholeNumberPart &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DigitSequence &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;4&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseParenthesis &amp;gt;)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfixOperator &amp;gt;^&amp;lt;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffff00;"&gt;&amp;lt;= the ^ operator has higher precedence, so&amp;nbsp;is closer to&amp;nbsp;leaves of the tree, so will be evaluated first&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Caret &amp;gt;^&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumericalConstant &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SignificandPart &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WholeNumberPart &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DigitSequence &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;5&amp;lt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Following is the complete listing of the simple parser.&amp;nbsp; While I haven&amp;rsquo;t discussed every class in the parser, I&amp;rsquo;ve introduced every technique that I&amp;rsquo;ve used in writing the Produce methods for each class.&amp;nbsp; To run this example, you can simply copy/paste this example into Visual Studio and run it.&amp;nbsp; There are no dependencies.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; SimpleParser&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; ConstituentSymbols { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; s = ConstituentSymbols.Select(ct =&amp;gt; ct.ToString()).StringConcatenate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; s; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Symbol(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; ls = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (item &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ls.Add((&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (item &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item2 &lt;span style="color: blue;"&gt;in&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;)item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ls.Add(item2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// If this error is thrown, the parser is coded incorrectly.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Internal error"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConstituentSymbols = ls;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Symbol() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// formula = expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; e == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: blue;"&gt;null&lt;/span&gt; : &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt;(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Formula(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// expression = *whitespace nospace-expression *whitespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; whiteSpaceBefore = symbols.TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; whiteSpaceAfter = symbols.Reverse().TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; noSpaceSymbolList = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Skip(whiteSpaceBefore)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipLast(whiteSpaceAfter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; n = &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;.Produce(noSpaceSymbolList);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Enumerable&lt;/span&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceBefore),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Enumerable&lt;/span&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceAfter));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Expression (&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; OperatorPrecedence = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"^"&lt;/span&gt;, 3 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"*"&lt;/span&gt;, 2 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"/"&lt;/span&gt;, 2 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"+"&lt;/span&gt;, 1 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;span style="color: #a31515;"&gt;"-"&lt;/span&gt;, 1 },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// nospace-expression = open-parenthesis expression close-parenthesis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / numerical-constant&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / prefix-operator expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / expression infix-operator expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!symbols.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbols.First() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; &amp;amp;&amp;amp; symbols.Last() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1).SkipLast(1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;(), e, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// expression, infix-operator, expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; z = symbols.Rollup(0, (t, d) =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (t &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; symbolsWithIndex = symbols.Select((s, i) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Symbol = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index = i,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; z2 = symbolsWithIndex.Zip(z, (v1, v2) =&amp;gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SymbolWithIndex = v1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Depth = v2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; operatorList = z2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(x =&amp;gt; x.Depth == 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.SymbolWithIndex.Index != 0 &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;.Produce(x.SymbolWithIndex.Symbol) != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (operatorList.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; minPrecedence = operatorList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()]).Min();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; op = operatorList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Last(o2 =&amp;gt; OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()] == minPrecedence);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (op != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList1 = symbols.TakeWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e1 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e1 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expressionTokenList2 = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipWhile(t =&amp;gt; t != op.SymbolWithIndex.Symbol).Skip(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e2 = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(expressionTokenList2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e2 == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid expression"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt; io = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;(op.SymbolWithIndex.Symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(e1, io, e2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt; n = &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(n);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt; p = &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt;.Produce(symbols.FirstOrDefault());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (p != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(p, e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NospaceExpression(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// numerical-constant = [neg-sign] significand-part&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; s = &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (s != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt; n = &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt;.Produce(symbols.First());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; s2 = &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;.Produce(symbols.Skip(1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (s2 != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;(n, s2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NumericalConstant(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// significand-part = whole-number-part [fractional-part] / fractional-part&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt; f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f = &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (f != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;(f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; s = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt; w = &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt;.Produce(symbols, &lt;span style="color: blue;"&gt;out&lt;/span&gt; s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (w != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!s.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;(w);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f = &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt;.Produce(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (f != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;(w, f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; SignificandPart(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;out&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbolsToProcess)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// whole-number-part = digit-sequence&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; s = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; d = &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt;.Produce(symbols, &lt;span style="color: blue;"&gt;out&lt;/span&gt; s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (d != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = s;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt;(d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; WholeNumberPart(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// fractional-part = full-stop digit-sequence&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!symbols.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbols.First() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; s = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; d = &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt;.Produce(symbols.Skip(1), &lt;span style="color: blue;"&gt;out&lt;/span&gt; s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (d == &lt;span style="color: blue;"&gt;null&lt;/span&gt; || s.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt;(), d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; FractionalPart(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;out&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbolsToProcess)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// digit-sequence = 1*decimal-digit&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; digits = symbols.TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (digits.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = symbols.Skip(digits.Count());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt;(digits);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; DigitSequence(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// neg-sign = minus&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt;(symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NegSign(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// prefix-operator = plus / minus&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt; || symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt;(symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; PrefixOperator(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// infix-operator = caret / asterisk / forward-slash / plus / minus&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt; || symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt; || symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Asterisk&lt;/span&gt; || symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ForwardSlash&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Caret&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InfixOperator&lt;/span&gt;(symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; InfixOperator(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; CharacterValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; CharacterValue; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; DecimalDigit(&lt;span style="color: blue;"&gt;char&lt;/span&gt; c) { CharacterValue = c.ToString(); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;" "&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; WhiteSpace() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"+"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Plus() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"-"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Minus() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Asterisk&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"*"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Asterisk() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ForwardSlash&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"/"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ForwardSlash() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Caret&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"^"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Caret() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"."&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; FullStop() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"("&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; OpenParenthesis() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;")"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; CloseParenthesis() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; ParseFormula(&lt;span style="color: blue;"&gt;string&lt;/span&gt; s)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols = s.Select(c =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'0'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'1'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'2'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'3'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'4'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'5'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'6'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'7'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'8'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'9'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt;(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;' '&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'+'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'-'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'*'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Asterisk&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'/'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ForwardSlash&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'^'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Caret&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'.'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'('&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;')'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;default&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&lt;span style="color: blue;"&gt;#if&lt;/span&gt; false&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (symbols.Any())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Terminal Symbols");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("================");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var terminal in symbols)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{0} &amp;gt;{1}&amp;lt;", terminal.GetType().Name.ToString(),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; terminal.ToString());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; formula = &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (formula == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid formula"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; formula;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; DumpSymbolRecursive(&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb, &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol, &lt;span style="color: blue;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}{1} &amp;gt;{2}&amp;lt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;.PadRight(depth * 2),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol.GetType().Name.ToString(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol.ToString())).Append(&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol.ConstituentSymbols != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; childSymbol &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbol.ConstituentSymbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DumpSymbolRecursive(sb, childSymbol, depth + 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[] sampleValidFormulas = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"1+((2+3)*4)^5"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;"1+2-3*4/5^6"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"(1+2)/3"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"&amp;nbsp; (1+3)&amp;nbsp; "&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-123"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"1+2*(-3)"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"1+2*( - 3)"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"12.34"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;".34"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-123+456"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"&amp;nbsp; (&amp;nbsp; 123 + 456 )&amp;nbsp; "&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-.34"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-12.34"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-(123+456)"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt;[] sampleInvalidFormulas = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-(123+)"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"-(*123)"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"*123"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a31515;"&gt;"*123a"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"1."&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;"--1"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; formula &lt;span style="color: blue;"&gt;in&lt;/span&gt; sampleValidFormulas)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; f = &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;.ParseFormula(formula);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;.DumpSymbolRecursive(sb, f, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&lt;span style="color: #a31515;"&gt;"=================================="&lt;/span&gt; + &lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; formula &lt;span style="color: blue;"&gt;in&lt;/span&gt; sampleInvalidFormulas)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; exceptionThrown = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; f = &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;.ParseFormula(formula);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt; e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exceptionThrown = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"Parsing &amp;gt;{0}&amp;lt; Exception: {1}"&lt;/span&gt;, formula, e.Message) +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!exceptionThrown)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;sb.Append(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"Parsing &amp;gt;{0}&amp;lt; Should have thrown exception, but did not"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formula) + &lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(sb.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ParserException(&lt;span style="color: blue;"&gt;string&lt;/span&gt; message) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(message) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MyExtensions&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; SkipLast&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; count)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Queue&lt;/span&gt;&amp;lt;T&amp;gt; saveList = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Queue&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; saved = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (T item &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (saved &amp;lt; count)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; saveList.Enqueue(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++saved;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; saveList.Enqueue(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; saveList.Dequeue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; StringConcatenate(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt; s &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; StringConcatenate&amp;lt;T&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; projectionFunc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; source.Aggregate(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (s, i) =&amp;gt; s.Append(projectionFunc(i)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s =&amp;gt; s.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TResult&amp;gt; Rollup&amp;lt;TSource, TResult&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TResult seed,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, TResult, TResult&amp;gt; projection)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TResult nextSeed = seed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (TSource src &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TResult projectedValue = projection(src, nextSeed);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nextSeed = projectedValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; projectedValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10067150" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Recursive+Descent+Parser/">Recursive Descent Parser</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SpreadsheetML/">SpreadsheetML</category></item><item><title>Building a Simple Recursive Descent Parser (continued)</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/08/03/building-a-simple-recursive-descent-parser-continued.aspx</link><pubDate>Tue, 03 Aug 2010 18:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10045505</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/08/03/building-a-simple-recursive-descent-parser-continued.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In this post, I further enhance the recursive descent parser that will parse the simple grammar that I presented previously in this series.&amp;nbsp; I&amp;rsquo;ll examine some more classes that represent symbols in that grammar.&amp;nbsp; The classes I present in this post further show how it&amp;rsquo;s possible to write LINQ code that closely parallels the grammar.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on using LINQ to write a recursive-descent parser for SpreadsheetML formulas.&amp;nbsp; &lt;span style="background-color: #ffff99;"&gt;You can find the complete list of posts &lt;/span&gt;&lt;a href="http://ericwhite.com/blog/map/recursive-descent-parser/"&gt;&lt;span style="background-color: #ffff99;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: #ffff99;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In this version of the parser, I&amp;rsquo;ll enhance the parser to a certain extent, but it still will not be a full implementation of the simple grammar that I defined.&amp;nbsp; In particular, I&amp;rsquo;m not going to implement infix operators until the next post.&amp;nbsp; Infix operators are a bit more involved, particularly because we need to implement operator precedence.&amp;nbsp; It is not a lot of code, but I use a few useful little LINQ tricks that deserve explanations.&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The NospaceExpression Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In the last version of the parser, I implemented a &amp;lsquo;dummy&amp;rsquo; NospaceExpression class.&amp;nbsp; For development and testing purposes, any sequence of symbols passed to that implementation of the NospaceExpression.Produce method were considered to make up a valid nospace-expression symbol.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In this post, I&amp;rsquo;ll simplify the grammar for the NospaceExpression symbol to the following, eliminating infix operators:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// nospace-expression = open-parenthesis expression close-parenthesis&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / numerical-constant&lt;/span&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / prefix-operator expression&lt;/span&gt;&lt;br /&gt;&lt;s&gt;&lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / expression infix-operator expression&lt;/span&gt;&lt;/s&gt;&lt;span style="color: green;"&gt;&amp;nbsp; (not implemented yet)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Here is this implementation of the NospaceExpression class:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// nospace-expression = open-parenthesis expression close-parenthesis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / numerical-constant&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / prefix-operator expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;s&gt;&lt;span style="color: green;"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; / expression infix-operator expression&lt;/span&gt;&lt;/s&gt;&lt;span style="color: green;"&gt;&amp;nbsp; (not implemented yet)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!symbols.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: green;"&gt;// nospace-expression = open-parenthesis expression close-parenthesis&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: yellow;"&gt; (symbols.First() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; &amp;amp;&amp;amp; symbols.Last() &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: yellow;"&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1).SkipLast(1));&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: yellow;"&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: yellow;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;(), e, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;());&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: lime; color: green;"&gt;// numerical-constant&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: lime; color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;&lt;span style="background: lime;"&gt; n = &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;.Produce(symbols);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: lime; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: lime;"&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: lime; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: lime;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(n);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: green;"&gt;// prefix-operator expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: #2b91af;"&gt;PrefixOperator&lt;/span&gt;&lt;span style="background: aqua;"&gt; p = &lt;span style="color: #2b91af;"&gt;PrefixOperator&lt;/span&gt;.Produce(symbols.FirstOrDefault());&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: aqua;"&gt; (p != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: #2b91af;"&gt;Expression&lt;/span&gt;&lt;span style="background: aqua;"&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols.Skip(1));&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: blue;"&gt;if&lt;/span&gt;&lt;span style="background: aqua;"&gt; (e != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background: aqua;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(p, e);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: aqua;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NospaceExpression(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;span style="background: yellow;"&gt;Yellow code&lt;/span&gt;: The nospace-expression symbol is made up of three possible sets of constituent tokens.&amp;nbsp; It could be made up of an open parenthesis, an expression, and a close parenthesis.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;span style="background: lime;"&gt;Green code&lt;/span&gt;: It could be made up of a numerical constant.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;span style="background: aqua;"&gt;Cyan code&lt;/span&gt;: It could be made up of a prefix operator followed by a NospaceExpression.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;If it is none of those three, then the Produce method returns null.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;You can see that the C# / LINQ code to process the constituent symbols and produce a symbol has a direct correlation to the grammar.&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The NumericalConstant Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The next class I&amp;rsquo;ll examine in this post is the NumericalConstant class.&amp;nbsp; One interesting characteristic of the grammar associated with this class is that it contains an optional symbol in the grammar, indicated by the square brackets:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// numerical-constant = [neg-sign] significand-part&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This is described in the post on the &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/07/06/recursive-descent-parser-using-linq-the-augmented-backus-naur-form-grammar.aspx"&gt;Augmented Backus-Naur Form Grammar&lt;/a&gt;, which discusses the various notations that we need to pay attention to.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The NumericalConstant.Produce method first attempts to produce a SignificandPart symbol using the complete list of constituent symbols that was passed to it.&amp;nbsp; If successful, the method can produce a NumericalConstant object with one constituent symbol, the SignificandPart object.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;If SignificandPart fails to produce a symbol, then this method asks the NegSign.Produce method to produce a NegSign object, passing the first symbol in the collection to it.&amp;nbsp; If that was successful, then the method asks the SignificandPart class to produce a symbol using a collection of all symbols except the first one (using the Skip extension method).&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// numerical-constant = [neg-sign] significand-part&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; s = &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (s != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt; n = &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt;.Produce(symbols.First());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; s2 = &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;.Produce(symbols.Skip(1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (s2 != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericalConstant&lt;/span&gt;(n, s2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NumericalConstant(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One key point about the NegSign.Produce method: it will be asked to produce a symbol only for a single symbol, which will be a Minus symbol, so for simplicity, its Produce method takes a singleton Symbol instead of a collection.&amp;nbsp; Here is the NegSign class:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// neg-sign = minus&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NegSign&lt;/span&gt;(symbol);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NegSign(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The SignificandPart Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;As a last example in this post, let&amp;rsquo;s take a look at the significand-part symbol, which is comprised of one of:&lt;/p&gt;
&lt;ul&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;A fractional part&lt;/div&gt;
&lt;/li&gt;
&lt;li style="font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;
&lt;div style="margin: 0in 0in 10pt;" class="MsoNormal"&gt;A whole-number-part followed by an optional fractional-part&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;// significand-part = fractional-part / whole-number-part [fractional-part]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To process this grammar, the first thing to do is to ask the FractionalPart class to produce a symbol, passing all of the symbols that were passed to SignificandPart.Produce.&amp;nbsp; If the FractionalPart class can produce that symbol, then the method can return a SignificandPart object.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;If the FractionalPart class can&amp;rsquo;t produce a symbol, then SignificandPart.Produce needs to ask the WholeNumberPart class to produce a symbol.&amp;nbsp; However, if there is a fractional part following the WholeNumberPart, WholeNumberPart.Produce will not consume all of the constituent symbols.&amp;nbsp; Therefore, WholeNumberPart.Produce has an additional out argument, which will contain any unprocessed symbols.&amp;nbsp; If the unprocessed symbols collection is empty, then there is no fractional part, and SignificandPart can produce its symbol (which has no fractional part).&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;However, if the unprocessed symbols collection is not empty, then SignificandPart.Produce will ask FractionalPart.Produce to produce a FractionalPart with the unprocessed symbols, and if it does, then SignificandPart.Produce can produce its symbol.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This sounds more complicated than it is.&amp;nbsp; Here is the implementation of the SignificandPart class:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// significand-part = fractional-part / whole-number-part [fractional-part]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt; f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f = &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (f != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;(f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; s = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt; w = &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt;.Produce(symbols, &lt;span style="color: blue;"&gt;out&lt;/span&gt; s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (w != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!s.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;(w);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f = &lt;span style="color: #2b91af;"&gt;FractionalPart&lt;/span&gt;.Produce(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (f != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SignificandPart&lt;/span&gt;(w, f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; SignificandPart(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;And here is the WholeNumberPart class, which potentially will not consume all of the symbols that are passed to its Produce method.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;out&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbolsToProcess)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// whole-number-part = digit-sequence&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; unprocessedSymbols = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; d = &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt;.Produce(symbols, &lt;span style="color: blue;"&gt;out&lt;/span&gt; unprocessedSymbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (d != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = unprocessedSymbols;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WholeNumberPart&lt;/span&gt;(d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; WholeNumberPart(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;It, in turn, is comprised of a DigitSequence symbol, which is interesting in that it provides another example of how the LINQ code parallels the grammar.&amp;nbsp; A DigitSequence is comprised of one or more DecimalDigit symbols (which are terminals).&amp;nbsp; The LINQ code essentially says: query for the first n DecimalDigit symbols in the sequence.&amp;nbsp; If there are any, then return a DigitSequence symbol, and set the out parameter to the unprocessed symbols.&amp;nbsp; If there aren&amp;rsquo;t any, then return null.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;out&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbolsToProcess)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// digit-sequence = 1*decimal-digit&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; digits = symbols.TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (digits.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = symbols.Skip(digits.Count());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DigitSequence&lt;/span&gt;(digits);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbolsToProcess = &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; DigitSequence(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In the next post, I&amp;rsquo;ll dive into processing infix operators, and how we can write succinct code to implement operator precedence.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10045505" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Recursive+Descent+Parser/">Recursive Descent Parser</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SpreadsheetML/">SpreadsheetML</category></item><item><title>Building a Simple Recursive Descent Parser</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/30/building-a-simple-recursive-descent-parser.aspx</link><pubDate>Fri, 30 Jul 2010 13:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10044245</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/30/building-a-simple-recursive-descent-parser.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In this post, I present the start of a recursive descent parser that will parse the simple grammar that I presented previously in this series.&amp;nbsp; I&amp;rsquo;ll point out some key features of the code so that it is easy to see how the code works.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on using LINQ to write a recursive-descent parser for SpreadsheetML formulas.&amp;nbsp; &lt;span style="background-color: #ffff99;"&gt;You can find the complete list of posts &lt;/span&gt;&lt;a href="http://ericwhite.com/blog/map/recursive-descent-parser/"&gt;&lt;span style="background-color: #ffff99;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: #ffff99;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The Symbol Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;We need to write a class for each symbol (production) in the grammar.&amp;nbsp; Most of these classes have a method named Produce that given a collection of Symbol objects, produces an instance of that symbol.&amp;nbsp; Each Produce method in the various classes is free to return null if the collection that is passed to the method can&amp;rsquo;t produce that symbol.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;We need to define an abstract base class for each of these classes.&amp;nbsp; Most instances of classes that derive from the abstract base class will contain a list of constituent symbols, so the abstract base class includes a public property, ConstituentSymbols, of type List&amp;lt;Symbol&amp;gt;.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The ToString method for each of these classes returns the string representation of the symbol.&amp;nbsp; If a symbol is comprised of a list of constituent symbols (i.e. is not a terminal), then the ToString method returns the concatenated strings of the constituent symbols.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There is a constructor for Symbol that takes a params array of Object.&amp;nbsp; Each element in the params array can either be an instance of Symbol, or an object that implements IEnumerable&amp;lt;Symbol&amp;gt;.&amp;nbsp; Those are the only valid types in the params array.&amp;nbsp; The constructor throws an internal ParserException if anything other than one of those types is passed as an argument.&amp;nbsp; I explained this idiom in the previous post in this series, &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/07/15/creating-a-collection-from-singletons-and-collections-using-linq.aspx"&gt;&lt;span style="color: #0000ff;"&gt;Creating a Collection from Singletons and Collections using LINQ&lt;/span&gt;&lt;/a&gt;.&amp;nbsp; This method also uses the StringConcatenate extension method, which I discussed in &lt;a class="eric-link" href="http://msdn.microsoft.com/en-us/library/bb669175.aspx"&gt;&lt;span style="color: #0000ff;"&gt;this topic in the LINQ to XML documentation&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; ConstituentSymbols { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; s = ConstituentSymbols.Select(ct =&amp;gt; ct.ToString()).StringConcatenate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; s;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Symbol(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; ls = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (item &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ls.Add((&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (item &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item2 &lt;span style="color: blue;"&gt;in&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;)item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ls.Add(item2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// If this error is thrown, the parser is coded incorrectly.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Internal error"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConstituentSymbols = ls;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Symbol() { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The OpenParenthesis Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;There are two varieties of symbols &amp;ndash; terminal, and non-terminal.&amp;nbsp; I discussed both types of symbols in the post on the &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/07/06/recursive-descent-parser-using-linq-the-augmented-backus-naur-form-grammar.aspx"&gt;Augmented Backus-Naur Form Grammar&lt;/a&gt;.&amp;nbsp; A subclass of the Symbol class for terminal symbols is super simple.&amp;nbsp; It contains an override of the ToString method, which returns the string of the terminal.&amp;nbsp; Due to the semantics of C#, it also needs to include a constructor with no parameters:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"("&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; OpenParenthesis() { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;All of the terminals except for DecimalDigit look like the OpenParenthesis class.&amp;nbsp; DecimalDigit is similar, except that its constructor takes a character, and the ToString method returns that character.&amp;nbsp; To make the code as succinct as possible, digits are stored as strings instead of characters.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; CharacterValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; CharacterValue; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; DecimalDigit(&lt;span style="color: blue;"&gt;char&lt;/span&gt; c) { CharacterValue = c.ToString(); }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The Formula Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;A derived class for non-terminal symbols is also pretty simple.&amp;nbsp; There is one public method, Produce, which takes a collection of Symbol objects, and then produces an instance of the class if it can; otherwise it returns null.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Recursive descent parsers are &amp;lsquo;top-down&amp;rsquo; parsers, so it makes sense to define the Formula class first.&amp;nbsp; If you examine the &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/07/13/recursive-descent-parser-a-simple-grammar.aspx"&gt;simple grammar&lt;/a&gt; that I defined, you can see that a formula is comprised of an expression, so the Formula.Produce method simply passes on the collection of Symbol objects to the Expression.Produce method.&amp;nbsp; Again, due to the semantics of C#, it is necessary to define the constructor that takes a params array of Object, but it doesn&amp;rsquo;t need to do anything other than call the constructor in the base class.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// formula = expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; e == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: blue;"&gt;null&lt;/span&gt; : &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt;(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Formula(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The Expression Class&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The Expression class is more interesting.&amp;nbsp; The grammar production for Expression is as follows:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: green;"&gt;expression = *whitespace nospace-expression *whitespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;This means that an expression consists of zero or more WhiteSpace symbols, followed by one and only one NospaceExpression, followed by zero or more WhiteSpace symbols.&amp;nbsp; Using LINQ, it is super easy to count the WhiteSpace symbols at the beginning and end of the collection of symbols.&amp;nbsp; The Expression.Produce method can then pass the symbols in the middle (between the white space) to NospaceExpression.Produce.&amp;nbsp; If that method returns a NospaceExpression object, then the method can instantiate an Expression object and return it.&amp;nbsp; The Expression.Process&amp;nbsp;method makes use of the &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2008/11/14/the-skiplast-extension-method.aspx"&gt;SkipLast extension method&lt;/a&gt;.&amp;nbsp; The Expression class looks like this:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// expression = *whitespace nospace-expression *whitespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; whiteSpaceBefore = symbols.TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; whiteSpaceAfter = symbols.Reverse().TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; noSpaceSymbolList = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Skip(whiteSpaceBefore)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipLast(whiteSpaceAfter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; n = &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;.Produce(noSpaceSymbolList);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Enumerable&lt;/span&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceBefore),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Enumerable&lt;/span&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceAfter));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Expression (&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;I follow the same pattern for every class &amp;ndash; the grammar is included in a comment, followed by a bit of LINQ code to produce an instance of the class, returning null if necessary.&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Let&amp;rsquo;s look at the code to instantiate the Expression object:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: #2b91af;"&gt;Enumerable&lt;/span&gt;&lt;span style="background: yellow;"&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceBefore)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: lime;"&gt;n,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; color: #2b91af;"&gt;Enumerable&lt;/span&gt;&lt;span style="background: yellow;"&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceAfter)&lt;/span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;The arguments in yellow are collections of Symbol.&amp;nbsp; The parameter n, which is of type NospaceExpression, is a singleton, so we&amp;rsquo;re taking advantage of the ability to &lt;a class="eric-link" href="http://blogs.msdn.com/b/ericwhite/archive/2010/07/15/creating-a-collection-from-singletons-and-collections-using-linq.aspx"&gt;&lt;span style="color: #0000ff;"&gt;pass either singletons or collections to the Expression constructor&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p style="page-break-after: avoid; margin: 24pt 0in 0pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;&lt;b&gt;&lt;span style="color: #365f91;"&gt;The NospaceExpression Class&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;To keep this first example as simple as possible, we&amp;rsquo;ll implement a dummy NospaceExpression class.&amp;nbsp; We&amp;rsquo;ll pretend that any collection of symbols is a valid NospaceExpression symbol.&amp;nbsp; In the next post, I&amp;rsquo;ll examine how we need to code the NospaceExpression class, as well as classes for some of the other symbols.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NospaceExpression(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;Projecting a Collection of Symbols from a String&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;One aspect of the approach that I took is that I first projected a collection of terminal Symbol objects from the collection of characters that make up the string being parsed.&amp;nbsp; The string class implements IEnumerable&amp;lt;char&amp;gt; so we can do a simple select, as follows:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols = s.Select(c =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'0'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'1'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'2'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'3'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'4'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'5'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'6'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'7'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'8'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'9'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt;(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;' '&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'+'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'-'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'*'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Asterisk&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'/'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ForwardSlash&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'^'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Caret&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'.'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'('&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;')'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;default&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;});&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;If we parse the formula " (1+3)&amp;nbsp; ", and dump out the terminal symbols, we see this:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;Terminal Symbols&lt;br /&gt;================&lt;br /&gt;WhiteSpace &amp;gt; &amp;lt;&lt;br /&gt;OpenParenthesis &amp;gt;(&amp;lt;&lt;br /&gt;DecimalDigit &amp;gt;1&amp;lt;&lt;br /&gt;Plus &amp;gt;+&amp;lt;&lt;br /&gt;DecimalDigit &amp;gt;3&amp;lt;&lt;br /&gt;CloseParenthesis &amp;gt;)&amp;lt;&lt;br /&gt;WhiteSpace &amp;gt; &amp;lt;&lt;br /&gt;WhiteSpace &amp;gt; &amp;lt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;By first transforming the string into a collection of terminals, it allows us to write more expressive code.&amp;nbsp; It is easier to read this code:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;If (t is WhiteSpace)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;It is a bit harder to read this:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;If (t is Character &amp;amp;&amp;amp; t.ToString() == " " )&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;The DumpSymbolRecursive Method&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;As you can see, Symbol objects form a hierarchical tree &amp;ndash; each symbol (except for terminals) has constituent symbols.&amp;nbsp; This allows us to write a recursive method to dump symbols to a StringBuilder object.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; DumpSymbolRecursive(&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb, &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol, &lt;span style="color: blue;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}{1} &amp;gt;{2}&amp;lt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;.PadRight(depth * 2),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol.GetType().Name.ToString(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol.ToString())).Append(&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol.ConstituentSymbols != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; childSymbol &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbol.ConstituentSymbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DumpSymbolRecursive(sb, childSymbol, depth + 1);&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;If we parse the formula &amp;ldquo; (1+3)&amp;nbsp; &amp;rdquo; and dump it, we see:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;Formula &amp;gt; (1+3)&amp;nbsp; &amp;lt;&lt;br /&gt;&amp;nbsp; Expression &amp;gt; (1+3)&amp;nbsp; &amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WhiteSpace &amp;gt; &amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NospaceExpression &amp;gt;(1+3)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenParenthesis &amp;gt;(&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;1&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Plus &amp;gt;+&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DecimalDigit &amp;gt;3&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseParenthesis &amp;gt;)&amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WhiteSpace &amp;gt; &amp;lt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WhiteSpace &amp;gt; &amp;lt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;We can see the instances of the Formula, Expression, and NospaceExpression classes, as well as the various terminals that make up the expression.&lt;/p&gt;
&lt;h1 style="margin: 24pt 0in 0pt;"&gt;&lt;span style="color: #365f91;"&gt;Complete Listing&lt;/span&gt;&lt;/h1&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;Here is the complete listing of the first version of the SimpleFormulaParser example.&amp;nbsp; You can simply cut and paste this code into Visual Studio, and run it.&amp;nbsp; It doesn&amp;rsquo;t have any dependencies.&amp;nbsp; It transforms a formula to a collection of terminals, prints the terminals, and then uses the Formula, Expression, and NospaceExpression classes to produce a parse tree (which is incomplete because NospaceExpression is a dummy implementation).&lt;/p&gt;
&lt;p style="margin: 0in 0in 10pt; font-family: Calibri; font-size: medium; color: black;" class="eric-para"&gt;In the next post in this series, I&amp;rsquo;ll continue to develop this simple parser.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas; font-size: small;" class="eric-code"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; SimpleParser&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; ConstituentSymbols { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; s = ConstituentSymbols.Select(ct =&amp;gt; ct.ToString()).StringConcatenate();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; s;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Symbol(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; ls = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (item &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ls.Add((&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (item &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; item2 &lt;span style="color: blue;"&gt;in&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt;)item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ls.Add(item2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// If this error is thrown, the parser is coded incorrectly.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Internal error"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConstituentSymbols = ls;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Symbol() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// formula = expression&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; e = &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; e == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: blue;"&gt;null&lt;/span&gt; : &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt;(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Formula(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// expression = *whitespace nospace-expression *whitespace&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; whiteSpaceBefore = symbols.TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; whiteSpaceAfter = symbols.Reverse().TakeWhile(s =&amp;gt; s &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; noSpaceSymbolList = symbols&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Skip(whiteSpaceBefore)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SkipLast(whiteSpaceAfter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; n = &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;.Produce(noSpaceSymbolList);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (n != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2b91af;"&gt;Enumerable&lt;/span&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceBefore),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Enumerable&lt;/span&gt;.Repeat(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;(), whiteSpaceAfter));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Expression (&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt; Produce(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NospaceExpression&lt;/span&gt;(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NospaceExpression(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] symbols) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(symbols) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; CharacterValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; CharacterValue; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; DecimalDigit(&lt;span style="color: blue;"&gt;char&lt;/span&gt; c) { CharacterValue = c.ToString(); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;" "&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; WhiteSpace() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"+"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Plus() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"-"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Minus() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Asterisk&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"*"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Asterisk() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ForwardSlash&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"/"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ForwardSlash() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Caret&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"^"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Caret() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"."&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; FullStop() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"("&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; OpenParenthesis() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString() { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #a31515;"&gt;")"&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; CloseParenthesis() { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; ParseFormula(&lt;span style="color: blue;"&gt;string&lt;/span&gt; s)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;&amp;gt; symbols = s.Select(c =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'0'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'1'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'2'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'3'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'4'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'5'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'6'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'7'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'8'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'9'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DecimalDigit&lt;/span&gt;(c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;' '&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WhiteSpace&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'+'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Plus&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'-'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Minus&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'*'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Asterisk&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'/'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ForwardSlash&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'^'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Caret&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'.'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FullStop&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;'('&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OpenParenthesis&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;')'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CloseParenthesis&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;default&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt;)&lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&lt;span style="color: blue;"&gt;#if&lt;/span&gt; true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbols.Any())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"Terminal Symbols"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"================"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; terminal &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515;"&gt;"{0} &amp;gt;{1}&amp;lt;"&lt;/span&gt;, terminal.GetType().Name.ToString(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; terminal.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;span style="color: blue;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt; formula = &lt;span style="color: #2b91af;"&gt;Formula&lt;/span&gt;.Produce(symbols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (formula == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Invalid formula"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; formula;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; DumpSymbolRecursive(&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb, &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; symbol, &lt;span style="color: blue;"&gt;int&lt;/span&gt; depth)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}{1} &amp;gt;{2}&amp;lt;"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;.PadRight(depth * 2),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol.GetType().Name.ToString(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; symbol.ToString())).Append(&lt;span style="color: #2b91af;"&gt;Environment&lt;/span&gt;.NewLine);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (symbol.ConstituentSymbols != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; childSymbol &lt;span style="color: blue;"&gt;in&lt;/span&gt; symbol.ConstituentSymbols)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DumpSymbolRecursive(sb, childSymbol, depth + 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Symbol&lt;/span&gt; f = &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;.ParseFormula(&lt;span style="color: #a31515;"&gt;" (1+3)&amp;nbsp; "&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;SimpleFormulaParser&lt;/span&gt;.DumpSymbolRecursive(sb, f, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(sb.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ParserException&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ParserException(&lt;span style="color: blue;"&gt;string&lt;/span&gt; message) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(message) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MyExtensions&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; SkipLast&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; count)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Queue&lt;/span&gt;&amp;lt;T&amp;gt; saveList = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Queue&lt;/span&gt;&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; saved = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (T item &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (saved &amp;lt; count)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; saveList.Enqueue(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++saved;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; saveList.Enqueue(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; saveList.Dequeue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; StringConcatenate(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt; s &lt;span style="color: blue;"&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; StringConcatenate&amp;lt;T&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; projectionFunc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; source.Aggregate(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(s, i) =&amp;gt; s.Append(projectionFunc(i)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s =&amp;gt; s.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10044245" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Recursive+Descent+Parser/">Recursive Descent Parser</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SpreadsheetML/">SpreadsheetML</category></item><item><title>Table Markup in Open XML SpreadsheetML</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/21/table-markup-in-open-xml-spreadsheetml.aspx</link><pubDate>Wed, 21 Jul 2010 13:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10040921</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/21/table-markup-in-open-xml-spreadsheetml.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a href="http://ericwhite.com/blog/toc-expanded" class="eric-link"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Tables are a feature in Open XML spreadsheets that allow you to interact with data more like a database.&amp;nbsp; You can select a region and convert it to a table.&amp;nbsp; Most Excel aficionados are familiar with this feature.&amp;nbsp; It is very useful.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/6505.b1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In a previous post, &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2008/11/14/using-linq-to-query-excel-tables.aspx"&gt;Using LINQ to Query Excel Tables&lt;/a&gt;, I presented some code that allows you to write LINQ queries over Excel tables.&amp;nbsp; The code that retrieves rows from the table is somewhat involved.&amp;nbsp; To be blunt, in that code, I got it wrong.&amp;nbsp; The code reported incorrect values for cells if you reordered, deleted, or inserted columns in the table.&amp;nbsp; I&amp;rsquo;ve now corrected the code and replaced the attachment to that post, which is a zip file that contains the code, as well as sample spreadsheets.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post presents a summary of the Open XML SpreadsheetML markup that you use to define or query a table.&amp;nbsp; I&amp;rsquo;ll show the markup for the very simple table in the above screen-clipping.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;We find the definitions for the table in a table part (following is a screen-clippings of the Visual Studio OPC Package Editor, which is an invaluable tool for exploring and editing Open XML documents):&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/6013.b2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The following listing shows the markup in that part.&amp;nbsp; You can see that there are three columns.&amp;nbsp; The tableColumn elements are in the same order as they occur in the table.&amp;nbsp; The ref attribute of the table element contains the range that the table occupies.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515;"&gt;xml&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;UTF-8&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;standalone&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;yes&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Table1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;displayName&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Table1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;ref&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;A1:C3&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;totalsRowShown&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;autoFilter&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;ref&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;A1:C3&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tableColumns&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;count&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;3&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow; color: #a31515;"&gt;tableColumn&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;id&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;name&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;Name&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow; color: #a31515;"&gt;tableColumn&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;id&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;4&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;name&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;Gender&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow; color: #a31515;"&gt;tableColumn&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;id&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;2&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;name&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;Age&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tableColumns&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tableStyleInfo&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;TableStyleMedium2&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;showFirstColumn&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;showLastColumn&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;showRowStripes&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;showColumnStripes&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The worksheet, sheet1, contains a relationship to the table part.&amp;nbsp; This is how we know that the table is in sheet1.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/0474.b3.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The following listing contains the worksheet sheet1.&amp;nbsp; The markup for the worksheet is basically the same as it would be for a sheet that didn&amp;rsquo;t contain a table.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515;"&gt;xml&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;UTF-8&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;standalone&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;yes&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;worksheet&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.openxmlformats.org/officeDocument/2006/relationships&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:mc&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;mc:Ignorable&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;x14ac&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:x14ac&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;dimension&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;ref&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;A1:C3&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetViews&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetView&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;tabSelected&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;workbookViewId&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;selection&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;activeCell&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;E12&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;sqref&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;E12&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetView&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetViews&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetFormatPr&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;defaultRowHeight&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;15&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;x14ac:dyDescent&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.25&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;cols&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;col&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;min&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;max&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;11&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;customWidth&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;col&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;min&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;2&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;max&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;2&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;13&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;customWidth&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;col&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;min&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;4&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;max&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;4&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;9.85546875&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;customWidth&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;cols&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetData&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;row&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;spans&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1:3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;x14ac:dyDescent&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.25&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;A1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background: yellow; color: red;"&gt;t&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;=&lt;/span&gt;&lt;span style="background: yellow;"&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;nbsp; &amp;lt;!-- s indicates that the value, 0 in this case, is an index into the shared string table --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow; color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow;"&gt;0&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;B1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;2&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;C1&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;row&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;row&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;2&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;spans&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1:3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;x14ac:dyDescent&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.25&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;A2&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&amp;nbsp; &amp;lt;!-- also an index into the shared string table --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;3&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;B2&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;4&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;C2&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow; color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="background: yellow; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background: yellow;"&gt;50&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;!-- contains the actual value of the cell --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;row&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;row&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;spans&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1:3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;x14ac:dyDescent&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.25&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;A3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;5&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;B3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;s&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;6&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;C3&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;45&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;v&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;c&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;row&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sheetData&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;pageMargins&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;left&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.7&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;right&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.7&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;top&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.75&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;bottom&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.75&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;header&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.3&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;footer&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0.3&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tableParts&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;count&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tablePart&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;r:id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;rId1&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tableParts&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;worksheet&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The following listing shows the shared string table.&amp;nbsp; The values for cells that have type = string (the attribute t == &amp;ldquo;s&amp;rdquo;) are indexes into this string table.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515;"&gt;xml&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;UTF-8&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;standalone&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;yes&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sst&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;count&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;7&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;uniqueCount&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;7&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Name&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Age&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Gender&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Eric&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;M&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Cheryl&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;F&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;t&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;si&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sst&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10040921" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/LINQ+to+XML/">LINQ to XML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/LINQ/">LINQ</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Useful+Code+Snippets/">Useful Code Snippets</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category></item><item><title>Writing and Hosting a Web Service in the SharePoint 2010 Demo Virtual Machine</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/16/writing-and-hosting-a-web-service-in-the-sharepoint-2010-demo-virtual-machine.aspx</link><pubDate>Fri, 16 Jul 2010 20:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10039288</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/16/writing-and-hosting-a-web-service-in-the-sharepoint-2010-demo-virtual-machine.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a href="http://ericwhite.com/blog/toc-expanded" class="eric-link"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Coding and hosting a WCF web service is a great way to experiment with &lt;b&gt;Business Connectivity Services&lt;/b&gt; (BCS) and &lt;b&gt;External Content Types&lt;/b&gt; (ECT). In the near future, I&amp;rsquo;m going to be writing about some of the BCS scenarios where you need to manually code the BCS model. When putting together many-to-many associations or one-to-many where you don&amp;rsquo;t have a foreign key, you need to manually edit the BCS metadata model.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;My favorite way to develop/experiment/write about SharePoint 2010 is to use the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=751fa0d1-356c-4002-9c60-d539896c66ce&amp;amp;displaylang=en" class="eric-link"&gt;2010 Information Worker Demonstration and Evaluation Virtual Machine&lt;/a&gt;. It is a great virtual machine &amp;ndash; finely tuned, and has all of the necessary software installed, including SharePoint Server 2010, Visual Studio 2010, Office 2010, etc. I do on occasion build my own virtual machines when absolutely necessary, but I consider it a necessary evil, not something that I enjoy.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Recently, I wrote a &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/05/11/getting-started-building-a-wcf-web-service.aspx" class="eric-link"&gt;blog post / MSDN article on building and hosting a WCF web service&lt;/a&gt;. However, to host the web service in the demo / evaluation virtual machine, you need to add a new web site, which is different from the procedure I presented in that post. This blog post presents the correct procedures for building/hosting the web service in that VM. Once you&amp;rsquo;ve hosted the web service, you can create an ECT from it, create a list for the ECT, set permissions for the ECT in SharePoint 2010 Central Administration, and then view the list. To do this, you can follow the procedure in &lt;a href="http://blogs.msdn.com/b/ericwhite/archive/2010/06/18/consuming-a-claims-enabled-wcf-web-service-as-an-sharepoint-2010-external-content-type.aspx" class="eric-link"&gt;Consuming a Claims-Enabled WCF Web Service as a SharePoint 2010 External Content Type&lt;/a&gt;. If you follow the steps in this blog post, you can ignore steps 26, 27, 28, and 38, which are associated with consuming the claims-aware web service. At some point in the near future, time permitting, I&amp;rsquo;m going to&amp;nbsp;write procedures for building a claims-aware web service in that virtual machine.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This web service contains only two methods: a &amp;lsquo;finder&amp;rsquo; to retrieve a collection of items, and a &amp;lsquo;specific finder&amp;rsquo; to retrieve a single item. The &amp;lsquo;database&amp;rsquo; behind the collection is just an initialized list. The &amp;lsquo;schema&amp;rsquo; of this little &amp;lsquo;database&amp;rsquo; is very simple. It is a single flat table consisting of two fields &amp;ndash; an integer &lt;b&gt;CustomerID&lt;/b&gt;, and a string &lt;b&gt;CustomerName&lt;/b&gt;. CustomerID is a unique ID.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerID = 1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerName = &lt;span style="color: #a31515;"&gt;"Bob"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerID = 2, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerName = &lt;span style="color: #a31515;"&gt;"Bill"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerID = 3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerName = &lt;span style="color: #a31515;"&gt;"Cheryl"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;br /&gt;}; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;After building and configuring this web service, you can use SharePoint Designer 2010 to create an ECT from it, and then view the data in a SharePoint list.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/1588.image_5F00_5DA37A9D.png" class="eric-link"&gt;&lt;img height="395" width="679" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/5775.image_5F00_thumb_5F00_5B1A48DF.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;As you probably know, BCS in SharePoint server 2010 is read/write. If you supply additional methods to create, update, and delete items, then you can fully maintain the data in a list. I&amp;rsquo;m interested in keeping this web service absolutely as simple as possible, so this is only a read-only implementation.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;As I mentioned, the procedure that I present here shows how to host the web service under IIS. This is the way that most implementers of such a web service will want to host it. Hosting it as a service of IIS gives lots of benefits such as process recycling, process health monitoring, and message based activation.&lt;/p&gt;
&lt;h1&gt;Creating a Web Service&lt;/h1&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Create a directory, &lt;b&gt;C:\MyWebService&lt;/b&gt;, which will contain the web service. If you use a different directory than this, you will need to alter these procedures as appropriate.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Start Visual Studio 2010.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Click &lt;b&gt;File&lt;/b&gt; =&amp;gt; &lt;b&gt;New&lt;/b&gt; =&amp;gt; &lt;b&gt;Project&lt;/b&gt;.&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;For the installed template category, select &lt;b&gt;WCF&lt;/b&gt;.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;For the template, select &lt;b&gt;WCF Service Application&lt;/b&gt;.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Target the &lt;b&gt;.NET Framework 3.5&lt;/b&gt;.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;For the location of the project, browse to the directory that you created in step 1.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Name the project &lt;b&gt;CustomersService&lt;/b&gt;.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Do not create a directory for the solution. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/6303.clip_5F00_image004_5F00_6D829994.jpg" class="eric-link"&gt;&lt;img height="473" width="666" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/2677.clip_5F00_image004_5F00_thumb_5F00_4503B780.jpg" alt="clip_image004" border="0" title="clip_image004" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Note: Don&amp;rsquo;t forget to target the .NET Framework 3.5. By default, Visual Studio will target the .NET Framework 4.0, and you must change to 3.5 for the procedure presented here to work.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In the project, rename &lt;b&gt;IService1.cs&lt;/b&gt; to &lt;b&gt;ICustomers.cs&lt;/b&gt;. Visual Studio 2010 may ask whether you would also like to perform a rename in this project of all references to the code element &amp;lsquo;IService1&amp;rsquo;? Click &lt;b&gt;Yes&lt;/b&gt;. Actually, we&amp;rsquo;re going to replace all code in all modules, so it doesn&amp;rsquo;t matter whether you click &lt;b&gt;Yes&lt;/b&gt; or &lt;b&gt;No&lt;/b&gt;.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In the project, rename &lt;b&gt;Service1.svc&lt;/b&gt; to &lt;b&gt;Customers.svc&lt;/b&gt;. After renaming these items, the Solution Explorer will look like this. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/5807.clip_5F00_image005_5F00_156598F4.png" class="eric-link"&gt;&lt;img height="219" width="274" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/1184.clip_5F00_image005_5F00_thumb_5F00_351472BC.png" alt="clip_image005" border="0" title="clip_image005" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Replace &lt;b&gt;Customers.svc&lt;/b&gt; with the following single line of markup. &lt;b&gt;Right click&lt;/b&gt; on &lt;b&gt;Customers.svc&lt;/b&gt;, and select &lt;b&gt;View Markup&lt;/b&gt;. Copy, paste, and save. &lt;br /&gt;&lt;br /&gt;&amp;lt;%@ ServiceHost Language="C#" Debug="true" Service="CustomersService.Customers" CodeBehind="Customers.svc.cs" %&amp;gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Replace &lt;b&gt;Customers.svc.cs&lt;/b&gt; with the following code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System; &lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic; &lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; CustomersService &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customers&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ICustomers&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Finder&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetAllCustomers() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerID = 1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerName = &lt;span style="color: #a31515;"&gt;"Bob"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerID = 2, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerName = &lt;span style="color: #a31515;"&gt;"Bill"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerID = 3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerName = &lt;span style="color: #a31515;"&gt;"Cheryl"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Specific finder&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; GetCustomerByID(&lt;span style="color: blue;"&gt;int&lt;/span&gt; CustomerID) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; GetAllCustomers().FirstOrDefault(c =&amp;gt; c.CustomerID == CustomerID); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;} &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Replace &lt;b&gt;ICustomers.cs&lt;/b&gt; with the following code.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System; &lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic; &lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq; &lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Runtime.Serialization; &lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.ServiceModel; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; CustomersService &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;ServiceContract&lt;/span&gt;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICustomers&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;OperationContract&lt;/span&gt;] &lt;span style="color: green;"&gt;//finder&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetAllCustomers(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;OperationContract&lt;/span&gt;] &lt;span style="color: green;"&gt;//specificFinder&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; GetCustomerByID(&lt;span style="color: blue;"&gt;int&lt;/span&gt; CustomerID); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;DataContract&lt;/span&gt;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;DataMember&lt;/span&gt;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; CustomerID { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af;"&gt;DataMember&lt;/span&gt;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; CustomerName { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;} &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Replace &lt;b&gt;Web.config&lt;/b&gt; with the following markup. In Solution Explorer, &lt;b&gt;right-click&lt;/b&gt; on &lt;b&gt;Web.config&lt;/b&gt; and select &lt;b&gt;Edit&lt;/b&gt;. Copy, paste, and save. Important note: this is the Web.config that configures this specific web service. It resides at C:\MyWebService\CustomersService.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515;"&gt;xml&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;services&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;service&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;CustomersService.Service1Behavior&lt;/span&gt;" &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;CustomersService.Customers&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;address&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;""&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;binding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;wsHttpBinding&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;contract&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;CustomersService.ICustomers&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;identity&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;dns&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;localhost&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;identity&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;address&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;mex&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;binding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;mexHttpBinding&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;contract&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;IMetadataExchange&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;service&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;services&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;CustomersService.Service1Behavior&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color: green;"&gt; To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment &lt;/span&gt;&lt;span style="color: blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;serviceMetadata&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color: green;"&gt; To receive exception details in faults for debugging purposes, set the value below to true.&amp;nbsp; Set to false before deployment to avoid disclosing exception information &lt;/span&gt;&lt;span style="color: blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;serviceDebug&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;false&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Build the application.&lt;/p&gt;
&lt;h1&gt;Add a new web site.&lt;/h1&gt;
&lt;ol&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Start Internet Information Services (IIS) Manager. Click &lt;b&gt;Start&lt;/b&gt; =&amp;gt; &lt;b&gt;All Programs&lt;/b&gt; =&amp;gt; &lt;b&gt;Administrative Tools&lt;/b&gt; =&amp;gt; &lt;b&gt;Internet Information Services (IIS) Manager&lt;/b&gt;.&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In Internet Information Services (IIS) Manager, right-click on &lt;b&gt;Sites&lt;/b&gt;, and select &lt;b&gt;Add Web Site&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/2086.clip_5F00_image006_5F00_504CCBBD.png" class="eric-link"&gt;&lt;img height="519" width="539" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/7382.clip_5F00_image006_5F00_thumb_5F00_7A4CC9E5.png" alt="clip_image006" border="0" title="clip_image006" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In the &lt;b&gt;Add Web Site&lt;/b&gt; dialog box, in the &lt;b&gt;Site name&lt;/b&gt; field, enter Customers. In the &lt;b&gt;Application Pool&lt;/b&gt; field, select &lt;b&gt;DefaultAppPool&lt;/b&gt;. In the &lt;b&gt;Physical path&lt;/b&gt; field, enter &lt;b&gt;C:\MyWebService\CustomersService&lt;/b&gt;. In the &lt;b&gt;Port&lt;/b&gt; field, enter &lt;b&gt;8181&lt;/b&gt;. In the &lt;b&gt;Host name&lt;/b&gt; field, enter &lt;b&gt;www.contoso.com&lt;/b&gt;. Click &lt;b&gt;OK&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/8372.clip_5F00_image007_5F00_650E9E70.png" class="eric-link"&gt;&lt;img height="480" width="488" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/0042.clip_5F00_image007_5F00_thumb_5F00_64363886.png" alt="clip_image007" border="0" title="clip_image007" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Validate that the web service is running. Start Internet Explorer, and browse to &lt;b&gt;http://www.contoso.com:8181/Customers.svc&lt;/b&gt;. If the web service is running, you will see the following: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/5810.clip_5F00_image009_5F00_491D6978.jpg" class="eric-link"&gt;&lt;img height="468" width="529" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/2117.clip_5F00_image009_5F00_thumb_5F00_12CC4169.jpg" alt="clip_image009" border="0" title="clip_image009" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Another interesting approach to testing the Web service is to use the WCF test client. Start a Visual Studio command prompt. Enter wcftestclient to run the WCF test client. Click &lt;b&gt;File&lt;/b&gt; =&amp;gt; &lt;b&gt;Add Service&lt;/b&gt;. Enter &lt;b&gt;http://www.contoso.com:8181/Customers.svc&lt;/b&gt; as the endpoint address, and click OK.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;If the service was added successfully, you will see the methods that the service exposes.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/7801.clip_5F00_image011_5F00_6A4D5F54.jpg" class="eric-link"&gt;&lt;img height="323" width="515" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/4657.clip_5F00_image011_5F00_thumb_5F00_77473F65.jpg" alt="clip_image011" border="0" title="clip_image011" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;b&gt;Double-click&lt;/b&gt; on &lt;b&gt;GetAllCustomers&lt;/b&gt;. This opens a window that allows you to configure the request and invoke the request. Click on Invoke to see the response from the Web service.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/3286.clip_5F00_image013_5F00_7D8E15F3.jpg" class="eric-link"&gt;&lt;img height="322" width="512" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90-metablogapi/8461.clip_5F00_image013_5F00_thumb_5F00_557B66D4.jpg" alt="clip_image013" border="0" title="clip_image013" style="display: inline; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10039288" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/BCS/">BCS</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/ECT/">ECT</category></item><item><title>Creating a Collection from Singletons and Collections using LINQ</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/15/creating-a-collection-from-singletons-and-collections-using-linq.aspx</link><pubDate>Thu, 15 Jul 2010 15:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10038678</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/15/creating-a-collection-from-singletons-and-collections-using-linq.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a href="http://ericwhite.com/blog/toc-expanded" class="eric-link"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;A key operation when doing pure functional transformations is the process of creating complex hierarchies of objects.&amp;nbsp; We see this when transforming some data source (such as an Open XML WordprocessingML document) to a LINQ to XML tree, and we see this when writing a recursive descent parser.&amp;nbsp; The recursive descent parser for Excel formulas is nothing more or less than a pure functional transform from the source string to a parse tree, which is a hierarchical object graph.&amp;nbsp; In both of these cases, objects contain &amp;lsquo;child&amp;rsquo; or &amp;lsquo;constituent&amp;rsquo; objects.&amp;nbsp; An XElement object can contain child XElement objects, and a symbol node in a parse tree is made up of &amp;lsquo;constituent&amp;rsquo; or &amp;lsquo;child&amp;rsquo; symbols.&amp;nbsp; When constructing an object there are times that you may have one or more singletons, and one or more collections that will comprise the child objects of the object you are constructing.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on using LINQ to write a recursive-descent parser for SpreadsheetML formulas.&amp;nbsp; &lt;span style="background-color: #ffff99;"&gt;You can find the complete list of posts &lt;/span&gt;&lt;a href="http://ericwhite.com/blog/map/recursive-descent-parser/"&gt;&lt;span style="background-color: #ffff99;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: #ffff99;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The question is: what is the best way to create a collection of some type T when you have one or more singletons of T, and one or more collections of T.&amp;nbsp; You want the resulting collection to contain all of the singletons and all of the collections in some particular order.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The simplest way to create a collection that contains one element from a singleton is to create an array with a single element:&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; z = 5;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; z1 = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { z };&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;So if you have a couple of singletons and a collection, you can create a new collection by creating arrays for the singletons, and then using the concat extension method to assemble the lot into a new collection:&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; x1 = 5;&lt;br /&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; x2 = 7;&lt;br /&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;[] x3 = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { 1, 2, 3 };&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; c = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { x1 }.Concat(&lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { x2 }).Concat(x3);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This isn&amp;rsquo;t bad, but there is a better way.&amp;nbsp; We can write a method that takes a params array of objects as an argument, and constructs a collection from those arguments.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;It is necessary for the method to take a params array of &lt;b&gt;&lt;span style="text-decoration: underline;"&gt;object&lt;/span&gt;&lt;/b&gt; because in C#, there is no way to declare that a particular parameter can either be a singleton of T or a collection of T.&amp;nbsp; The type system doesn&amp;rsquo;t allow for this.&amp;nbsp; We have to rely on runtime checking of types passed into the method.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MyException&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; MyException(&lt;span style="color: blue;"&gt;string&lt;/span&gt; message) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(message) { }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; AssembleCollection(&lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: blue;"&gt;object&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; arg &lt;span style="color: blue;"&gt;in&lt;/span&gt; args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt;? i = arg &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt;?;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (i != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; collection = arg &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (collection != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; c &lt;span style="color: blue;"&gt;in&lt;/span&gt; collection)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;yield&lt;/span&gt; &lt;span style="color: blue;"&gt;return&lt;/span&gt; c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MyException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Internal error - argument is not int or collection of int"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; x1 = 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; x2 = 7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt;[] x3 = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { 1, 2, 3 };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; c = AssembleCollection(x1, x2, x3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; i &lt;span style="color: blue;"&gt;in&lt;/span&gt; c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;When assembling a collection, it is easier to write code to call AssembleCollection than to use the concat extension method.&amp;nbsp; Compare the two approaches:&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; c = AssembleCollection(x1, x2, x3);&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; c = &lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { x1 }.Concat(&lt;span style="color: blue;"&gt;new&lt;/span&gt;[] { x2 }).Concat(x3);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In my opinion, the first approach is easier to read.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This is, of course, the approach that LINQ to XML takes.&amp;nbsp; In the following statement, x1, and x2 are singletons, and x3 is a collection.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: #2b91af;"&gt;XElement&lt;/span&gt; c = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"z"&lt;/span&gt;, x1, x2, x3.Where(x =&amp;gt; x.Value == &lt;span style="color: #a31515;"&gt;"5"&lt;/span&gt;));&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;And if you look at the signature of the XElement constructor, you see the idiom that I&amp;rsquo;m discussing in this post.&lt;/p&gt;
&lt;p&gt;&lt;span class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; XElement(&lt;span style="color: #2b91af;"&gt;XName&lt;/span&gt; name, &lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Object&lt;/span&gt;[] content);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The LINQ to XML object model is very, very good.&amp;nbsp; I have learned a huge amount from it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10038678" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Recursive+Descent+Parser/">Recursive Descent Parser</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SpreadsheetML/">SpreadsheetML</category></item><item><title>Recursive Descent Parser: A Simple Grammar</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/13/recursive-descent-parser-a-simple-grammar.aspx</link><pubDate>Tue, 13 Jul 2010 14:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10037655</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/13/recursive-descent-parser-a-simple-grammar.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a class="eric-link" href="http://ericwhite.com/blog"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;To learn how recursive descent parsers work, it is helpful to implement a very simple grammar, so for pedagogical purposes, I&amp;rsquo;ve defined a grammar for simple arithmetic expressions. The parser will construct a syntax tree from expressions that we can then examine as necessary. Just for fun, after implementing the parser, we will write a small method that will evaluate the formulas.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;This post is one in a series on using LINQ to write a recursive-descent parser for SpreadsheetML formulas.&amp;nbsp; &lt;span style="background-color: #ffff99;"&gt;You can find the complete list of posts &lt;/span&gt;&lt;a href="http://ericwhite.com/blog/map/recursive-descent-parser/"&gt;&lt;span style="background-color: #ffff99;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: #ffff99;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;In these expressions, operands are floating point numbers, but for simplicity, I&amp;rsquo;ve eliminated the ability to have exponents. Floating point numbers are the only variety of operand; to demonstrate how to write the parser, it&amp;rsquo;s not necessary to include the idea of variables or other types of operands. When writing the parser for Excel formulas, we&amp;rsquo;ll need to deal with both exponents and other types of operands, as well as many more varieties of issues.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;There are five binary (sometimes called infix) operators. Operator precedence needs to be honored when parsing formulas:&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="padding: 1ex;" valign="top" width="97"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;Operator&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 1ex;" valign="top" width="96"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;Precedence&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 1ex;" valign="top" width="97"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;+&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 1ex;" valign="top" width="96"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 1ex;" valign="top" width="97"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;-&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 1ex;" valign="top" width="96"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 1ex;" valign="top" width="97"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;*&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 1ex;" valign="top" width="96"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 1ex;" valign="top" width="97"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;/&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 1ex;" valign="top" width="96"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding: 1ex;" valign="top" width="97"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;^&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding: 1ex;" valign="top" width="96"&gt;
&lt;p style="font-family: Calibri; font-size: medium; padding: 0ex; margin: 0ex;" class="eric-para"&gt;3&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;There is one prefix operator, &amp;lsquo;-&amp;lsquo;, which has higher precedence than the infix operators.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;Operands can consist of a significand (sometimes called mantissa) part, followed by a fractional part.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;The grammar allows for white space at appropriate places in the expression. The allowance of white space in this simple grammar parallels the allowance of white space in the &lt;a href="http://msdn.microsoft.com/en-us/library/dd922181(v=office.12).aspx"&gt;Excel Extensions to the Office Open XML SpreadsheetML File Format (.xlsx) Specification&lt;/a&gt;.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;The grammar allows for use of parentheses.&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;Here are some examples of formulas that should parse properly:&lt;/p&gt;
&lt;p style="font-family: Consolas; font-size: small;" class="eric-code"&gt;"(1+3)/3" &lt;br /&gt;" (1+3) " &lt;br /&gt;"-123" &lt;br /&gt;"1+2*(-3)" &lt;br /&gt;"1+2*( - 3)" &lt;br /&gt;"12.34" &lt;br /&gt;".34" &lt;br /&gt;"-123+456" &lt;br /&gt;"-(123+456)" &lt;br /&gt;" ( 123 + 456 ) " &lt;br /&gt;"1+2-3*4/5^6" &lt;br /&gt;"-.34" &lt;br /&gt;"-12.34"&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;One of the important characteristics of a parser is to report when an expression is invalid per the grammar. Here are some expressions that should throw exceptions:&lt;/p&gt;
&lt;p style="font-family: Consolas; font-size: small;" class="eric-code"&gt;"-(123+)" &lt;br /&gt;"-(*123)" &lt;br /&gt;"*123" &lt;br /&gt;"123a" &lt;br /&gt;"1." &lt;br /&gt;"--1"&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;Here is the grammar, as I&amp;rsquo;ve defined it. There are only eleven rules (other than the rules that are comprised only of terminals):&lt;/p&gt;
&lt;p style="font-family: Consolas; font-size: small;" class="eric-code"&gt;formula = expression &lt;br /&gt;expression = *whitespace nospace-expression *whitespace &lt;br /&gt;nospace-expression = open-parenthesis expression close-parenthesis / &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; expression infix-operator expression / numerical-constant / prefix-operator expression &lt;br /&gt;numerical-constant = [neg-sign] significand-part &lt;br /&gt;significand-part = whole-number-part [fractional-part] / fractional-part &lt;br /&gt;whole-number-part = digit-sequence &lt;br /&gt;fractional-part = full-stop digit-sequence &lt;br /&gt;neg-sign = minus &lt;br /&gt;digit-sequence = 1*decimal-digit &lt;br /&gt;prefix-operator = plus / minus &lt;br /&gt;infix-operator = caret / asterisk / forward-slash / plus / minus &lt;br /&gt;&lt;br /&gt;// The following symbols are comprised only of terminals. &lt;br /&gt;decimal-digit = %x30-39 &lt;br /&gt;whitespace = %x20 &lt;br /&gt;plus = "+" &lt;br /&gt;minus = "-" &lt;br /&gt;asterisk = "*" &lt;br /&gt;forward-slash = "/" &lt;br /&gt;caret = "^" &lt;br /&gt;full-stop = "." &lt;br /&gt;open-parenthesis = "(" &lt;br /&gt;close-parenthesis = ")"&lt;/p&gt;
&lt;p style="font-family: Calibri; font-size: medium;" class="eric-para"&gt;In the next post in this series, I&amp;rsquo;ll start discussing some of the C# / LINQ techniques that we can use to make coding this parser super-easy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10037655" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Functional+Programming/">Functional Programming</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Recursive+Descent+Parser/">Recursive Descent Parser</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SpreadsheetML/">SpreadsheetML</category></item><item><title>Exploring the BCS Metadata Schema</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/09/exploring-the-bdc-metadata-schema.aspx</link><pubDate>Fri, 09 Jul 2010 18:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10036527</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/09/exploring-the-bdc-metadata-schema.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a href="http://ericwhite.com/blog/toc-expanded" class="eric-link"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;When developers are first getting started using BCS, they typically use SharePoint Designer (or perhaps Visual Studio 2010) to put together their BCS model.&amp;nbsp; Using either of those tools, it is pretty easy to discover an external data source, and follow the appropriate steps to connect BCS to the data source and create an external content type (ECT).&amp;nbsp; This is great for the most common scenarios.&amp;nbsp; But sooner or later, you will encounter scenarios where you can&amp;rsquo;t use SharePoint Designer or Visual Studio to configure your model for you.&amp;nbsp; In these cases, you need to edit the BCS metadata schema directly as an XML file.&amp;nbsp; In addition, even if you&amp;nbsp;never leave the confines of&amp;nbsp;SharePoint Designer or Visual Studio for creating ECTs, it is important to understand the BCS metadata schema.&amp;nbsp; I love using great tooling, but I always want to understand what's going on under the hood.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;I&amp;rsquo;m currently in the process of writing a couple of MSDN articles on creating more advanced associations using BCS, such as creating a one-to-many&amp;nbsp;association where you don&amp;rsquo;t have a foreign key, and creating many-to-many associations.&amp;nbsp; In both of these scenarios, you need to edit the BCS model directly.&amp;nbsp;&amp;nbsp; As I was wrapping my head around the BCS metadata schema, I thought it would be helpful to me to use an outlining tool to explore the schema.&amp;nbsp; OneNote 2010 has the best outlining tool that I've ever used.&amp;nbsp; It has the necessary capability of collapsing and expanding nodes, promoting and demoting nodes, and moving nodes around by dragging/dropping.&amp;nbsp; In addition, you can place tables at any node, and then format those tables as you like.&amp;nbsp; I put together a OneNote page that contains the elements and&amp;nbsp;attributes&amp;nbsp;of the BCS metadata schema.&amp;nbsp; Being able to expand and contract the nodes enabled me to see the big picture.&amp;nbsp; I made links back to the MSDN documentation topics, so it is easy to&amp;nbsp;navigate to the documentation&amp;nbsp;for each element, attribute, and property.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;I thought this outline would be useful to others, so I posted the OneNote page to my Live SkyDrive.&amp;nbsp; You can download it &lt;a href="http://cid-5e385848af211ba9.office.live.com/self.aspx/10-07-08/BCS-Xml-Model.one"&gt;here&lt;/a&gt;.&amp;nbsp; After you download it, open it using OneNote 2010.&amp;nbsp; If you are doing SharePoint development, you probably are aware of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=751fa0d1-356c-4002-9c60-d539896c66ce&amp;amp;displaylang=en"&gt;2010 Information Worker Demonstration and Evaluation Virtual Machine&lt;/a&gt;.&amp;nbsp; If you don&amp;rsquo;t have OneNote 2010 on your local machine, you can open this OneNote page using OneNote in that virtual machine.&amp;nbsp; Note that unless you've configured the VM to allow it&amp;nbsp;(which isn't recommended), you can't navigate back to MSDN from the OneNote page.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Note that this is not official documentation in any shape or form.&amp;nbsp; It is just another way to navigate to the official docs.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Here is what the BCS Schema looks like in the OneNote file:&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/4478.B1.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The BCS Metadata schema allows you to supply additional properties for certain elements.&amp;nbsp; When you supply these additional properties, you use the Properties element, which children Property elements.&amp;nbsp; Each Property element has a Name and Type attribute.&amp;nbsp; The value of the property is text content of the Property element.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;LobSystemInstances&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;LobSystemInstance&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;AdventureWorksWS&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Properties&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;WcfAuthenticationMode&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;Type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;PassThrough&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;WcfEndpointAddress&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;Type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;http://ericwhit211:8080/WebService.asmx&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;ShowInSearchUI&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;Type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Property&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Properties&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;LobSystemInstance&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;LobSystemInstances&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;I&amp;rsquo;ve included those properties in my study notes:&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/1586.B2.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;I took a few shortcuts when putting together these notes.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Some elements (such as AccessControlList, and LocalizedDisplayNames) occur at a variety of places in the document.&amp;nbsp; I didn&amp;rsquo;t repeat the attributes and child elements for those elements over and over again in the OneNote page.&amp;nbsp; They are coded in the same way in every location, and it didn&amp;rsquo;t add any clarity to the&amp;nbsp;outline to repeat that information.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/5545.B3.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In a few places, a number of attributes are self-explanatory.&amp;nbsp; For instance, in the example below, it is pretty clear that the Name attribute is the name of the Method, so I didn&amp;rsquo;t bother writing a description for the attribute.&amp;nbsp; As I said, these are just study notes that I assembled for myself that provide a convenient way to navigate through the online documentation.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/1307.B4.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;There is one issue around the TypeDescriptor element that bears mentioning.&amp;nbsp; A TypeDescriptor element can contain a child TypeDescriptors element, which then contains one or more TypeDescriptor element.&amp;nbsp; You will find this when a TypeDescriptor is describing a collection of some type.&amp;nbsp; I&amp;rsquo;ll examine this issue further when I write about TypeDescriptor&amp;nbsp; elements in more detail.&amp;nbsp; In the outline, I didn't repeat the attributes and properties of the TypeDescriptor that is a descendant of another TypeDescriptor element.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-63-90/0333.B5.jpg" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;I&amp;rsquo;ve grappled with the issue of documenting XML vocabularies.&amp;nbsp; The approach taken by the BCS documentation is essentially the same approach as taken by the Open XML specification.&amp;nbsp; For each element, you list its attributes, its child elements, and its parent element.&amp;nbsp; This is pretty good for a reference, but it doesn&amp;rsquo;t help to put the big picture together.&amp;nbsp; Instead of using OneNote for this purpose, I can imagine putting together a web page with links to documentation of elements and attributes organized in a hierarchical control.&amp;nbsp; This might be a great way to navigate through XML documentation.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10036527" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint/">SharePoint</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Office+2010/">Office 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SharePoint+2010/">SharePoint 2010</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/BCS/">BCS</category></item><item><title>Great Video on JavaScript by Douglas Crockford</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/07/great-video-on-javascript-by-douglas-crockford.aspx</link><pubDate>Wed, 07 Jul 2010 14:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10035398</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/07/great-video-on-javascript-by-douglas-crockford.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a href="http://ericwhite.com/blog/toc-expanded" class="eric-link"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;As a software engineer, it is necessary to stay abreast of relevant technologies.&amp;nbsp;&amp;nbsp; Working with SharePoint exacerbates the problem &amp;ndash; if you are going to be a competent SharePoint developer, you must be competent in a wide variety of technologies &amp;ndash; C#, VB.NET, ASP.NET, JavaScript, Silverlight, XSLT, LINQ, etc.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;One key tool in my toolbox is that I download just about every session for Mix, TechEd, etc.&amp;nbsp; I then put them on my Zune, and listen to them while doing dishes, yard work, walking to the bus, or while on the Stairmaster.&amp;nbsp; I listen to some of them more than once if they are particularly good, and on occasion, some session is so good that I watch it on my computer and make notes.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The &lt;a href="http://live.visitmix.com/MIX10/Sessions/EX39"&gt;presentation at Mix 2010 by Douglas Crockford on JavaScript/EcmaScript&lt;/a&gt; is fantastic.&amp;nbsp; I had heard folks talk about the functional programming underpinnings of JavaScript, but I never really understood until I listened to his session.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Download: &lt;a href="http://www.msteched.com/"&gt;TechEd 2010 Sessions&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Download: &lt;a href="http://live.visitmix.com/Videos"&gt;Mix 2010 Sessions&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10035398" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/JavaScript/">JavaScript</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Video/">Video</category></item><item><title>Recursive Descent Parser using LINQ: The Augmented Backus-Naur Form Grammar</title><link>http://blogs.msdn.com/b/ericwhite/archive/2010/07/06/recursive-descent-parser-using-linq-the-augmented-backus-naur-form-grammar.aspx</link><pubDate>Tue, 06 Jul 2010 14:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10034918</guid><dc:creator>Eric White - Independant Consultant</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/b/ericwhite/archive/2010/07/06/recursive-descent-parser-using-linq-the-augmented-backus-naur-form-grammar.aspx#comments</comments><description>&lt;p class="eric-para"&gt;&lt;a class="eric-link" href="http://ericwhite.com/blog/toc-expanded"&gt;[Blog Map]&lt;/a&gt;&amp;nbsp;&amp;nbsp;This blog is inactive.&amp;nbsp;&amp;nbsp;New blog: &lt;a href="http://ericwhite.com/blog" class="eric-link"&gt;EricWhite.com/blog&lt;/a&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;A grammar is a device to define syntax for a language.&amp;nbsp; A grammar is made up of rules, sometimes called productions.&amp;nbsp; Each rule defines a symbol, when can then be further used in other rules.&amp;nbsp; Grammars are not hard to understand; most developers instinctively understand grammars when they see them.&amp;nbsp; When you learn a new programming language, almost without thinking about it, you assemble some version of the grammar in your head.&amp;nbsp; One of the benefits of reading the grammar of a language is to make sure that the conceptual grammar you&amp;rsquo;ve mentally assembled matches the actual grammar of the language.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;This post is one in a series on using LINQ to write a recursive-descent parser for SpreadsheetML formulas.&amp;nbsp; &lt;span style="background-color: #ffff99;"&gt;You can find the complete list of posts &lt;/span&gt;&lt;a href="http://ericwhite.com/blog/map/recursive-descent-parser/"&gt;&lt;span style="background-color: #ffff99;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: #ffff99;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Microsoft devotes a great deal of effort towards writing interoperability documents.&amp;nbsp; If you are a document format geek like me (or even if you only peripherally use document formats), you can find a treasure trove of information on MSDN under &lt;a href="http://msdn.microsoft.com/en-us/library/cc313105(v=office.12).aspx"&gt;Microsoft Office File Format Documents&lt;/a&gt;.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The grammar that we want to use to parse SpreadsheetML formulas is in the interoperability document: &lt;a href="http://msdn.microsoft.com/en-us/library/dd922181(v=office.12).aspx"&gt;Excel Extensions to the Office Open XML SpreadsheetML File Format (.xlsx) Specification&lt;/a&gt;.&amp;nbsp; This grammar is expressed in &lt;a href="http://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_Form"&gt;Augmented Backus&amp;ndash;Naur Form&lt;/a&gt; (ABNF).&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In this post, I&amp;rsquo;m going to distill ABNF to just the set of rules and grammar syntax that we need to understand to write a parser for the grammar in the Excel Extensions Specification (linked above).&amp;nbsp; I&amp;rsquo;ll take all examples of ABFN grammar from that spec.&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Terminals&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Terminals express the actual text of the programming language.&amp;nbsp; A grammar expresses a terminal either as a quoted string, or sometimes as a list of values, such as the hex values for the digits from &amp;ldquo;0&amp;rdquo; &amp;ndash; &amp;ldquo;9&amp;rdquo;.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;decimal-digit= %x30-39&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Following is another symbol that uses a literal string terminal.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;full-stop = "."&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Just to be clear, this is the terminal:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;decimal-digit= %x30-39&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^^^^^^^&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Where this is the grammar rule:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;decimal-digit= %x30-39&lt;br /&gt;^^^^^^^^^^^^^^^^^^^^^^&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The terminal in the full-stop rule is just the string literal:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;full-stop = "."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^^^&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Or&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;A symbol can be comprised of one OR another symbol.&amp;nbsp; In ABNF, &amp;ldquo;OR&amp;rdquo; is expressed as a forward slash.&amp;nbsp; The following symbol definition defines constant to be one of the list of varieties of constants.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;constant = error-constant / logical-constant / numerical-constant / string-constant / array-constant&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The logical-constant symbol is one of two terminals, expressed as quoted strings:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;logical-constant = "FALSE" / "TRUE"&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Adjacent Symbols&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Two symbols separated by a space indicate that you must first have the one symbol, followed by the second symbol.&amp;nbsp; The following rule specifies that the fractional-part symbol requires a full-stop followed by a digit-sequence.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;fractional-part = full-stop digit-sequence&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Optional&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;A symbol or terminal that is optional is surrounded by square brackets.&amp;nbsp; The following definition of the exponent-part symbol indicates that the sign before the digit-sequence is optional.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;exponent-part = exponent-character [ sign ] digit-sequence&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The definition of exponent-character is of course:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;exponent-character = "E"&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The following examples could produce an exponent-part symbol:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;E10&lt;br /&gt;E+10&lt;br /&gt;E-10&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Zero or More&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;If a symbol is preceded by an asterisk (*), zero or more of those symbols can occur at that point in the production of the symbol being defined.&amp;nbsp; The following rule says that an expression can be made up of a ref-expression, or zero or more instances of the whitespace symbol, followed by a nospace-expression, followed by zero or more instances of the whitespace symbol.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;expression= ref-expression / *whitespace nospace-expression *whitespace&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The symbol bring-to-front-params is defined to be an open parenthesis followed by zero or more space symbols, followed by a close parenthesis.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;bring-to-front-params = "(" *space ")"&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;N or More&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;If a symbol is preceded by a number followed by an asterisk, it indicates that you must have at least n instances of that symbol.&amp;nbsp; The following defines a digit-sequence to be one or more decimal digits:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;digit-sequence = 1*decimal-digit&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Exactly N Symbols&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;If a symbol is preceded by a number, it indicates that you must have exactly n instances of that symbol.&amp;nbsp; The following defines that an escaped-double-quote is comprised of exactly two adjacent double-quote symbols.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;escaped-double-quote = 2double-quote&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;N to M Symbols&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;The following defines that the and-params symbol consists of an open parenthesis, followed by either a single argument-expression or an argument, followed by 1-254 comma/argument pairs, followed by a close parenthesis.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;and-params = "(" (argument-expression / (argument 1*254("," argument))) ")"&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Grouped Symbols&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;Symbols in a production can be grouped by parentheses, and then preceded by a symbol quantifier.&amp;nbsp; The following defines that the constant-list-rows symbol consists of one constant-list-row, followed by zero or more pairs of symbols, where the pair is a semicolon, followed by a constant-list-row.&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;constant-list-rows = constant-list-row *(semicolon constant-list-row)&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="color: #4f81bd;"&gt;Exceptions and Special Rules&lt;/span&gt;&lt;/h2&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In some places, the grammar defines some special rules in text.&amp;nbsp; In our case, the following special rule is defined for an array-constant:&lt;/p&gt;
&lt;p class="eric-code" style="font-family: Consolas; font-size: small;"&gt;An array-constant MUST NOT contain&lt;br /&gt;An array-constant.&lt;br /&gt;Columns or rows of unequal length.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In addition, following the grammar, there is additional text that describes further restrictions or exceptions.&amp;nbsp; As necessary, we&amp;rsquo;ll need to incorporate those restrictions.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;You can see that grammar rules are not very complex.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;My approach for coding the recursive descent parser will be to paste the grammar rule directly into the class that implements the rule as a C# comment.&amp;nbsp; This makes it very easy to correlate the grammar to the code that implements the rule.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;In the next post, I&amp;rsquo;m going to define a super-small grammar that is a subset of the Excel formulas grammar.&amp;nbsp; Then in subsequent posts, we&amp;rsquo;ll implement and test a parser for that small grammar.&lt;/p&gt;
&lt;p class="eric-para" style="font-family: Calibri; font-size: medium;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10034918" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXML/">OpenXML</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/LINQ/">LINQ</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/OpenXmlSdk/">OpenXmlSdk</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/Recursive+Descent+Parser/">Recursive Descent Parser</category><category domain="http://blogs.msdn.com/b/ericwhite/archive/tags/SpreadsheetML/">SpreadsheetML</category></item></channel></rss>