# 記法リファレンス（DSL Syntax Reference）

日本語フローチャート記述ツール（JFCD）のDSL仕様です。

---

## 基本構造

```
# コメント行（#で始まる行は無視されます）

フロー: タイトル

[ノードID] 形状: ラベル

接続元ID --> 接続先ID
接続元ID --> 接続先ID : ラベル
```

---

## タイトル行

```
フロー: 受注処理システム
```

- `フロー:` または `フロー：` の後にタイトルを記述します。

---

## ノード定義

```
[id] 形状: ラベルテキスト
```

| 形状キーワード | 図形 | 説明 |
|---|---|---|
| `端子` | 角丸長方形 | 開始・終了（JIS X 0121 終端記号） |
| `処理` | 長方形 | 一般的な処理ステップ（省略可・デフォルト） |
| `判断` | ひし形 | 条件分岐 |
| `入出力` | 平行四辺形 | データの入力・出力 |
| `結合子` | 円 | フローの結合・参照点 |
| `ページ外結合子` / `オフページコネクタ` | 家型五角形 | ページ外への接続 |
| `定義済み処理` | 両端縦線付き長方形 | サブルーチン・定義済みフロー |
| `手操作入力` / `手動入力` | 上辺斜め台形 | キーボード等による手動入力 |
| `手動操作` | 逆台形（上辺長・下辺短） | 腕力・ハンドル等の手作業 |
| `並行処理` | 2本の平行横線 | 並列処理の開始・終了 |
| `書類` | 波形下端長方形 | 帳票・ドキュメント |
| `注釈` | 左ブラケット「[」または右ブラケット「]」スタイル | 既定は右側配置（左ブラケット「[」スタイル）。主列（最も多くのノードが並ぶ縦列）の左右両側にソースがある横並び時は、ソース位置に応じて左右へ自動分配。`@left` 指定時は左側配置（右ブラケット「]」スタイル） |
| `初期設定` / `初期条件` | 両端三角形の六角形 | 初期設定・初期条件（JIS準備記号） |

### 例

```
[s]    端子: 開始
[p1]   処理: データ集計
[d1]   判断: 正常完了？
[io1]  入出力: 結果出力
[c1]   結合子: A
[opc1] ページ外結合子: A
[pre1] 定義済み処理: 月次集計処理
[mi1]  手操作入力: 手動入力
[mo1]  手動操作: レバー操作
[pm1]  並行処理: 並列実行
[doc1] 書類: 日次レポート
[ann1] 注釈: 要確認
[e]    端子: 終了
```

形状キーワードを省略すると `処理`（長方形）になります：

```
[p1] データ集計
```

---

## 注釈（アノテーション）

注釈ノードは既定で **右側**（左ブラケット「[」スタイル）に配置されます。  
ただし、注釈の接続元ノードが同一段で横並びに広がっている場合は、その段の並び順を基準に **左右へ自動分配** されます（左側ノードの注釈は左、右側ノードの注釈は右）。  
同一段で判定できない場合は、メインフローの主列（最も多くのノードが並ぶ縦列）を基準に、主列より左のソースに付く注釈は左、その他は右に配置されます。  
接続ラベル末尾の `@left` / `@right` で配置側を明示指定することもできます。左側は右ブラケット「]」スタイルです。いずれの場合も破線で接続されます。

```
[ann1] 注釈: ここに注釈テキスト
node_id --> ann1
```

- ラベル内に `\n` と記述すると **強制改行** になります（複数行注釈）。

### 例

```
[init]  処理: 初期設定
[ann1]  注釈: 引数\nGR0：被乗数 → 計算結果\nGR1：乗数（ループカウンタ）
[push]  定義済み処理: PUSH
[ann2]  注釈: (GR1)と(GR2)を\nスタックに退避

init --> ann1
push --> ann2
```

---

## 接続定義（エッジ）

```
接続元ID --> 接続先ID
接続元ID --> 接続先ID : ラベル
```

- ラベルは `:` または `：` の後に記述します。
- `判断` ノードからのエッジの向きは、接続先の縦位置で自動決定されます。
  - 接続先の y 座標が最も小さい（直下レイヤー）エッジ → **下方向**（ループ継続ブランチなど）
  - それ以外のエッジ → **横方向**（ループ出口・条件分岐の別ブランチ）
  - 全エッジの接続先 y が同一の場合は、`はい` / `yes` ラベルのエッジが下方向になります。
- ループ構造では、ループ本体（No ブランチ）が縦一列に並び、出口（Yes ブランチ）は右側を迂回して出口ノードに接続します。
- 接続先ノードが上位にある場合（ループバック）は左側を迂回するルートで描画されます。

### 出口方向の明示指定

ラベルの末尾に `@down`・`@right`・`@left` を付けると、自動判定を上書きして **出口方向を強制指定** できます。

| ヒント | 効果 |
|--------|------|
| `@down` | 判断ノードの **下頂点** から出力（通常フロー向き） |
| `@right` | 判断ノードの **右頂点** から出力（例外処理・別ルート向き） |
| `@left` | 判断ノードの **左頂点** から出力（注釈エッジでは注釈を左側配置） |

`@right`/`@left`/`@down` はラベルの表示には含まれません（描画前に取り除かれます）。大文字・小文字は区別されません。

```
# 例外処理を横から出す例
[check] 判断: 入力OK？
[error] 処理: エラー処理
[next]  処理: 次のステップ

check --> error : いいえ @right
check --> next  : はい @down
```

### 例

```
s  --> p1
p1 --> d1
d1 --> io1 : はい
d1 --> p1  : いいえ
io1 --> e
```

---

## 完全なサンプル

```
# 受注処理システム
フロー: 受注処理システム

[start]    端子: 開始
[recv]     処理: 注文受付
[validate] 判断: 入力チェックOK？
[error]    処理: エラー通知
[stock]    判断: 在庫あり？
[no_stock] 処理: 在庫切れ通知
[prepare]  処理: 発送準備
[ship]     処理: 商品発送
[end]      端子: 終了

start    --> recv
recv     --> validate
validate --> stock    : はい
validate --> error    : いいえ
error    --> recv
stock    --> prepare  : はい
stock    --> no_stock : いいえ
prepare  --> ship
ship     --> end
no_stock --> end
```

---

## ノードIDの命名規則

- 英数字、アンダースコア（`_`）、ハイフン（`-`）を使用できます。
- 日本語をIDに使うことも可能ですが、半角英数字のIDを推奨します。
- IDは各ノード間で一意である必要があります。

---

## エラーメッセージ

| メッセージ | 原因 |
|---|---|
| `不正なノード定義` | `[id]` の形式が正しくない |
| `ノードIDが空です` | `[]` の中が空 |
| `ノードID「...」が重複` | 同じIDを2回以上定義している |
| `未定義のノード「...」` | 接続に使われているIDが定義されていない |
| `解析できない行` | どのパターンにも一致しない行がある |

---

## 将来の拡張予定

- スタイルカスタマイズ（色、線種）
- グループ化（スイムレーン）
- Mermaid / draw.io 形式へのエクスポート
- GUIエディタ（ドラッグ＆ドロップ）
