<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Peli's Farm - Pex, Stubs, Moles, QuickGraph, MbUnit, Reflector Addins - Toad</title>
    <link>http://blog.dotnetwiki.org/</link>
    <description>TouchDevelop, Pex4Fun, Rise4Fun, Pex, Moles, QuickGraph, MbUnit, Reflector Addins</description>
    <language>en-us</language>
    <copyright>Jonathan 'Peli' de Halleux</copyright>
    <lastBuildDate>Sun, 08 Jul 2007 22:23:32 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.2.8279.16125</generator>
    <managingEditor>jonathan.dehalleux@gmail.com</managingEditor>
    <webMaster>jonathan.dehalleux@gmail.com</webMaster>
    <item>
      <trackback:ping>http://blog.dotnetwiki.org/Trackback.aspx?guid=37d131c7-316d-4847-8078-0489a8f67bed</trackback:ping>
      <pingback:server>http://blog.dotnetwiki.org/pingback.aspx</pingback:server>
      <pingback:target>http://blog.dotnetwiki.org/PermaLink,guid,37d131c7-316d-4847-8078-0489a8f67bed.aspx</pingback:target>
      <dc:creator>Jonathan de Halleux</dc:creator>
      <wfw:comment>http://blog.dotnetwiki.org/CommentView,guid,37d131c7-316d-4847-8078-0489a8f67bed.aspx</wfw:comment>
      <wfw:commentRss>http://blog.dotnetwiki.org/SyndicationService.asmx/GetEntryCommentsRss?guid=37d131c7-316d-4847-8078-0489a8f67bed</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I finally posted a project that I had been developing last year in my daily commutes: <strong>Toad </strong>(<a href="http://www.codeplex.com/toad">www.codeplex.com/toad</a>)<strong>.</strong></p>
        <p>
Toad is an (experimental) compiler infrastructure to build languages top of .Net,
without knowing much about IL. Mostly it was a way for me to learn first hand all
the little subtleties of writing multiple language on top of .Net.
</p>
        <p>
          <strong>What does Toad give you?</strong>
        </p>
        <ul>
          <li>
A dynamic console that supports multiple languages, 
</li>
          <li>
An Expression/Statement tree that can be translated back to IL, 
</li>
          <li>
Built-in debugging capabilities, 
</li>
          <li>
A set of Visitors on top this AST that implement various optimization and language
constructs (this is the fun part), 
</li>
          <li>
There's a lot of stuff, I used to take the bus twice a day. :) 
</li>
          <li>
Toad does not use the DLR maybe in the future.</li>
        </ul>
        <p>
          <strong>What is it good for?</strong>
        </p>
        <ul>
          <li>
Toy around with IL and try to build your micro language. 
</li>
          <li>
Don't use it for anything serious.</li>
        </ul>
        <p>
          <strong>Good For Nothing Language</strong>
        </p>
        <p>
 The <a href="http://blogs.msdn.com/joelpob/archive/2005/10/04/476965.aspx">'Good
for nothing' language</a> is a toy language that Joel Pobar used to illustrate managed
IL compilers. With Gfn, you can write simple program such as:
</p>
        <blockquote>
          <p>
            <font face="Courier New">var i = 123;<br />
print i;<br />
for j = i to 10 do print i+j; end;</font>
          </p>
        </blockquote>
        <p>
          <strong>The parsing stuff</strong>
        </p>
I took Joel's example and wrote a grammar for the <a href="http://www.devincook.com/goldparser/" target="_blank">Gold
parser</a>. It looks like something like this that is then compiled by <a href="http://www.devincook.com/goldparser/">Gold</a>: <blockquote><p><font face="Courier New">&lt;Program&gt; ::= &lt;BlockStatement&gt; </font></p><p><font face="Courier New">&lt;BlockStatement&gt; ::= &lt;BlockStatement&gt; &lt;Statement&gt;
';'<br />
            | &lt;Statement&gt;
';' </font></p><p><font face="Courier New">&lt;Statement&gt; ::= 'var' Identifier '=' &lt;Expression&gt;<br />
    | Identifier '=' &lt;Expression&gt;<br />
    | 'for' Identifier '=' &lt;Expression&gt; 'to' &lt;Expression&gt;
'do' &lt;BlockStatement&gt; 'end'<br />
    | 'read_int' Identifier<br />
    | 'print' &lt;Expression&gt;<br />
    | 'return' &lt;Expression&gt;</font></p></blockquote><p>
