<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Isaiah&amp;#39;s blog</title><subtitle type="html">a blog about Visual Basic, language development, and more ...</subtitle><id>http://msmvps.com/blogs/isaiah/atom.aspx</id><link rel="alternate" type="text/html" href="http://msmvps.com/blogs/isaiah/default.aspx" /><link rel="self" type="application/atom+xml" href="http://msmvps.com/blogs/isaiah/atom.aspx" /><generator uri="http://communityserver.org" version="4.0.31104.93">Community Server</generator><updated>2008-11-02T16:40:00Z</updated><entry><title>DLR @ PDC</title><link rel="alternate" type="text/html" href="/blogs/isaiah/archive/2008/11/03/dlr-pdc.aspx" /><id>/blogs/isaiah/archive/2008/11/03/dlr-pdc.aspx</id><published>2008-11-03T18:20:00Z</published><updated>2008-11-03T18:20:00Z</updated><content type="html">&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;</content><author><name>Isaiah</name><uri>http://msmvps.com/members/Isaiah/default.aspx</uri></author><category term="DLR" scheme="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx" /><category term="PDC" scheme="http://msmvps.com/blogs/isaiah/archive/tags/PDC/default.aspx" /></entry><entry><title>DLR Visual Basic Scanner</title><link rel="alternate" type="text/html" href="/blogs/isaiah/archive/2008/11/02/dlr-visual-basic-scanner.aspx" /><id>/blogs/isaiah/archive/2008/11/02/dlr-visual-basic-scanner.aspx</id><published>2008-11-03T05:23:00Z</published><updated>2008-11-03T05:23:00Z</updated><content type="html">&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 title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="111" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/isaiah/image_5F00_thumb_5F00_10E94C0D.png" width="542" border="0" /&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’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;#160;&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.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;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(&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;Select&lt;/span&gt; &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="kwrd"&gt;CType&lt;/span&gt;(identifier.Identifier, &lt;span class="kwrd"&gt;String&lt;/span&gt;)
            &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Dim&amp;quot;&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(&lt;span class="kwrd"&gt;Nothing&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), TokenType.&lt;span class="kwrd"&gt;Dim&lt;/span&gt;)
                &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;Case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;For&amp;quot;&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(&lt;span class="kwrd"&gt;Nothing&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), TokenType.&lt;span class="kwrd"&gt;For&lt;/span&gt;)
                &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;Case&lt;/span&gt; &lt;span class="kwrd"&gt;Else&lt;/span&gt;
                &lt;span class="kwrd"&gt;Return&lt;/span&gt; identifier
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Select&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; 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; &amp;#39; Scanner&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;</content><author><name>Isaiah</name><uri>http://msmvps.com/members/Isaiah/default.aspx</uri></author><category term="DLR" scheme="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx" /><category term="Visual Basic" scheme="http://msmvps.com/blogs/isaiah/archive/tags/Visual+Basic/default.aspx" /></entry><entry><title>Dynamic Language Runtime</title><link rel="alternate" type="text/html" href="/blogs/isaiah/archive/2008/11/02/dynamic-language-runtime.aspx" /><id>/blogs/isaiah/archive/2008/11/02/dynamic-language-runtime.aspx</id><published>2008-11-02T22:40:00Z</published><updated>2008-11-02T22:40:00Z</updated><content type="html">&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;</content><author><name>Isaiah</name><uri>http://msmvps.com/members/Isaiah/default.aspx</uri></author><category term="DLR" scheme="http://msmvps.com/blogs/isaiah/archive/tags/DLR/default.aspx" /></entry></feed>