<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/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 J. Smith's Weblog</title><link>http://weblogs.asp.net/ericjsmith/default.aspx</link><description>CodeSmith, .NET, etc...</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>CodeSmith Generator 6.0–Status, Website and Future</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/11/10/codesmith-generator-6-0-status-website-and-future.aspx</link><pubDate>Thu, 10 Nov 2011 20:51:22 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8044872</guid><dc:creator>ejsmith</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=8044872</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/11/10/codesmith-generator-6-0-status-website-and-future.aspx#comments</comments><description>&lt;p&gt;We are on the home stretch of Generator 6.0 and things have come together really nicely.&amp;#160; This is going to be a great release!&amp;#160; We have been mostly working on performance, memory utilization and bug fixes, and we are doing really good on all fronts now.&amp;#160; The feedback we have been getting is very positive and everyone seems to love the new version.&amp;#160; We are really excited to get this release out the door, but we have some house cleaning to finish first.&lt;/p&gt;  &lt;p&gt;I have been working on making updates to our website code that will allow us to sell Generator 6.0.&amp;#160; The website code has always sort of been a low priority and it was starting to really show.&amp;#160; So we are doing some major refactoring and cleanup work to make things clean and simple.&lt;/p&gt;  &lt;p&gt;Now that the Generator 6.0 project is starting to wind down, we are beginning to think about what comes next.&amp;#160; We have received feedback from a few people saying that they would like to see a stand alone template editor in addition to the integrated editor.&amp;#160; The good news is that the way we built the new editor would make it so that we could reuse almost everything in a stand alone editor.&amp;#160; We would like to hear from more people about whether or not we should spend the time and resources to create a stand alone version of the new editor.&amp;#160; And if so, should the editor take on a different form than the old CodeSmith Studio?&amp;#160; Should it be more of a notepad-esque editor that lets you edit a single template per instance or should it be a full blown VS clone like CodeSmith Studio was?&amp;#160; Let us know what you think by sending an email to &lt;a href="mailto:support@codesmithtools.com"&gt;support@codesmithtools.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8044872" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category></item><item><title>CodeSmith Generator 6.0 Beta Survey</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/09/08/codesmith-generator-6-0-beta-survey.aspx</link><pubDate>Thu, 08 Sep 2011 21:10:38 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7946110</guid><dc:creator>ejsmith</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7946110</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/09/08/codesmith-generator-6-0-beta-survey.aspx#comments</comments><description>&lt;p&gt;We are currently working on dogfooding the new template editor by updating and building some new templates. Along the way, we are trying to find and fix as many pain points as we possibly can. We are also working on profiling and memory usage reductions and trying to get everything running smoothly for the final release.&lt;/p&gt;  &lt;p&gt;We have gotten a lot of great feedback from the community and want to encourage everyone to keep it coming.&amp;#160; In order to try and get a little more organized with our feedback, we have created a beta survey and everyone that completes the survey will get a discount on their next purchase with us.&amp;#160; This could be used towards upgrading to CodeSmith Generator 6.0 *HINT* *HINT*.&amp;#160; :-)&amp;#160; Also, please remember that if you &lt;a href="http://www.codesmithtools.com/store"&gt;purchase CodeSmith Generator 5.x now&lt;/a&gt;, you will get a free upgrade to CodeSmith Generator 6.0 when it is released.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.codesmithtools.com/download/generatorprofessional-60-beta2.msi"&gt;Download CodeSmith Generator 6.0 Beta&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://survey.codesmithtools.com/fs-generator6.aspx"&gt;Complete the Beta Survey&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Profit! &lt;/li&gt; &lt;/ol&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7946110" width="1" height="1"&gt;</description></item><item><title>CodeSmith Generator 6.0 Beta 1 Released!</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/08/11/codesmith-generator-6-0-beta-1-released.aspx</link><pubDate>Thu, 11 Aug 2011 23:30:47 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7906558</guid><dc:creator>ejsmith</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7906558</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/08/11/codesmith-generator-6-0-beta-1-released.aspx#comments</comments><description>&lt;p&gt;It’s been a long time coming, but &lt;a href="http://community.codesmithtools.com/CodeSmith_Official_7/b/announcements/archive/2011/08/11/codesmith-generator-6-0-beta-1-released.aspx"&gt;CodeSmith Generator 6.0 Beta 1&lt;/a&gt; has finally been released today!&amp;#160; I think a lot of people believe CodeSmith Tools is a lot bigger than we actually are (there are only 4 of us currently), but we have been working hard on this release for about 8 months now and it is pretty close to a complete rewrite.&amp;#160; We have rewritten the entire engine, lexer, parser, property grid, editor, intellisense, and then integrated it all right into Visual Studio 2010!&lt;/p&gt;  &lt;p&gt;This release gives us a great foundation to build on for future enhancements as I have learned a LOT since I &lt;strike&gt;painted myself into a corner&lt;/strike&gt; built the original template engine.&amp;#160; Our new engine is very well structured and should make it MUCH easier to make changes to both the template syntax as well as improving our editing experience.&amp;#160; I really hope you guys like it!&lt;/p&gt;  &lt;h2&gt;&lt;a href="http://www.codesmithtools.com/download/generatorprofessional-60-beta1.msi"&gt;Download CodeSmith Generator 6.0 Beta 1&lt;/a&gt;&lt;/h2&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7906558" width="1" height="1"&gt;</description></item><item><title>CodeSmith Generator 6.0–Editor in Action</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/07/13/codesmith-generator-6-0-editor-in-action.aspx</link><pubDate>Wed, 13 Jul 2011 05:54:19 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7867848</guid><dc:creator>ejsmith</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7867848</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/07/13/codesmith-generator-6-0-editor-in-action.aspx#comments</comments><description>&lt;p&gt;I thought the best way to show our progress so far would be to show you a quick video of the new editor in action. So without further adieu, here is the new CodeSmith Generator 6.0 editor:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;* NOTE: Click the full screen button on the bottom right of the video to watch the video in higher resolution.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;object id="scPlayer"  width="611" height="460" type="application/x-shockwave-flash" data="http://content.screencast.com/users/ejsmith/folders/Jing/media/0cea1156-6645-4230-b270-d76e8cf5f5bc/jingswfplayer.swf" &gt;  &lt;param name="movie" value="http://content.screencast.com/users/ejsmith/folders/Jing/media/0cea1156-6645-4230-b270-d76e8cf5f5bc/jingswfplayer.swf" /&gt;  &lt;param name="quality" value="high" /&gt;  &lt;param name="bgcolor" value="#FFFFFF" /&gt;  &lt;param name="flashVars" value="thumb=http://content.screencast.com/users/ejsmith/folders/Jing/media/0cea1156-6645-4230-b270-d76e8cf5f5bc/FirstFrame.jpg&amp;amp;containerwidth=611&amp;amp;containerheight=460&amp;amp;content=http://content.screencast.com/users/ejsmith/folders/Jing/media/0cea1156-6645-4230-b270-d76e8cf5f5bc/Generator%206%20In%20Action.swf&amp;amp;blurover=false" /&gt;  &lt;param name="allowFullScreen" value="true" /&gt;  &lt;param name="scale" value="showall" /&gt;  &lt;param name="allowScriptAccess" value="always" /&gt;  &lt;param name="base" value="http://content.screencast.com/users/ejsmith/folders/Jing/media/0cea1156-6645-4230-b270-d76e8cf5f5bc/" /&gt;  Unable to display content. Adobe Flash is required. &lt;/object&gt;&lt;/p&gt;  &lt;p&gt;In general, I think our editing experience is already about 10 times better than it was before.&amp;#160; Not even counting the fact that it’s integrated right into Visual Studio now.&amp;#160; We still have some work to do, but we will be releasing a beta version soon.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7867848" width="1" height="1"&gt;</description></item><item><title>CodeSmith Generator 6.0–Status and IntelliSense</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/03/23/codesmith-generator-6-0-status-and-intellisense.aspx</link><pubDate>Wed, 23 Mar 2011 18:06:38 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7730663</guid><dc:creator>ejsmith</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7730663</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/03/23/codesmith-generator-6-0-status-and-intellisense.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/ericjsmith/IntelliSense_6E5FDA22.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 1px 11px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IntelliSense" border="0" alt="IntelliSense" align="right" src="http://weblogs.asp.net/blogs/ericjsmith/IntelliSense_thumb_791D3177.png" width="212" height="107" /&gt;&lt;/a&gt;Work on Generator 6.0 is progressing pretty nicely. We are code complete on our new parser, new compiler, new caching mechanism, out of process template execution, and WPF based property grid. There is a lot to talk about there, but I have also started working on implementing IntelliSense and I wanted to talk about that today.&lt;/p&gt;  &lt;p&gt;Better working IntelliSense has been our biggest request probably from day one. People tend to take IntelliSense for granted because Microsoft has done a great job with it in Visual Studio and it almost becomes transparent. We just use it and expect it to work without thinking about what goes into it. I was just as guilty of this as everyone else until I started working on implementing it in CodeSmith Studio. Think about it for a second, you have a collection of text files and you need to make sense of them… what goes into that? Here is a simplified list of the steps and parts required for implementing IntelliSense.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Tokenize&lt;/strong&gt; – the first step is to take that text file and create a series of tokens from it.       &lt;ul&gt;       &lt;li&gt;This sounds easy, but in and of itself it can be pretty hard because of ambiguities in languages where certain things have different meanings depending on their context. &lt;/li&gt;        &lt;li&gt;In our case, things are even more complicated by the fact that we are mixing random languages together. &lt;/li&gt;        &lt;li&gt;Also, keep in mind that this needs to be happening in real time as the user types without slowing the editor down. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Parse&lt;/strong&gt; – next we read the tokens in, make sense of them, validate them and construct an abstract syntax tree along the way so that we can have some sort of structure that can be more easily understood, traversed and transformed.       &lt;ul&gt;       &lt;li&gt;This is expensive to build and needs to happen in a background thread and constantly be updated as the user is typing. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Gather Type Information&lt;/strong&gt; – we need a database of reflected and parsed type information from any referenced assemblies and source files so that we can use that information in resolving and knowing what members are available for any given type.       &lt;ul&gt;       &lt;li&gt;It is expensive to reflect over every single type in every single referenced assembly. So you need to cache this information in a structure that makes it really fast to load and search. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Gather Context&lt;/strong&gt; – when an IntelliSense request is made, we need to figure out where we are and provide as much information about our surroundings as possible.       &lt;ul&gt;       &lt;li&gt;Due to the fact that active typing is going on, we have to use a combination of token scanning and looking at our most recent AST to provide this information. &lt;/li&gt;        &lt;li&gt;Also due to active typing, we have to work with an AST that has information that is slightly out of date and we will need to translate that out of date information to the current source. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Resolve&lt;/strong&gt; – now we need to take all of the information that has been gathered and use it to figure out what we are looking at and what options are available to show in the IntelliSense list.       &lt;ul&gt;       &lt;li&gt;There are a lot of rules that come into play here like member scope and precedence for extension methods to name a couple. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Another thing I would like to address is that many people in the past have said to us… &amp;quot;just use Microsoft's IntelliSense&amp;quot;. Unfortunately, it's not that easy. Microsoft does not expose their IntelliSense services and, even if they did, we most likely would not be able to use them because they would be very much geared around their use cases which would make them unusable for ours.&lt;/p&gt;  &lt;p&gt;As you can see, there is a LOT of work that goes into providing that handy little drop down menu that magically pops up and makes it so that you don't have to memorize an entire framework library. We are completely re-writing every single one of those pieces in CodeSmith Generator 6.0 and our end goal is to make it so good that you completely take us for granted because it just magically works. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://weblogs.asp.net/blogs/ericjsmith/wlEmoticon-smile_3F9A2180.png" /&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7730663" width="1" height="1"&gt;</description></item><item><title>CodeSmith Generator 6.0 Template Parser Progress Report - Part 2</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/02/02/codesmith-generator-6-0-template-parser-progress-report-part-2.aspx</link><pubDate>Wed, 02 Feb 2011 19:38:13 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7696175</guid><dc:creator>ejsmith</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7696175</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/02/02/codesmith-generator-6-0-template-parser-progress-report-part-2.aspx#comments</comments><description>&lt;p&gt;In this post I’m going to talk about how the new template parser in CodeSmith Generator 6.0 creates an &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt; (Abstract Syntax Tree) and then uses the &lt;a href="http://en.wikipedia.org/wiki/Visitor_pattern"&gt;visitor pattern&lt;/a&gt; to iterate over the nodes in the AST and do transformations.&lt;/p&gt;  &lt;p&gt;The grammar rules I talked about in my &lt;a href="http://community.codesmithtools.com/CodeSmith_Community/b/ericjsmith/archive/2011/01/04/codesmith-generator-6-0-template-parser-progress-report-part-1.aspx"&gt;previous post&lt;/a&gt; are used to both validate the syntax of the template code and to create typed AST nodes.&amp;#160; Here is a very simple template:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;%@ CodeTemplate Language=&amp;quot;C#&amp;quot; %&amp;gt;      &lt;br /&gt;&amp;lt;%= DateTime.Now %&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The resulting AST from the parse looks like this:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;DirectiveNode Name=CodeTemplate      &lt;br /&gt;&amp;#160; AttributeNode Language=C#       &lt;br /&gt;ExpressionNode       &lt;br /&gt;&amp;#160; ValueNode DateTime.Now&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Each node in the AST implements a visitor pattern and I’m actually using a visitor to generate the AST visualization above.&amp;#160; The visitor recursively goes through each node in the hierarchy and calls the Visit method for that specific node type.&amp;#160; So I end up with a visitor class that looks like this:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;public class VisualizeTemplateVisitor : TemplateAstVisitorBase      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; …       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public override void Visit(DirectiveNode node)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _builder.Append(&amp;quot;DirectiveNode Name=&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _builder.AppendLine(node.Value.Trim());       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public override void Visit(AttributeNode node)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _builder.Append(&amp;quot;&amp;#160; AttributeNode &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _builder.Append(node.Name.Trim());       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _builder.Append(&amp;quot;=&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _builder.AppendLine(Format(node.Value));       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; …       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I simply call the Accept method on the visitor and pass it the root node that I want to visit and it creates the output above:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;string nodeVisualization = VisualizeTemplateVisitor.Accept(templateNode)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This pattern is used extensively in the new parser.&amp;#160; Here are some of the visitors I have so far in the new parser:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CollapseWhitespaceVisitor – used to traverse the AST and remove whitespace and line break nodes from lines that only contain template code.&amp;#160; This visitor actually modifies the AST while it is visiting it. &lt;/li&gt;    &lt;li&gt;PopulateParseResultVisitor – used to gather information about the template like what sub-templates are referenced, what include files are referenced, what assembly references are declared, what language the template is using (ie. C#, VB, JS) and many other things. &lt;/li&gt;    &lt;li&gt;GenerateCompileUnitVisitor – used to generate a CodeDOM compile unit from the AST that can be fed into the .NET compiler and create an assembly. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;By creating an AST and using the visitor pattern, I’m able to do any sort of transformation that I want by simply creating a new visitor and plugging it into the template compilation pipeline.&amp;#160; As you can imagine, this ends up being a much cleaner, simpler and extensible solution than what we had before.&amp;#160; We may even expose the compilation pipeline with MEF in CodeSmith Generator 6.0 so that anyone could make changes to the generated code or implement new template directives.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7696175" width="1" height="1"&gt;</description></item><item><title>CodeSmith Generator 6.0 Template Parser Progress Report - Part 1</title><link>http://weblogs.asp.net/ericjsmith/archive/2011/01/04/codesmith-generator-6-0-template-parser-progress-report-part-1.aspx</link><pubDate>Wed, 05 Jan 2011 00:01:08 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7674528</guid><dc:creator>ejsmith</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7674528</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2011/01/04/codesmith-generator-6-0-template-parser-progress-report-part-1.aspx#comments</comments><description>&lt;p&gt;I am currently working on the new parser for CodeSmith Generator 6.0.&amp;#160; When I wrote the original template parser back in 2004, I really had no idea what I was doing. :-)&amp;#160; I had no idea what an &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt; was or what an &lt;a href="http://en.wikipedia.org/wiki/LL_parser"&gt;LL(*) parser&lt;/a&gt; was, etc.&amp;#160; That being said, I think I did an OK job and it has certainly served it’s purpose, but it can’t be easily changed and things are more complicated than they need to be. &lt;/p&gt;  &lt;p&gt;I have been working on our new parser for a few weeks now and I have a pretty good start.&amp;#160; Here is a list of things that we want to get out of the new parser:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Structure&lt;/strong&gt; - Generate an AST as an intermediate step so that we can do transformations using a Visitor pattern and even LINQ queries. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Grammar&lt;/strong&gt; - Create a grammar for the syntax so that we can give grammar errors. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Testability&lt;/strong&gt; - Make it easy to unit test. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Maintainability&lt;/strong&gt; - Make it easy to implement changes and add new features. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I decided to make use of the parser framework that &lt;a href="http://www.actiprosoftware.com/"&gt;Actipro&lt;/a&gt; includes with their &lt;a href="http://www.actiprosoftware.com/products/dotnet/wpf/syntaxeditor/default.aspx"&gt;SyntaxEditor&lt;/a&gt; control.&amp;#160; It is an LL(*) parser framework that lets you define the grammar right in C#.&amp;#160; Here is what a sample grammar production looks like:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;codeExpression.Production = @expressionStart + @expressionText[&amp;quot;expr&amp;quot;] + @expressionEnd      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt; Ast&amp;lt;ExpressionNode&amp;gt;()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .SetProperty(n =&amp;gt; n.Value, AstFrom(&amp;quot;expr&amp;quot;));&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code is defining the grammar rule that makes up a code expression &amp;lt;%= SomeValue %&amp;gt; in a template.&amp;#160; It says that there will be an expression start token followed by some expression text and then an expression end token.&amp;#160; It is also constructing an AST node for the expression.&amp;#160; The parser framework has really helped get our new parser of the ground quickly and I highly recommend it.&lt;/p&gt;  &lt;p&gt;The cool thing about defining a grammar is that if there are errors in the template, you will get much more intuitive error information about what the parser saw and what it was expecting to see.&amp;#160; Previously, we pretty much just parsed the template, generated code from it and tried to compile it.&amp;#160; Here is an example of how we will be providing much better errors in Generator 6.0.&amp;#160; Here is a template that has a missing % at the end of the first line:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;%@ CodeTemplate Language=&amp;quot;C#&amp;quot; &amp;gt;      &lt;br /&gt;&amp;lt;%= DateTime.Now %&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Here is the error that Generator 5.3 gives:    &lt;br /&gt;&lt;font size="2" face="Courier New"&gt;error CodeSmith0104: You must specify a valid template language.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And here is the error message that the new parser gives:    &lt;br /&gt;&lt;font size="2" face="Courier New"&gt;Line 2, Char 3: %&amp;gt; expected. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In my next post I will talk about the AST and how we are using the visitor pattern to do transformations on the parsed template content.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;P.S. If you haven’t figured it out by now, I’m really bad about writing to my blog.&amp;#160; Rather than break out the random excuse generator, I’m just going to start posting.&amp;#160; Happy New Year!&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7674528" width="1" height="1"&gt;</description></item><item><title>CodeSmith Insight Launch Party</title><link>http://weblogs.asp.net/ericjsmith/archive/2010/09/30/codesmith-insight-launch-party.aspx</link><pubDate>Thu, 30 Sep 2010 22:07:42 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7622189</guid><dc:creator>ejsmith</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7622189</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2010/09/30/codesmith-insight-launch-party.aspx#comments</comments><description>&lt;p&gt;CodeSmith Tools is excited to announce the upcoming release of our new product, CodeSmith Insight, and we would like to invite you to come celebrate! Join us at the Addison Conference Center‎ on Tuesday, October 12th, from 6pm to 9pm, for the:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;CodeSmith Insight Launch Party&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Prizes and Giveaways     &lt;br /&gt;&lt;/u&gt;There will be &lt;strong&gt;over $1,000 in prizes&lt;/strong&gt;, including: Apple iPad, Crucial C300 128GB SSD, a new Microsoft Xbox 360 Slim, Nintendo Wii, and more! Plus all attendees will receive a free CodeSmith Insight T-Shirt, as well as a 50% Lifetime Discount for their CodeSmith Insight subscription!&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Games, Competition, and Food     &lt;br /&gt;&lt;/u&gt;This will be a &lt;strong&gt;Retro Game Party&lt;/strong&gt;. There will be a series of old school arcade machines, including: Tetris, Streetfighter 2, Pac-Man, Mortal Kombat, NBA Jam, Metal Slug, Galaga, and more! High scores will be kept throughout the evening, and at the end of the party the leaders will battle it out for the aforementioned prizes! Also, there will be free pizza and drinks for all attendees.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;What is CodeSmith Insight?     &lt;br /&gt;&lt;/u&gt;CodeSmith Insight is a help desk software with advanced application integration. This means that Insight can handle your email and user feedback, as well as your application errors and crash reports, all from a single convenient location. Insight is useful to anyone who makes software.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Please RSVP at our party website!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Be sure to visit our website and RSVP if you are coming, as there are a limited number of spots and they are filling up fast! &lt;a href="http://party.codesmithtools.com/"&gt;http://party.codesmithtools.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We hope to see you there,   &lt;br /&gt;The CodeSmith Tools Team&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7622189" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/Community+News/default.aspx">Community News</category></item><item><title>PLINQO at the Dallas .NET Users Group</title><link>http://weblogs.asp.net/ericjsmith/archive/2009/07/07/plinqo-at-the-dallas-net-users-group.aspx</link><pubDate>Tue, 07 Jul 2009 19:23:25 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7143381</guid><dc:creator>ejsmith</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=7143381</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2009/07/07/plinqo-at-the-dallas-net-users-group.aspx#comments</comments><description>&lt;p&gt;This Thursday July 9th, Shannon Davidson and Tom DuPont will be talking about &lt;a href="http://plinqo.com"&gt;PLINQO&lt;/a&gt; at the &lt;a href="http://www.ddnug.net/Meetings/UpcomingMeetingsEvents/tabid/101/ctl/Details/mid/421/ItemID/45/Default.aspx?selecteddate=7/9/2009"&gt;Dallas .NET Users Group&lt;/a&gt; at Microsoft's Las Colinas Office in Irving, Texas.&lt;/p&gt;  &lt;p&gt;If you are in the area, we would love for you to stop by and see what PLINQO is all about. You might even win a free copy of CodeSmith!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;When: &lt;/strong&gt;    &lt;br /&gt;Thursday, July 9th&amp;#160; &lt;br /&gt;Doors open at 6:00PM     &lt;br /&gt;Presentation starts at 6:30PM&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Where: &lt;/strong&gt;    &lt;br /&gt;Microsoft's Las Colinas Office     &lt;br /&gt;LC1 Building (Right Tower)     &lt;br /&gt;1st Floor, MPR Room,&amp;#160; &lt;br /&gt;(Left of the main security desk)&lt;/p&gt;  &lt;p&gt;7000 State Highway 161    &lt;br /&gt;Irving, TX 75039     &lt;br /&gt;&lt;a href="http://maps.google.com/maps?ie=UTF8&amp;amp;cid=0,0,16412747153943560073&amp;amp;fb=1&amp;amp;split=1&amp;amp;gl=us&amp;amp;dq=7000+State+Highway+161+Irving,+TX+75039&amp;amp;daddr=7000+State+Highway+161,+Irving,+TX+75039-2418&amp;amp;geocode=2443346843498901297,32.899279,-96.963109&amp;amp;ei=XsFSStH2OZaqtgfB2OWwCA&amp;amp;t=h&amp;amp;z=16"&gt;Map&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7143381" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/Community+News/default.aspx">Community News</category></item><item><title>CodeSmith 4.0 Released</title><link>http://weblogs.asp.net/ericjsmith/archive/2006/11/08/CodeSmith-4.0-Released.aspx</link><pubDate>Wed, 08 Nov 2006 19:11:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:886573</guid><dc:creator>ejsmith</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=886573</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2006/11/08/CodeSmith-4.0-Released.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://community.codesmithtools.com/blogs/announcements/archive/2006/11/08/CodeSmith40Released.aspx"&gt;CodeSmith 4.0&lt;/a&gt; has been officially released today at the Dev Connections conference in Las Vegas!&amp;nbsp; This is a huge release for us and has a bunch of great new features as well as countless minor enhancements and bug fixes all based on customer feedback.&lt;/p&gt;&lt;p&gt;Here are some of the features in the new version of CodeSmith:&lt;/p&gt;&lt;li&gt;&lt;strong&gt;CodeSmith Projects&lt;/strong&gt; (.csp) - This feature makes automating your code generation process really easy and consistent whether you are working from inside of Visual Studio 2005, MSBuild, Windows Explorer, a command line / batch file, or CodeSmith itself. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;ActiveSnippets&lt;/strong&gt; - Imagine Visual Studio 2005 snippets, but with the full power of CodeSmith available to execute any logic or access any complex metadata (including database schema and xml data) to control the output of your snippets. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;CodeSmith Maps&lt;/strong&gt; (.csmap) - This feature will allow you to create dictionary style maps of things like SQL to C# data type mappings. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;.netTiers 2.0&lt;/strong&gt; - The .netTiers templates have been greatly enhanced and included with CodeSmith 4.0. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Extended Property Management&lt;/strong&gt; - You can now edit and add new schema extended properties inside of CodeSmith Studio. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Property Persistence&lt;/strong&gt; - CodeSmith now remembers the property values from the last time you executed a template.&lt;/li&gt;&lt;p&gt;You can view the official press release here:&lt;br /&gt;&lt;a href="http://community.codesmithtools.com/blogs/announcements/archive/2006/11/08/CodeSmith40Released.aspx"&gt;http://community.codesmithtools.com/blogs/announcements/archive/2006/11/08/CodeSmith40Released.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=886573" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/General/default.aspx">General</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/General+Software+Development/default.aspx">General Software Development</category></item><item><title>CodeSmith 4.0 Public Beta Released</title><link>http://weblogs.asp.net/ericjsmith/archive/2006/10/19/CodeSmith-4.0-Public-Beta-Released.aspx</link><pubDate>Fri, 20 Oct 2006 00:53:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:690680</guid><dc:creator>ejsmith</dc:creator><slash:comments>30</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=690680</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2006/10/19/CodeSmith-4.0-Public-Beta-Released.aspx#comments</comments><description>&lt;p&gt;CodeSmith 4.0 Beta 2 has been released and is now available to the public.&amp;nbsp; Here are just a few the new capabilities in CodeSmith 4.0: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;CodeSmith Projects&lt;/strong&gt; (.csp) - This feature makes automating your code generation process really easy and consistent whether you are working from inside of Visual Studio 2005, MSBuild, Windows Explorer, a command line / batch file, or CodeSmith itself.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ActiveSnippets&lt;/strong&gt; - Imagine Visual Studio 2005 snippets, but with the full power of CodeSmith available to execute any logic or access any complex metadata (including database schema and xml data) to control the output of your snippets.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CodeSmith Maps&lt;/strong&gt; (.csmap) - This feature will allow you to create dictionary style maps of things like SQL to C# data type mappings.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;.netTiers 2.0&lt;/strong&gt; - The .netTiers templates have been greatly enhanced and included with CodeSmith 4.0.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Extended Property Management&lt;/strong&gt; - You can now edit and add new schema extended properties inside of CodeSmith Studio.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Property Persistence&lt;/strong&gt; - CodeSmith now remembers the property values from the last time you executed a template.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You can read the announcement &lt;a href="http://community.codesmithtools.com/blogs/announcements/archive/2006/10/16/CodeSmith40PublicBetaReleased.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=690680" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/General+Software+Development/default.aspx">General Software Development</category></item><item><title>CodeSmith $5,000 cash give away at Dev Connections</title><link>http://weblogs.asp.net/ericjsmith/archive/2006/10/07/CodeSmith-_2400_5_2C00_000-cash-give-away-at-Dev-Connections.aspx</link><pubDate>Sat, 07 Oct 2006 21:57:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:631335</guid><dc:creator>ejsmith</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=631335</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2006/10/07/CodeSmith-_2400_5_2C00_000-cash-give-away-at-Dev-Connections.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.DevConnections.com/?refer=telligent"&gt;&lt;img style="width: 468px; height: 60px" src="http://www.codesmithtools.com/images/devconnections.gif" border="0" alt="" hspace="10" width="468" height="60" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codesmithtools.com"&gt;CodeSmith&lt;/a&gt; will have a booth at &lt;a href="http://www.DevConnections.com/?refer=telligent"&gt;Dev Connections&lt;/a&gt; in Las Vegas next month and we thought it would be a lot of fun to give away some gambling money!&amp;nbsp; If you are coming to Dev Connections, just make sure to stop by our booth and signup.&amp;nbsp; If you aren&amp;#39;t coming to Dev Connections, you better sign up quickly!&lt;/p&gt;&lt;p&gt;In addition to Microsoft having some exciting new announcements for Dev Connections, CodeSmith will have some exciting announcements of our own!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=631335" width="1" height="1"&gt;</description></item><item><title>CodeSmith Wins "Best Utility" Award</title><link>http://weblogs.asp.net/ericjsmith/archive/2006/05/12/446269.aspx</link><pubDate>Fri, 12 May 2006 21:39:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:446269</guid><dc:creator>ejsmith</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=446269</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2006/05/12/446269.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.aspnetpro.com/"&gt;&lt;img alt="Readers' Choice Awards" hspace="10" src="http://www.codesmithtools.com/images/aspRCA06_Utility_Winner.gif" align="right" border="0" / /&gt;&lt;/a&gt;CodeSmith has won the "Best Utility" award in the asp.netPRO Readers&amp;rsquo; Choice Awards! Thanks to our incredible user base, CodeSmith was able to win this category that included many other great software development products. Thank you to everyone that voted!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=446269" width="1" height="1"&gt;</description></item><item><title>HanselMinutes - Code Generation</title><link>http://weblogs.asp.net/ericjsmith/archive/2006/04/19/443386.aspx</link><pubDate>Wed, 19 Apr 2006 17:18:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:443386</guid><dc:creator>ejsmith</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=443386</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2006/04/19/443386.aspx#comments</comments><description>&lt;p&gt;&lt;span id="ctl00_ContentPlaceHolder1_lblShowDescription" style="LEFT: 57px; TOP: 51px"&gt;&amp;ldquo;Scott talks about CodeSmith as well as other code generators, highlighting their strengths and weaknesses, and offering his usual insight into the issues. Of course, resources abound.&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="LEFT: 57px; TOP: 51px"&gt;&lt;a href="http://www.hanselminutes.com/default.aspx?showid=20"&gt;http://www.hanselminutes.com/default.aspx?showid=20&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=443386" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/.NET/default.aspx">.NET</category></item><item><title>asp.netPRO Readers’ Choice Awards</title><link>http://weblogs.asp.net/ericjsmith/archive/2006/03/17/440540.aspx</link><pubDate>Sat, 18 Mar 2006 03:45:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:440540</guid><dc:creator>ejsmith</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/ericjsmith/rsscomments.aspx?PostID=440540</wfw:commentRss><comments>http://weblogs.asp.net/ericjsmith/archive/2006/03/17/440540.aspx#comments</comments><description>&lt;p&gt;If you are a fan of CodeSmith and would like to show your support, please take a moment to &lt;a href="http://www.aspnetpro.com/readerschoice/default.asp"&gt;place your vote&lt;/a&gt; for CodeSmith in the Utility category of the asp.netPRO Readers&amp;rsquo; Choice Awards.&lt;a href="http://www.aspnetpro.com/readerschoice/default.asp"&gt;&lt;img alt="Readers' Choice Awards" hspace="10" src="http://www.ericjsmith.net/images/RCA2006.gif" align="right" vspace="2" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each year, asp.netPRO recognizes outstanding products and vendors in the ASP.NET add-on market. Please take a moment to select your favorite ASP.NET tools. This is your chance to voice your opinions regarding the tools and products you use in your everyday development efforts.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=440540" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/CodeSmith/default.aspx">CodeSmith</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/ericjsmith/archive/tags/General/default.aspx">General</category></item></channel></rss>