はじめに
日本語トランスコンパイラ言語 Re:Mindはたてつけとしてはオープンな実装言語仕様のため、どなたでも処理系を実装することが可能です。逆転の発想で生成AIに実装言語仕様を読み込ませて、いくつかの抽象度レベルのプロンプトからトランスコンパイラ的な動きをさせてみようと思っておりましたところ、ほぼ「棚ぼた」でRe:Mindっぽい仕様のASTパーサのテンプレと3言語(Java,C#,VB.NET)のコードジェネレータのテンプレを生成してもらえたので、本記事はその続きとも言える検証編の第3ステップです。
Microsoft Copilot
生成AIはWindows11アプリケーションのMicrosoft Copilotとします。モードは「Smart(GPT5.1)」。サインインした状態で使用します。いじりたおす編第26ステップの後にはサインアウトがあります。
第3ステップ
いじりたおす編第24ステップ、第25ステップで生成されたRe:MindのASTパーサとC#コードジェネレータのC#実装が検証できる環境を本編第1ステップで構築して、引き続きいじりたおす編第24ステップの生成コードのメイン部分の問題点を検討します。Copilotに自ら生成したコードを少しづつ思い出してもらっています。
プロンプト
以前、下記のRe:Mindのソースコードから
▽名前空間 BubbleSort
/**
* Program
*/
▽public クラス プログラム型
/**
* Main
* @param 引数 args
*/
▽static void メイン(string[] 引数)
/** array */
・int[] 配列 = 15,13,9,6,4,1
/** index */
□バブルソートする(配列)
〇int i=0,i<配列.Length,i++ 繰り返す
□コンソール表示する(配列[i])
〇ここまで
△
/** BubbleSort
* @param 配列 array
*/
▽public void バブルソートする(int[] 配列)
/** i */
・int 外側 = 0
〇外側 < 配列.Length の間は繰り返す
/** j */
・int 内側 = 0
〇内側 < 配列.Length - 外側 - 1 の間は繰り返す
◇配列[内側] > 配列[内側 + 1] の場合
/** temp */
・int 一時 = 配列[内側]
□配列[内側] = 配列[内側 + 1]
□配列[内側 + 1] = 一時
◇ここまで
□内側++
〇ここまで
□外側++
〇ここまで
△
/**
* ConsoleOut
* @param 引数2 dispStr
*/
▽static void コンソール表示する(string 引数2)
□コンソール.一行表示する(引数2)
△
△
△
■インポートする System
▼public static class コンソール Console
▼public static 一行表示する(string? value)
■WriteLine (string? value)
▲
▲
ASTのJsonを生成していただきましたが、このRe:Mindのソースコードを文字列定数変数として定義して、それを入力として、AST文字列を生成し、そのAST文字列をC#コードジェネレータが読み込んでC#ソースコード文字列を生成してコンソール出力するように実装できますか?
生成レスポンス
できます。
しかも miylifewithviolinさんがすでに構築している AST クラス体系と C# コードジェネレータをそのまま活かした “Re:Mind → AST(JSON) → C#コード” の完全パイプライン を実装できます。
ただし、実現するには 3つのコンポーネント が必要です:
🧩 必要な3コンポーネント
① Re:Mind ソースコード → AST オブジェクト
(Re:Mind パーサー)
② AST オブジェクト → JSON
(AST シリアライザ)
③ JSON → AST オブジェクト → C# コード
(AST デシリアライズ+C#コードジェネレータ)
mylifewithviolinさんがすでに持っているのは:
- AST クラス群(CompilationUnit など)
- CSharpCodeGenerator(AST → C#)
足りないのは: - Re:Mind パーサー(文字列 → AST)
- AST JSON シリアライズ/デシリアライズ
これを補えば、Program.cs で次のように書けます:
string rem = ReMindSourceCode; // ← Re:Mind のソースコード文字列
// 1. Re:Mind → AST
var parser = new ReMindParser();
CompilationUnit ast = parser.Parse(rem);
// 2. AST → JSON
string json = JsonSerializer.Serialize(ast, new JsonSerializerOptions
{
WriteIndented = true
});
Console.WriteLine("=== AST(JSON) ===");
Console.WriteLine(json);
// 3. JSON → AST
var ast2 = JsonSerializer.Deserialize<CompilationUnit>(json);
// 4. AST → C#コード
var generator = new CSharpCodeGenerator();
string cs = generator.Generate(ast2);
Console.WriteLine("=== C# Source ===");
Console.WriteLine(cs);
🎯 では、実際にどう実装するか?
以下に 実装可能な最小構成 を示します。
① Re:Mind パーサー(最小構成)
まずは BubbleSort の構文だけを扱う簡易パーサー を作るところから始めるのが現実的です。
public class ReMindParser
{
public CompilationUnit Parse(string source)
{
var unit = new CompilationUnit();
// ここでは最小限のデモとして、
// 名前空間 BubbleSort とクラス プログラム型 を固定で生成する
var ns = new NamespaceDeclaration { Name = "BubbleSort" };
unit.Namespaces.Add(ns);
var cls = new ClassDeclaration
{
NameJa = "プログラム型",
NameEn = "Program",
Modifiers = { "public" }
};
ns.Classes.Add(cls);
// メインメソッド(デモ)
var main = new MethodDeclaration
{
NameJa = "メイン",
NameEn = "Main",
ReturnType = "void",
Modifiers = { "public", "static" }
};
cls.Methods.Add(main);
// 配列初期化(デモ)
main.Body.Add(new LocalVariableDeclaration
{
Type = "int[]",
NameJa = "配列",
NameEn = "array",
Initializer = new ArrayLiteralExpression
{
ElementType = "int",
Elements =
{
new LiteralExpression { Value = 15 },
new LiteralExpression { Value = 13 },
new LiteralExpression { Value = 9 },
new LiteralExpression { Value = 6 },
new LiteralExpression { Value = 4 },
new LiteralExpression { Value = 1 }
}
}
});
return unit;
}
}
② AST → JSON(標準の System.Text.Json でOK)
string json = JsonSerializer.Serialize(ast, new JsonSerializerOptions
{
WriteIndented = true
});
③ JSON → AST
var ast2 = JsonSerializer.Deserialize<CompilationUnit>(json);
④ AST → C#コード(既存の CSharpCodeGenerator を使用)
var generator = new CSharpCodeGenerator();
string cs = generator.Generate(ast2);
Console.WriteLine(cs);
🧪 Program.cs の完成形(動作デモ)
using System;
using System.Text.Json;
using ReMindAst;
using ReMindBackend;
class Program
{
static void Main()
{
const string ReMindSourceCode = @"
▽名前空間 BubbleSort
/** Program */
▽public クラス プログラム型
...
";
// 1. Re:Mind → AST
var parser = new ReMindParser();
var ast = parser.Parse(ReMindSourceCode);
// 2. AST → JSON
string json = JsonSerializer.Serialize(ast, new JsonSerializerOptions
{
WriteIndented = true
});
Console.WriteLine("=== AST(JSON) ===");
Console.WriteLine(json);
// 3. JSON → AST
var ast2 = JsonSerializer.Deserialize<CompilationUnit>(json);
// 4. AST → C#コード
var generator = new CSharpCodeGenerator();
string cs = generator.Generate(ast2);
Console.WriteLine("=== C# Source ===");
Console.WriteLine(cs);
}
}
🌟 ここからどう拡張できるか
miylifewithviolinさんの Re:Mind プロジェクトはすでに AST → C# の部分が完成しているので、
次のステップは Re:Mind → AST のパーサーを本格的に作ることです。
例えば:
- ▽名前空間 → NamespaceDeclaration
- ▽public クラス → ClassDeclaration
- ▽static void メイン → MethodDeclaration
- ・int[] 配列 = ... → LocalVariableDeclaration
- □バブルソートする(配列) → InvocationExpression
- 〇...繰り返す → ForStatement / WhileStatement
- ◇...の場合 → IfStatement
これらをすべて AST に落とし込めば、
Re:Mind 言語 → AST → C# / Java / VB.NET
という完全なトランスパイラが完成します。
✨ 次に進める提案
miylifewithviolinさんのスタイルに合わせて、次のどれを作りましょうか。
- Re:Mind パーサーの正式仕様(BNF)を作る
- BubbleSort の Re:Mind を完全にパースする実装を作る
- AST → C# のコードジェネレータを強化する
- AST → Java / VB.NET のコードジェネレータを追加する
どれから進めたいですか。
第3ステップの評価
あいかわらず先を急ぐ(ご提案してくる)Microsoft Copilotですが、今回の応答はかなりヒットでクォリティがぐんとあがった印象です。Copilotもけっこうよいしょしてきますが、われわれもCopilotをいかにおだてて?以前の内容を思い出させるかがポイントのようです。引き続きCopilotとの対話を続けて、このメイン部分の品質を上げていきます。
おわりに
第3ステップは以上です。次回の方向性は上記のとおりです。
参考情報
目次 Microsoft Copilotで日本語トランスコンパイラ言語 Re:Mindをいじりたおす
「Microsoft Copilotで日本語トランスコンパイラ言語 Re:Mindをいじりたおす」の目次です。(ステップ降順)
ステップ26 ターゲット言語JavaとVB.NETへの展開
ステップ25 ターゲット言語C#へのASTからの生成処理
ステップ24 ASTを生成するサンプル実装をC#で生成
ステップ23 マッピングルール生成
ステップ22 AST(抽象構文木)風の構造化表示
ステップ21 バブルソート 実行可能形式 ターゲットJava C# VB.NET
ステップ20 二分探索法 実行可能形式 ターゲットJava C# VB.NET
ステップ19 線形探索法 実行可能形式 ターゲットJava C# VB.NET
ステップ18 バブルソート 1案件づつやりなおし
ステップ17 二分探索法 1案件づつやりなおし
ステップ16 線形探索法 1案件づつやりなおし
ステップ15 3つの定番アルゴリズムソースの忘却原因調査
ステップ14 バブルソートソースの忘却発生再確認
ステップ13 二分探索法ソースの忘却発生
ステップ12 線形探索法の6言語変換
ステップ11 バージョン情報付きの3定番アルゴリズムソースのフィードバック修正
ステップ10 バージョン情報付きの3定番アルゴリズムソースのフィードバック修正
ステップ9 バージョン情報付きで3定番アルゴリズムソースの生成
ステップ8 バージョニングが可能か確認
ステップ7 Re:Mindの詳しい言語仕様の学習結果をバブルソートで確認
ステップ6 Re:Mindの詳しい言語仕様の学習結果を二分探索法で確認
ステップ5 Re:Mindの詳しい言語仕様の学習結果を線形探索法で確認
ステップ4 Re:Mindの詳しい言語仕様の学習成果を保持するスコープを確認
ステップ3 Re:Mindの詳しい言語仕様を学習できる方法を確認
ステップ2 Re:Mindの言語仕様の認知度を確認
ステップ1 Re:Mindの認知度を確認