At the end of the process, you get a visitor for the code AST. This is the boiler
plate code to start using Toad to build the compiler:
</p><blockquote><p><font face="Courier New">// &lt;Statement&gt; ::= for Identifier '=' &lt;Expression&gt;
to &lt;Expression&gt; do &lt;BlockStatement&gt; end<br />
protected virtual object VisitRuleStatementforIdentifierEqtodoend(SyntaxNode node)<br />
{<br />
     throw new NotSupportedException("RuleStatementforIdentifierEqtodoend");<br />
}</font></p></blockquote><p><strong>Implementing the 'for' loop</strong></p><p>
Let's take a look at the implementation of the for loop. We need to: 
</p><ul><li>
extract the from, to expressions, 
</li><li>
declare a variable for the index, 
</li><li>
build the predicate i &lt; to etc..., 
</li><li>
emit symbols for debugging,</li></ul><p>
The code below shows the full implementation of that statement:
</p><blockquote><p><font face="Courier New">// &lt;Statement&gt; ::= for Identifier '=' &lt;Expression&gt;
to &lt;Expression&gt; do &lt;BlockStatement&gt; end<br />
protected override object VisitRuleStatementforIdentifierEqtodoend(SyntaxNode node)<br />
{<br />
    // from, to<br />
    Expression from = (Expression)this.VisitNode(node[3]);<br />
    Expression to = (Expression)this.VisitNode(node[5]); </font></p><p><font face="Courier New">    // x = from<br />
    VariableDeclarationStatement init = Stm.Var(node[1].Data, from);<br /><br />
    // body<br />
    this.Context.PushScope();<br />
    this.Context.PushVariable(init.Variable); </font></p><p><font face="Courier New">    Unit body = (Unit)this.VisitNode(node[7]); </font></p><p><font face="Courier New">    // i &lt; to;<br />
    Expression ilto = Expr.LessThanOrEqual(Expr.Var(init), to);<br />
    ilto.Symbol = FromNode(node[1]);<br />
    // ++i<br />
    Statement inc = Stm.Expr(Expr.PrePlusPlus(Expr.Var(init))); </font></p><p><font face="Courier New">    this.Context.PopScope(); </font></p><p><font face="Courier New">    ForStatement forstm = Stm.For(init, ilto,
inc);<br />
    forstm.Body = Stm.FromUnit(body); </font></p><p><font face="Courier New">    return forstm;<br />
}</font></p></blockquote><p><strong>Hooking up the visitor in Toad</strong></p><p>
The last step is to package our visitor as a 'language' and return the generated statements
or expression to Toad. We can spin up the interactive console, load Gfn and try it
out: 
</p><p><a href="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_3.png" atomicselection="true"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="209" alt="image" src="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_thumb_3.png" width="500" border="0" /></a></p><p>
Nothing really mind blowing here. Let's turn on live IL debugging to see what happening
under the hood. This mode emits the IL source of the method, adds a bunch of 'nop'
instructions to force the debugger to step on each IL instruction:
</p><p><a href="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_5.png" atomicselection="true"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="448" alt="image" src="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_thumb_5.png" width="527" border="0" /></a></p><p>
You can see in the generated code how the expressions got translated into IL
instructions. 
</p><img width="0" height="0" src="http://blog.dotnetwiki.org/aggbug.ashx?id=37d131c7-316d-4847-8078-0489a8f67bed" /></body>
      <title>Toad, experimenting with managed compilation</title>
      <guid isPermaLink="false">http://blog.dotnetwiki.org/PermaLink,guid,37d131c7-316d-4847-8078-0489a8f67bed.aspx</guid>
      <link>http://blog.dotnetwiki.org/2007/07/08/ToadExperimentingWithManagedCompilation.aspx</link>
      <pubDate>Sun, 08 Jul 2007 22:23:32 GMT</pubDate>
      <description>&lt;p&gt;
