← ソースコード説明書

packages/compiler - .ks コンパイラ

概要

TyranoScript 風の .ks スクリプトを Op[] (ランタイム命令配列) にコンパイルする。Tokenizer → Parser → Transformer → Finalizer のパイプラインで処理する。コマンドレジストリにより、新コマンドの追加が容易。

ディレクトリ構成

packages/compiler/
├── src/
│   ├── compiler/
│   │   └── Compiler.ts              # メインパイプライン
│   ├── tokenizer/
│   │   ├── Tokenizer.ts             # トークン化
│   │   └── lineClassifier.ts        # 行タイプ判別 (64行)
│   ├── parser/
│   │   ├── Parser.ts                # AST 生成
│   │   ├── KsParser.ts              # KS フォーマットパーサー
│   │   ├── KsPrinter.ts             # AST プリティプリンタ
│   │   ├── KsScanner.ts             # KS トークナイザ
│   │   ├── parseCommand.ts          # コマンド解析
│   │   ├── parseText.ts             # テキスト解析
│   │   └── parseOptionalArgs.ts     # オプション引数解析
│   ├── transformer/
│   │   └── Transformer.ts           # AST 変換 (変数展開、最適化)
│   ├── finalizer/
│   │   └── Finalizer.ts             # Op[] 生成
│   ├── validator/
│   │   └── Validator.ts             # プリコンパイルチェック
│   ├── registry/
│   │   └── commandRegistry.ts       # コマンドパーサーレジストリ (300+行)
│   ├── types/
│   │   ├── AST.ts                   # AST ノード型
│   │   ├── KsAST.ts                 # KS 固有 AST
│   │   ├── Token.ts                 # トークン型
│   │   ├── CompilerError.ts         # コンパイルエラー型
│   │   └── CompilerOptions.ts       # オプション型
│   ├── cli/
│   │   ├── cli.ts                   # CLI エントリ
│   │   └── commands/
│   │       ├── compile.ts           # compile コマンド
│   │       └── validate.ts          # validate コマンド
│   └── index.ts                     # 公開 API (23行)
├── test/
│   ├── tokenizer.test.ts
│   ├── lineClassifier.test.ts
│   ├── phase2.test.ts
│   ├── phase3.test.ts
│   ├── phase5.test.ts
│   ├── command-sync.test.ts
│   ├── validator.test.ts
│   └── integration.test.ts
├── package.json
├── tsconfig.json
└── vitest.config.ts

コンパイルパイプライン

.ks ソースコード
    ↓
[lineClassifier] → 行タイプ判別 (TEXT, COMMAND, VAR_SET, CHOICE_START, IF_START, ...)
    ↓
[Tokenizer] → Token[]
    ↓
[Parser + commandRegistry] → AST
    ↓
[Transformer] → 最適化済み AST
    ↓
[Validator] → バリデーション
    ↓
[Finalizer] → Op[]

主要ファイル

ファイル行数役割
commandRegistry.ts300+全コマンドのパーサー関数を COMMAND_PARSERS マップに登録
lineClassifier.ts64KNOWN_COMMANDS ホワイトリストで行タイプを判別
Compiler.tsパイプライン統合
Parser.tsAST ノード生成
Finalizer.tsOp[] 出力

コマンドレジストリ

commandRegistry.ts がすべてのコマンドの定義源。

登録済みコマンド

コマンドOp 型説明
@bgBG_SET背景設定
@chCH_SETキャラクター表示
@ch_hideCH_HIDEキャラクター非表示
@ch_clearCH_CLEAR全キャラクター非表示
@overlayOVL_SETオーバーレイ表示
@overlay_hideOVL_HIDEオーバーレイ非表示
@bgmBGM_PLAYBGM 再生
@bgm_stopBGM_STOPBGM 停止
@seSE_PLAYSE 再生
@voiceVOICE_PLAYボイス再生
@waitWAIT待機 (click/timeout/voiceend)
@jumpJUMPジャンプ
@showSHOW表示
@hideHIDE非表示
@moveMOVE移動アニメーション
@fadeFADEフェードアニメーション
@choiceCHOICE選択肢
@setVAR_SET変数設定
@ifIF条件分岐
@screen_filterSCREEN_FILTERスクリーンフィルター
@l / @c / @r(インラインコマンド)テキスト位置制御

新コマンド追加手順

  1. commandRegistry.ts にパーサー関数を追加
  2. lineClassifier.tsKNOWN_COMMANDS にコマンド名を追加
  3. packages/core/src/types/Op.ts に Op 型を追加
  4. packages/web の OpHandler/OpRunner に実装を追加
  5. npm test -w @kaedevn/compiler で同期テスト確認

依存関係

内部パッケージ

  • @kaedevn/core (Op 型)

外部ライブラリ

  • commander (CLI)
  • ulid (ID 生成)

テスト

ファイル内容
tokenizer.test.tsトークン化テスト
lineClassifier.test.ts行タイプ判別テスト
phase2.test.tsパーサーテスト
phase3.test.tsトランスフォーマーテスト
phase5.test.tsファイナライザーテスト
command-sync.test.tsレジストリと lineClassifier の同期確認
validator.test.tsバリデーションテスト
integration.test.tsE2E コンパイルテスト

既知の注意点

  • lineClassifier.tsKNOWN_COMMANDS ホワイトリストがあり、新コマンドはここに追加しないと TEXT として分類される
  • テキストとコマンドが同じ行にある場合(例: テキスト@l)は別々のコマンドに分割される
  • インラインコマンド (@l, @c, @r) はテキスト内に埋め込まれる特殊形式
Ad: stickyBottom (728x90)
kaedevn - ノベルゲームを作れるプラットフォーム