Roger Alsing Weblog

CIL – Compiler construction

with 2 comments

I’ve created a little sample on how to make your own .NET compiler.
The compiler uses Gold parser for parsing and Reflection.Emit to generate the compiled .exe file.

Initially I intended to make a sample on how to use Gold parser to parse and then compile Linq expressions, thus the name GoldLinq, however, Linq have now been replaced with Reflection.Emit.

Links:
My compiler source: http://www.puzzleframework.com/Roger/GoldLinq.zip
(C# VS.NET 2008 solution)

Gold parser: http://www.devincook.com/goldparser/
Grammar: http://www.devincook.com/goldparser/grammars/index.htm

How it works:

  • Gold parser – Calitha engine is used to parse the source code into a parse tree
  • The parse tree is transformed into a typed AST
  • The AST is verified using visitor pattern, the verifier handles type inferrence and auto casts.
  • The AST is optimized using visitor pattern, the optimizer replaces constant expressions and statements.
  • The AST is compiled into CIL/MSIL using visitor pattern.
  • If successful, the compiler will generate a file called “output.exe” in the same folder as the compiler

Samples:

Hello world 

display 'Hello World!'

 Have a nice day:

Display 'What is your name?' Read Name
Display 'Hello, ' & Name & '. Have a nice day!'

Blastoff: 

assign n = 10
while n >= 1 do
    display n
    assign n = n - 1
end
display 'Blast off!'

Miles and kilometers: 

Display
'Do you want to convert 1) Miles to Kilometers or 2) Kilometers to Miles?'
Read Choice        

if Choice == 1 then
    Display 'Please enter the number of miles' Read Miles
    Display Miles & ' Miles = ' & (Miles * 1.609)  & ' Kilometers'
else
    Display 'Please enter the number of kilometers' Read Kilometers
    Display Kilometers & ' Kilometers = ' & (Kilometers / 1.609)  & ' Miles'
end

Secret number: 

Assign SecretNumber = 64 

Display 'Please guess the secret number'
Read Guess          

While Guess <> SecretNumber Do
    If Guess < SecretNumber Then
        Display 'Your guess was too LOW. Try again.' Read Guess
    End    
If Guess > SecretNumber Then
        Display 'Your guess was too HIGH. Try again.' Read Guess
    End
End     

Display 'Correct!'

How to compile the samples:

First you need a source file to compile, just create a normal textfile and paste one of the samples above into it.
Once you have the code file you can compile it using the compiler:

c:whatever\bin\debug> GoldSample.exe mysource.txt

When the compiler is done, you can start the compiled application with:

c:\whatever\bin\debug> output.exe

The code is somewhat too big to cover in a blog post, so if you have any questions feel free to ask in the comment section.

//Roger

Written by Roger Alsing

March 3, 2008 at 6:10 pm

2 Responses

Subscribe to comments with RSS.

  1. Hi Roger,
    I still can’t use the forums on the Puzzel framework site. At one point I was able to login but posting of messages failed.

    I have a propostion for you. I really like the SyntaxBox control and it seems to be stagnating on the puzzel site as part of the framework. Would you be interested in allowing me to put the code on CodePlex as a stand alone project? Technically I could just fork it as long as I follow the OS license guidlines, but would much rather have you on board.

    I compared SyntaxBox to the latest from http://www.actiprosoftware.com/ and SyntaxBox is not that far behind it and as a seperate project could do very well.

    I could also convert some of the old docs on from the compona site for use on this new codeplex project.

    In case you are intersted here is a screenshot of SyntaxBox in my upcoming database Admin tool:
    http://www.amsoftwaredesign.com/node/34

    Let me know what you think.

    Tony Caduto
    AM Software
    http://www.amsoftwaredesign.com

    Tony Caduto

    March 10, 2008 at 12:48 pm

  2. Bestill my heart, someone beat me to it! Yours is better than mine would have been anyway! Nice work! I especially like the demo of the optimization. That’s something that’s not covered in very many places, at least not in code.

    dave.dolan

    May 14, 2008 at 5:05 pm


Leave a Reply