# YAML syntax error messages (4 parsers, measured)

`yaml-syntax-guide` 記事の「よくある間違い × パーサー実エラーメッセージ対応表」の一次ソース。
手書き YAML で頻出する 7 種の書き間違いを主要 4 パーサーに実際に食わせ、**実際に出る
エラーメッセージ文字列・行/列番号の有無・そもそもエラーになるか** を記録する。

`../yaml-parser-differences/` (正常に parse できる曖昧スカラーの型解決差 →
`yaml-json-difference` 記事用) とは測定軸が別: こちらは **不正 YAML の異常系エラー文字列**
のみを扱う。duplicate keys は型解決差ベンチ側でカバー済みのため本ベンチには含めない。

## 測定対象パーサー

| パーサー | バージョン | 実行系 |
| --- | --- | --- |
| js-yaml (`load`, DEFAULT_SCHEMA) | 4.1.1 | Node v26.3.1 |
| yaml (eemeli, `parse` defaults) | 2.8.3 | Node v26.3.1 |
| PyYAML (`safe_load`) | 6.0.3 | Python 3.14.6 |
| ruamel.yaml (`YAML(typ="safe")`) | 0.19.1 | Python 3.14.6 |

実行環境: Apple M5 Pro / macOS (Darwin 25.5.0)。js-yaml は FormatArc の
yaml-to-json ツールが実際に使っているパーサー。

## ケース (cases.json)

1. `tab-indent` — タブでインデント
2. `bad-indent` — 兄弟キーのインデント不揃い (2 vs 3 スペース)
3. `colon-in-value` — 値の中の `: ` をクォートせず二重マッピング化
4. `unclosed-quote` — ダブルクォート閉じ忘れ
5. `undefined-alias` — 未定義アンカーへのエイリアス参照
6. `unclosed-flow` — flow sequence `[...]` の閉じ忘れ
7. `template-brace` — 値の先頭に `{{ }}` テンプレート構文 (Helm / Ansible のレンダリング前ファイル)

## 再現手順

```bash
cd scripts/benchmarks/yaml-syntax-errors

# Node 側 (js-yaml + eemeli yaml) → results-node.json
npm install
node measure.mjs

# Python 側 (PyYAML + ruamel.yaml) → results-python.json
python3 -m venv venv
./venv/bin/pip install pyyaml ruamel.yaml
./venv/bin/python measure.py

# 結合 → results.json
node merge.mjs
```

## 主要な発見 (results.json より)

- 同じ間違いでも 4 パーサーのエラーメッセージは**全て異なる**文言を返す
  (例: タブインデントは js-yaml `tab characters must not be used in indentation` /
  eemeli `Tabs are not allowed as indentation` / PyYAML・ruamel
  `found character '\t' that cannot start any token`)
- `template-brace` は **js-yaml と eemeli yaml ではエラーにならない**。`{{ }}` が flow
  mapping のネストとして解釈され、`{"image":{"[object Object]":null}}` のような壊れた
  オブジェクトが黙って生成される。PyYAML / ruamel は `unhashable key` でエラー
- 行/列番号はほぼ全パーサーが報告するが、eemeli の `undefined-alias`
  (`Unresolved alias`) のみ位置情報なし
- エラー位置の指し方も異なる: `unclosed-quote` で js-yaml は stream 末尾 (L3) を、
  PyYAML はクォート開始位置 (L1:C7) を指す

記事本文の表は `results.json` の値と完全一致させること (数値・文言の捏造禁止ルール準拠)。