I finally posted a project that I had been developing last year in my daily commutes: &lt;strong&gt;Toad&amp;nbsp;&lt;/strong&gt;(&lt;a href="http://www.codeplex.com/toad"&gt;www.codeplex.com/toad&lt;/a&gt;)&lt;strong&gt;.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Toad is an (experimental)&amp;nbsp;compiler infrastructure to build languages top of .Net,
without knowing much about IL. Mostly it was a way for me to learn first hand all
the little subtleties of writing&amp;nbsp;multiple language on top of .Net.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What does Toad give you?&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
A dynamic console that supports multiple languages, 
&lt;li&gt;
An Expression/Statement tree that can be translated back to IL, 
&lt;li&gt;
Built-in debugging capabilities, 
&lt;li&gt;
A set of Visitors on top this AST that implement various optimization and language
constructs (this is the fun part), 
&lt;li&gt;
There's a lot of stuff, I used to take the bus twice a day. :) 
&lt;li&gt;
Toad does not use the DLR maybe in the future.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;What is it good for?&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Toy around with IL and try to build your micro language. 
&lt;li&gt;
Don't use it for anything serious.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Good For Nothing Language&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;The &lt;a href="http://blogs.msdn.com/joelpob/archive/2005/10/04/476965.aspx"&gt;'Good
for nothing' language&lt;/a&gt; is a toy language that Joel Pobar used to illustrate managed
IL compilers. With Gfn, you can write simple program such as:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;var i = 123;&lt;br&gt;
print i;&lt;br&gt;
for j = i to 10 do print i+j; end;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;The parsing stuff&lt;/strong&gt;
&lt;/p&gt;
I took Joel's example and wrote a grammar for the &lt;a href="http://www.devincook.com/goldparser/" target=_blank&gt;Gold
parser&lt;/a&gt;. It looks like something like this that is then compiled by &lt;a href="http://www.devincook.com/goldparser/"&gt;Gold&lt;/a&gt;: &lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;Program&amp;gt; ::= &amp;lt;BlockStatement&amp;gt; &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;BlockStatement&amp;gt; ::= &amp;lt;BlockStatement&amp;gt; &amp;lt;Statement&amp;gt;
';'&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | &amp;lt;Statement&amp;gt;
';' &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;lt;Statement&amp;gt; ::= 'var' Identifier '=' &amp;lt;Expression&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | Identifier '=' &amp;lt;Expression&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | 'for' Identifier '=' &amp;lt;Expression&amp;gt; 'to' &amp;lt;Expression&amp;gt;
'do' &amp;lt;BlockStatement&amp;gt; 'end'&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | 'read_int' Identifier&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | 'print' &amp;lt;Expression&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; | 'return' &amp;lt;Expression&amp;gt;&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
At the end of the process, you get a visitor for the code AST. This is the boiler
plate code to start using Toad to build the compiler:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;// &amp;lt;Statement&amp;gt; ::= for Identifier '=' &amp;lt;Expression&amp;gt;
to &amp;lt;Expression&amp;gt; do &amp;lt;BlockStatement&amp;gt; end&lt;br&gt;
protected virtual object VisitRuleStatementforIdentifierEqtodoend(SyntaxNode node)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotSupportedException("RuleStatementforIdentifierEqtodoend");&lt;br&gt;
}&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Implementing the 'for' loop&lt;/strong&gt; 
&lt;p&gt;
Let's take a look at the implementation of the for loop. We need to: 
&lt;ul&gt;
&lt;li&gt;
extract the from, to expressions, 
&lt;li&gt;
declare a variable for the index, 
&lt;li&gt;
build the predicate i &amp;lt; to etc..., 
&lt;li&gt;
emit symbols for debugging,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The code below shows the full implementation of that statement:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;// &amp;lt;Statement&amp;gt; ::= for Identifier '=' &amp;lt;Expression&amp;gt;
to &amp;lt;Expression&amp;gt; do &amp;lt;BlockStatement&amp;gt; end&lt;br&gt;
protected override object VisitRuleStatementforIdentifierEqtodoend(SyntaxNode node)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // from, to&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression from = (Expression)this.VisitNode(node[3]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression to = (Expression)this.VisitNode(node[5]); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // x = from&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; VariableDeclarationStatement init = Stm.Var(node[1].Data, from);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // body&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Context.PushScope();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Context.PushVariable(init.Variable); &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unit body = (Unit)this.VisitNode(node[7]); &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // i &amp;lt; to;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression ilto = Expr.LessThanOrEqual(Expr.Var(init), to);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ilto.Symbol = FromNode(node[1]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // ++i&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Statement inc = Stm.Expr(Expr.PrePlusPlus(Expr.Var(init))); &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Context.PopScope(); &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ForStatement forstm = Stm.For(init, ilto,
inc);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; forstm.Body = Stm.FromUnit(body); &lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return forstm;&lt;br&gt;
}&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;Hooking up the visitor in Toad&lt;/strong&gt; 
&lt;p&gt;
The last step is to package our visitor as a 'language' and return the generated statements
or expression to Toad. We can spin up the interactive console, load Gfn and try it
out: 
&lt;p&gt;
&lt;a href="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_3.png" atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=209 alt=image src="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_thumb_3.png" width=500 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Nothing really mind blowing here. Let's turn on live IL debugging to see what happening
under the hood. This mode emits the IL source of the method, adds a bunch of 'nop'
instructions to force the debugger to step on each IL instruction:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_5.png" atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=448 alt=image src="http://blog.dotnetwiki.org/content/binary/WindowsLiveWriter/ToadNewfroginTown_8898/image_thumb_5.png" width=527 border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You can see in the generated code&amp;nbsp;how the expressions got translated into IL
instructions.&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.dotnetwiki.org/aggbug.ashx?id=37d131c7-316d-4847-8078-0489a8f67bed" /&gt;</description>
      <comments>http://blog.dotnetwiki.org/CommentView,guid,37d131c7-316d-4847-8078-0489a8f67bed.aspx</comments>
      <category>Toad</category>
    </item>
  </channel>
</rss>