<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.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>Isaiah's blog</title><link>http://msmvps.com/blogs/isaiah/default.aspx</link><description>a blog about Visual Basic, language development, and more ...</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>GFN on DLR</title><link>http://msmvps.com/blogs/isaiah/archive/2009/01/08/gfn-on-dlr.aspx</link><pubDate>Thu, 08 Jan 2009 21:02:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1659482</guid><dc:creator>Isaiah</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/isaiah/rsscomments.aspx?PostID=1659482</wfw:commentRss><comments>http://msmvps.com/blogs/isaiah/archive/2009/01/08/gfn-on-dlr.aspx#comments</comments><description>&lt;p&gt;Over the past few weeks I have been developing a version of Joel Pobar&amp;#39;s GFN language that utilizes the DLR framework. I have modified Joel&amp;#39;s grammar for the GFN language to make it similar to that of Visual Basic grammar. Here is the updated grammar&lt;/p&gt;
&lt;p&gt;&amp;lt;stmt&amp;gt; := Dim &amp;lt;ident&amp;gt; = &amp;lt;expr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | &amp;lt;ident&amp;gt; = &amp;lt;expr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | For &amp;lt;ident&amp;gt; = &amp;lt;expr&amp;gt; To &amp;lt;expr&amp;gt; &amp;lt;stmt&amp;gt; End &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Read &amp;lt;ident&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Print &amp;lt;expr&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;expr&amp;gt; := &amp;lt;string&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | &amp;lt;int&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | &amp;lt;bin_expr&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; | &amp;lt;ident&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;bin_expr&amp;gt; := &amp;lt;expr&amp;gt; &amp;lt;bin_op&amp;gt; &amp;lt;expr&amp;gt; &lt;br /&gt;&amp;lt;bin_op&amp;gt; := + | - | * | / &lt;/p&gt;
&lt;p&gt;&amp;lt;ident&amp;gt; := &amp;lt;char&amp;gt; &amp;lt;ident_rest&amp;gt;* &lt;br /&gt;&amp;lt;ident_rest&amp;gt; := &amp;lt;char&amp;gt; | &amp;lt;digit&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;lt;int&amp;gt; := &amp;lt;digit&amp;gt;+ &lt;br /&gt;&amp;lt;digit&amp;gt; := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 &lt;/p&gt;
&lt;p&gt;&amp;lt;string&amp;gt; := &amp;quot; &amp;lt;string_elem&amp;gt;* &amp;quot; &lt;br /&gt;&amp;lt;string_elem&amp;gt; := &amp;lt;any char other than &amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Through this process I have discovered that developing a language is both an easy and difficult task. I say that it was a difficult task because of the complexity of most examples available on the internet such as &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt;. My rationale behind developing this version of the GFN language is to provide a more simple example of how to develop a language using the &lt;a href="http://www.codeplex.com/dlr"&gt;Dynamic Language Runtime&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the coming weeks I will exploring and implementing new features such as user-defined functions, variable scoping, and classes. For those of you who are interested Kathy Kam has already outlined how to incorporate BCL calls from the original GFN source in her blog post &lt;a href="http://blogs.msdn.com/kathykam/archive/2005/10/17/482091.aspx"&gt;Augmenting to the Good For Nothing Compiler.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The solution which contains both a C# and VB.Net version of Joel&amp;rsquo;s code and mine can be found &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.65.94.82/GFN.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Edit - 1/09/2009&amp;nbsp;updated source code &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1659482" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.65.94.82/GFN.zip" length="2530453" type="application/x-zip-compressed" /><category domain="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx">DLR</category><category domain="http://msmvps.com/blogs/isaiah/archive/tags/Visual+Basic/default.aspx">Visual Basic</category><category domain="http://msmvps.com/blogs/isaiah/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>DLR @ PDC</title><link>http://msmvps.com/blogs/isaiah/archive/2008/11/03/dlr-pdc.aspx</link><pubDate>Mon, 03 Nov 2008 18:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652931</guid><dc:creator>Isaiah</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/isaiah/rsscomments.aspx?PostID=1652931</wfw:commentRss><comments>http://msmvps.com/blogs/isaiah/archive/2008/11/03/dlr-pdc.aspx#comments</comments><description>&lt;p&gt;I stumbled across &lt;a href="http://channel9.msdn.com/pdc2008/TL10/" title="Deep Dive: Dynamic Languages in Microsoft .NET"&gt;Deep Dive: Dynamic Languages in Microsoft .NET&lt;/a&gt;&amp;nbsp;Jim Hugunin&amp;#39;s presentation about DLR at PDC.&amp;nbsp; I haven&amp;#39;t had a chance to listen to the presentation but have the reviewed the slides and code, they were rather insightful. For more great resources and information check out &lt;a href="http://blogs.msdn.com/hugunin/" title="Jim Hugunin&amp;#39;s Thinking Dynamic"&gt;Jim Hugunin&amp;#39;s Thinking Dynamic&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1652931" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx">DLR</category><category domain="http://msmvps.com/blogs/isaiah/archive/tags/PDC/default.aspx">PDC</category></item><item><title>DLR Visual Basic Scanner</title><link>http://msmvps.com/blogs/isaiah/archive/2008/11/02/dlr-visual-basic-scanner.aspx</link><pubDate>Mon, 03 Nov 2008 05:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652874</guid><dc:creator>Isaiah</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/isaiah/rsscomments.aspx?PostID=1652874</wfw:commentRss><comments>http://msmvps.com/blogs/isaiah/archive/2008/11/02/dlr-visual-basic-scanner.aspx#comments</comments><description>&lt;p&gt;In my research of how to develop a language I came across several different compilers on Codeplex. In my development of a compiler I am using the following design&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/isaiah/image_5F00_20002AE7.png"&gt;&lt;img border="0" width="542" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/isaiah/image_5F00_thumb_5F00_10E94C0D.png" alt="image" height="111" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In order to keep things simple I am following the grammar of the Visual Basic .NET language. I have started development and have managed to the scanner written, source code below; I based it upon Joel Pobar&amp;rsquo;s &lt;a href="http://www.codeplex.com/Nua"&gt;Nua&lt;/a&gt;. I am still fine turning and learning more about the proper way to develop a compiler.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; Microsoft.Scripting
&lt;span class="kwrd"&gt;Imports&lt;/span&gt; Microsoft.Scripting.Runtime

&lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; A lexical analyzer for GFN. It produces a stream of lexical tokens.&lt;/span&gt;
&lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; Scanner
    &lt;span class="rem"&gt;&amp;#39; Buffer used to extract and process tokens&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _buffer &lt;span class="kwrd"&gt;As&lt;/span&gt; TokenizerBuffer
    &lt;span class="rem"&gt;&amp;#39; Used to track errors&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _errors &lt;span class="kwrd"&gt;As&lt;/span&gt; ErrorSink
    &lt;span class="rem"&gt;&amp;#39; Source code to be read.&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _source &lt;span class="kwrd"&gt;As&lt;/span&gt; SourceUnit
    &lt;span class="rem"&gt;&amp;#39; Token being processed&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _token &lt;span class="kwrd"&gt;As&lt;/span&gt; Token

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Fetches the current token without advancing the stream position&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;The current token.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;ReadOnly&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt; Peek() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Get&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._token &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt; &lt;span class="kwrd"&gt;OrElse&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;._token.Type = TokenType.None) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                &lt;span class="kwrd"&gt;Me&lt;/span&gt;._token = ReadToken()
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

            &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;._token
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Get&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; Peek&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Constructs a scanner for the specified TextReader.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;param name=&amp;quot;source&amp;quot;&amp;gt;Represents the source code to be processed.&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; errors &lt;span class="kwrd"&gt;As&lt;/span&gt; ErrorSink, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; source &lt;span class="kwrd"&gt;As&lt;/span&gt; SourceUnit)
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._errors = errors
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._source = source

        &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._source &lt;span class="kwrd"&gt;Is&lt;/span&gt; &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;) &lt;span class="kwrd"&gt;Then&lt;/span&gt; &lt;span class="kwrd"&gt;Throw&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;SourceUnit&amp;quot;&lt;/span&gt;)

        &lt;span class="rem"&gt;&amp;#39; multiEolns - Whether to allow multiple forms of EOLN If false only &amp;#39;\n&amp;#39; is treated as a line separator otherwise &amp;#39;\n&amp;#39;, &amp;#39;\r\n&amp;#39; and &amp;#39;\r&amp;#39; are treated as separators&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer = &lt;span class="kwrd"&gt;New&lt;/span&gt; TokenizerBuffer(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._source.GetReader(), SourceLocation.MinValue, 1024, &lt;span class="kwrd"&gt;True&lt;/span&gt;)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; New&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Reads the next token available in the stream.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;Next token available in the stream.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; Read() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; readToken &lt;span class="kwrd"&gt;As&lt;/span&gt; Token = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;

        &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._token.Type = TokenType.None) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            readToken = &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ReadToken()
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._token = &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ReadToken()
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; readToken
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

        readToken = &lt;span class="kwrd"&gt;Me&lt;/span&gt;._token
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._token = &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ReadToken()
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; readToken
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; Read&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Read the next avaliable token in the stream.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;Next avaliable token.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ReadToken() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; token &lt;span class="kwrd"&gt;As&lt;/span&gt; Token = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; nchr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt; = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;

        &lt;span class="rem"&gt;&amp;#39; Discard any white spaces.&lt;/span&gt;
        &lt;span class="kwrd"&gt;While&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek &amp;lt;&amp;gt; -1 &lt;span class="kwrd"&gt;AndAlso&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt;.IsWhiteSpace(ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek)))
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()
            &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt;

        &lt;span class="rem"&gt;&amp;#39; Has the end of the buffer been reached?&lt;/span&gt;
        &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek = -1) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;True&lt;/span&gt;)
            token = &lt;span class="kwrd"&gt;New&lt;/span&gt; EndOfStreamToken(&lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd))
            &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

        &lt;span class="rem"&gt;&amp;#39; Read the first character avaliable in the buffer. &lt;/span&gt;
        nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek())

        &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Char&lt;/span&gt;.IsLetter(nchr) &lt;span class="kwrd"&gt;OrElse&lt;/span&gt; nchr = &lt;span class="str"&gt;&amp;quot;_&amp;quot;&lt;/span&gt;c) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ScanKeywordOrIdentifier()
        &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt;.IsDigit(nchr) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ScanNumericLiteral()
        &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; (nchr = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;c) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ScanStringLiteral()
        &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; (nchr = &lt;span class="str"&gt;&amp;quot;=&amp;quot;&lt;/span&gt;c) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
            token = &lt;span class="kwrd"&gt;New&lt;/span&gt; PunctuatorToken(&lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), TokenType.Equals)
            &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
        &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; (&lt;span class="str"&gt;&amp;quot;+*/^(){}&amp;quot;&lt;/span&gt;.IndexOf(nchr) &amp;lt;&amp;gt; -1) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; type &lt;span class="kwrd"&gt;As&lt;/span&gt; TokenType = TokenType.None

            &lt;span class="rem"&gt;&amp;#39; Single-character punctuation.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;+&amp;quot;&lt;/span&gt;)
                    type = TokenType.Plus
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;)
                    type = TokenType.Star
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;)
                    type = TokenType.ForwardSlash
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;^&amp;quot;&lt;/span&gt;)
                    type = TokenType.Caret
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;(&amp;quot;&lt;/span&gt;)
                    type = TokenType.LeftParenthesis
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;)
                    type = TokenType.RightParenthesis
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;)
                    type = TokenType.LeftCurlyBrace
                &lt;span class="kwrd"&gt;Case&lt;/span&gt; AscW(&lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;)
                    type = TokenType.RightCurlyBrace
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Select&lt;/span&gt;

            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
            token = &lt;span class="kwrd"&gt;New&lt;/span&gt; PunctuatorToken(&lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), type)
            &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
        &lt;span class="kwrd"&gt;Else&lt;/span&gt;
            &lt;span class="rem"&gt;&amp;#39; An invalid character has been discovered. &lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
            token = &lt;span class="kwrd"&gt;New&lt;/span&gt; ErrorToken(SyntaxErrorType.InvalidCharacter, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd))
            &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; ReadNextToken &lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Scans in all the digits in the numeric literal.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;param name=&amp;quot;acc&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; ScanDigit(&lt;span class="kwrd"&gt;ByRef&lt;/span&gt; acc &lt;span class="kwrd"&gt;As&lt;/span&gt; Text.StringBuilder)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek)
        &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek = -1 &lt;span class="kwrd"&gt;OrElse&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt;.IsDigit(nchr)) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._errors.Add(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._source, &lt;span class="str"&gt;&amp;quot;Expected digits&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), 0, Severity.FatalError)
            &lt;span class="rem"&gt;&amp;#39; Invalid numeric constant. &lt;/span&gt;
            acc.Append(&lt;span class="str"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;)
        &lt;span class="kwrd"&gt;Else&lt;/span&gt;
            &lt;span class="kwrd"&gt;While&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek &amp;lt;&amp;gt; -1 &lt;span class="kwrd"&gt;AndAlso&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt;.IsDigit(nchr))
                acc.Append(Chr(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()))
                nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek)
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt;
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; ScanDigit&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Scans in the identifier.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;Token associated with the identifier.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ScanIdentifier() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; acc &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Text.StringBuilder()
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; nchr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt; = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; token &lt;span class="kwrd"&gt;As&lt;/span&gt; Token = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;


        nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek())
        &lt;span class="kwrd"&gt;While&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek &amp;lt;&amp;gt; -1 &lt;span class="kwrd"&gt;AndAlso&lt;/span&gt; (&lt;span class="kwrd"&gt;Char&lt;/span&gt;.IsLetterOrDigit(nchr) &lt;span class="kwrd"&gt;OrElse&lt;/span&gt; nchr = &lt;span class="str"&gt;&amp;quot;_&amp;quot;&lt;/span&gt;c))
            acc.Append(ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()))
            nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek())
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt;

        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
        token = &lt;span class="kwrd"&gt;New&lt;/span&gt; IdentifierToken(acc.ToString(), &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), TokenType.Identifier)
        &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; ScanIdentifier&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Identifies the keyword or identifier.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;Token associated with the given keyword or identifier.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ScanKeywordOrIdentifier() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; identifier &lt;span class="kwrd"&gt;As&lt;/span&gt; IdentifierToken = &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ScanIdentifier()
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; token &lt;span class="kwrd"&gt;As&lt;/span&gt; Token = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;

        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
        token = &lt;span class="kwrd"&gt;New&lt;/span&gt; IdentifierToken(identifier.Identifier, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), IdentifierToken.TokenTypeFromString(identifier.Identifier))
        &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; ScanKeywordOrIdentifier&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Scans in a numeric literal.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;Token associated with the numeric literal.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ScanNumericLiteral() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; acc &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Text.StringBuilder()
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; token &lt;span class="kwrd"&gt;As&lt;/span&gt; Token = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;

        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ScanDigit(acc)
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
        token = &lt;span class="kwrd"&gt;New&lt;/span&gt; IntegerLiteralToken(&lt;span class="kwrd"&gt;Integer&lt;/span&gt;.Parse(acc.ToString()), &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd))
        &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; ScanNumericLiteral&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; Scans in a string literal.&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;returns&amp;gt;Token associated with the string literal.&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ScanStringLiteral() &lt;span class="kwrd"&gt;As&lt;/span&gt; Token
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; acc &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; Text.StringBuilder()
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; nchr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Char&lt;/span&gt; = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; token &lt;span class="kwrd"&gt;As&lt;/span&gt; Token = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;

        &lt;span class="rem"&gt;&amp;#39; Discard the initial quote. &lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()

        &lt;span class="rem"&gt;&amp;#39; Has the end of the buffer been reached?&lt;/span&gt;
        &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek = -1) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._errors.Add(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._source, &lt;span class="str"&gt;&amp;quot;Unterminated string literal&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), 0, Severity.FatalError)
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
            token = &lt;span class="kwrd"&gt;New&lt;/span&gt; ErrorToken(SyntaxErrorType.InvalidStringLiteral, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd))
            &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;

        nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek)

        &lt;span class="rem"&gt;&amp;#39; Read until the terminating quote is read. &lt;/span&gt;
        &lt;span class="kwrd"&gt;While&lt;/span&gt; (&lt;span class="kwrd"&gt;Not&lt;/span&gt; nchr = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;c)
            acc.Append(ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()))

            &lt;span class="rem"&gt;&amp;#39; Has the end of the buffer been reached?&lt;/span&gt;
            &lt;span class="kwrd"&gt;If&lt;/span&gt; (&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek = -1) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
                &lt;span class="kwrd"&gt;Me&lt;/span&gt;._errors.Add(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._source, &lt;span class="str"&gt;&amp;quot;Unterminated string literal&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd), 0, Severity.FatalError)
                &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
                token = &lt;span class="kwrd"&gt;New&lt;/span&gt; ErrorToken(SyntaxErrorType.InvalidStringLiteral, &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd))
                &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
                &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
                &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
            &lt;span class="kwrd"&gt;Else&lt;/span&gt;
                nchr = ChrW(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Peek)
            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt;

        &lt;span class="rem"&gt;&amp;#39; Discard the terminating quote.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.Read()

        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.MarkTokenEnd(&lt;span class="kwrd"&gt;False&lt;/span&gt;)
        token = &lt;span class="kwrd"&gt;New&lt;/span&gt; StringLiteralToken(acc.ToString(), &lt;span class="kwrd"&gt;New&lt;/span&gt; SourceSpan(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenStart, &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.TokenEnd))
        &lt;span class="rem"&gt;&amp;#39; Buffer can drop current token.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;._buffer.DiscardToken()
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; token
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;span class="rem"&gt;&amp;#39; ScanStringLiteral&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt;&lt;span class="rem"&gt;&amp;#39; Scanner&lt;/span&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1652874" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx">DLR</category><category domain="http://msmvps.com/blogs/isaiah/archive/tags/Visual+Basic/default.aspx">Visual Basic</category></item><item><title>Dynamic Language Runtime</title><link>http://msmvps.com/blogs/isaiah/archive/2008/11/02/dynamic-language-runtime.aspx</link><pubDate>Sun, 02 Nov 2008 22:40:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1652852</guid><dc:creator>Isaiah</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/isaiah/rsscomments.aspx?PostID=1652852</wfw:commentRss><comments>http://msmvps.com/blogs/isaiah/archive/2008/11/02/dynamic-language-runtime.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size:8.5pt;color:black;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;One of the things I have wanted to do is develop a programming language. To me it was one of those things that seemed extremely complicated, and that it would ultimately be something I do when I am much older. Recently my interest got peeked and I started to ask around what all needed to be done in order to develop a compiler. Paul Vick suggested that I look at &lt;a href="http://www.codeplex.com/IronPython" title="IronPython"&gt;IronPython&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.ironruby.net/" title="IronRuby"&gt;IronRuby&lt;/a&gt;, both of which implement a new framework being developed by Microsoft known as the &lt;a href="http://www.codeplex.com/dlr" title="Dynamic Language Runtime"&gt;Dynamic Language Runtime&lt;/a&gt; (DLR). The DLR enables developers to more readily develop dynamic languages for the .NET platform&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:8.5pt;color:black;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Over the next several weeks I will be studying the DLR and working on implementing to build a basic compiler. Keep on eye out for updates.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1652852" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx">DLR</category></item></channel></rss>