Skip to main content

CIL – Compiler construction

· 3 min read
Founder, Asynkron Systems

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 has 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 inference 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 text file 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