Roslyn でオリジナル C# を作ろう

先日、.NET の新しいコンパイラーである Roslyn がオープンソースになりました。
つまり、Roslyn をいじれば C# や VB ベースのオリジナル言語が作れちゃいます。

とりあえず、Taking a tour of Roslyn に沿って
Roslyn をビルドしてみましょう。

ビルド環境ですが、
Roslyn は拡張機能として提供されるので VS Express ではできないと思います。
Visual Studio 2013 Professional 以上のエディションを使います。
拡張機能のVSIXパッケージを作成するので VS 2013 SDK が必要です。

まず、Roslyn のビルドには Roslyn が必要です。
プレビューサイトから Roslyn End User Preview をダウンロードします。
Microsoft アカウントでサインインして名前などの入力が必要です。
VSIXパッケージでインストールします。

次に Roslyn のソースコードを入手します。
Git リポジトリなので
git clone https://git01.codeplex.com/roslyn
で入手できます。

Build の Keynote で Anders 氏がデモンストレーションしていた、
«» で挟まれているところを文字列リテラルとする拡張をやってみましょう。
Src\Compilers\CSharp\Source\Parser\Lexer.cs を開きます。
ScanSyntaxToken メソッドの switch 文に文字列リテラルの開始文字として case を追加します。

1
2
3
4
5
6
7
8
9
// Start scanning the token
character = TextWindow.PeekChar();
switch (character)
{
case '\"':
case '\'':
case '«':
this.ScanStringLiteral(ref info);
break;

次に ScanStringLiteral メソッドの if 文に条件を追加します。

1
2
3
4
var quoteCharacter = TextWindow.PeekChar();
if (quoteCharacter == '\'' || quoteCharacter == '"' || quoteCharacter == '«')
{
TextWindow.AdvanceChar();

1
2
3
4
5
else if (ch == quoteCharacter || (ch == '»' && quoteCharacter == '«'))
{
TextWindow.AdvanceChar();
break;
}

コードの変更ができたらビルドします。
結構時間かかります。
ファイルは Binaries/Debug に出力されます。
その場所に Program.cs を作成して先ほど拡張した文字列リテラルを使うプログラムを書いてみましょう。

1
2
3
4
5
6
7
8
9
10
using System.Console;
class Program
{
static void Main(string[] args)
{
WriteLine();
WriteLine(«Welcome to my version of Roslyn!»);
}
}

コンパイラの実行ファイルは rcsc.exe になっています。
rcsc.exe Program.cs
でビルド。エラーもなくビルドできるはずです。
Program.exe を実行すればちゃんと出力されます。

Roslyn で手軽に C# の拡張ができました。
ソースコード全体は非常に量が多いので読んで理解して色々拡張していくのは大変ですが、
興味のある人は試してみてください。