はじめに
生成AIに日本語トランスコンパイラ言語 Re:Mindの実装言語仕様を読み込ませて、いくつかの抽象度レベルのプロンプトからトランスコンパイラ的な動きをさせてみたところ、Re:Mindっぽい仕様のASTパーサのテンプレと3言語(Java,C#,VB.NET)のコードジェネレータのテンプレを生成してもらえた1ので、ASTパーサが動作するまでの検証2を経て本記事はC#コードジェネレータが動作するまでの改修の第3ステップです。
Microsoft Copilot
生成AIはWindows11アプリケーションのMicrosoft Copilotとします。モードは「Smart(GPT5.1)」。サインインした状態で使用します。
第3ステップ
「Re:MindのASTパーサが動作するまで」の12ステップでいったんC#のソースコードが生成されるようにはなりましたので、以降はC#コードジェネレータが正常動作することを目指しています。
プロンプト
今回追加したGenerateInvocationのコンパイルエラーはなくなりましたが、このメソッドの参照元がまだ0のようです。GenerateInvocationはどこから呼び出されますか?
生成レスポンス
ここがポイントです。
GenerateInvocation は “まだ一度も呼ばれていません”。
理由はとてもシンプルで、CSharpCodeGenerator の中で GenerateInvocation を呼ぶコードが存在しないからです。
🎯 なぜ呼ばれないのか?
あなたの CSharpCodeGenerator の GenerateExpression はこうなっています:
InvocationExpression inv =>
$"{GenerateExpression(inv.Target)}({string.Join(", ", inv.Arguments.Select(GenerateExpression))})",
つまり:
- InvocationExpression を見つけても、GenerateInvocation を使っていない
- そのため、Imports の AliasClass を参照する処理が一切走らない
- 結果として GenerateInvocation の参照元は 0 のまま
🎯 ではどうすれば呼ばれるのか?
GenerateExpression の InvocationExpression の分岐を差し替える必要があります。
つまり:
InvocationExpression inv => GenerateInvocation(inv, _aliasMap),
のように、GenerateInvocation を呼ぶようにします。
✨ 完全な修正手順
① CSharpCodeGenerator に aliasMap を保持するフィールドを追加
private Dictionary<string, AliasClass> _aliasMap;
② Generate(CompilationUnit cu) の最初で aliasMap を構築
public string Generate(CompilationUnit cu)
{
_aliasMap = BuildAliasMap(cu);
...
}
③ GenerateExpression の InvocationExpression 分岐を差し替える
元のコード:
InvocationExpression inv =>
$"{GenerateExpression(inv.Target)}({string.Join(", ", inv.Arguments.Select(GenerateExpression))})",
これを GenerateInvocation を呼ぶ形に変更:
InvocationExpression inv => GenerateInvocation(inv, _aliasMap),
🎉 これで何が起きるか?
Re:Mind:
□コンソール.一行表示する(引数2)
AST:
InvocationExpression
Target = MemberAccessExpression("コンソール", "一行表示する")
Arguments = [ IdentifierExpression("引数2") ]
Imports:
コンソール → Console
一行表示する → WriteLine
C# 出力:
Console.WriteLine(dispStr);
ついに consoleOut の中身が生成されるようになります。
ここまで来ると Re:Mind → AST → C# のフルパイプラインが完成 します。
次は Java / VB.NET 版のコードジェネレータも同じ仕組みで作れますね。
必要なら、Java 版の GenerateInvocation も一緒に作りましょう。
第3ステップの評価
書き換えたGenerateExpressionは呼ばれるようになっていきますが、まだstatic void consoleOutの定義が出力されないようでした。
おわりに
第3ステップは以上です。次回の方向性は上記の結果の提示からとなります。
生成レスポンスセクションの内容は生成AIが生成したものです。引用されているソースコードは完全には動作しない状態が含まれます。
-
Microsoft Copilotで日本語トランスコンパイラ言語 Re:Mindをいじりたおす - Qiita
「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の認知度を確認 ↩ -
Copilotが生成した日本語トランスコンパイラ言語 Re:MindのASTパーサが動作するまで - Qiita
「Re:MindのASTパーサが動作するまで」の記事リストです。(ステップ降順)
ステップ12 いったん生成
ステップ11
ステップ10 生成済コードの伝達完了
ステップ9
ステップ8
ステップ7
ステップ6 生成済コードの伝達開始
ステップ5
ステップ4 Program.csが動作
ステップ3
ステップ2
ステップ1 検証環境構築 ↩