# YAML parser behaviour differences (YAML 1.1 vs 1.2 ambiguous scalars)

`yaml-json-difference` 記事の「N-parser 実測差分表」の一次ソース。曖昧な YAML スカラー
(Norway problem / on・yes / 8進数 / 60進数 / 素の日付 / 重複キー / merge key 等) を
主要 4 パーサーがどう解決するかを実測する。

## 測定対象パーサー

| パーサー | バージョン | 実行系 | 既定の解決規則 |
| --- | --- | --- | --- |
| js-yaml (`load`, DEFAULT_SCHEMA) | 4.1.1 | Node v26.3.1 | ほぼ YAML 1.2 + timestamp 独自対応 |
| yaml (eemeli, `parse` defaults) | 2.8.3 | Node v26.3.1 | YAML 1.2 core schema |
| PyYAML (`safe_load`) | 6.0.3 | Python 3.14.6 | YAML 1.1 |
| ruamel.yaml (`YAML(typ="safe")`) | 0.19.1 | Python 3.14.6 | YAML 1.2 |

実行環境: Apple M5 Pro / macOS (Darwin 25.5.0)。

## 再現手順

```bash
cd scripts/benchmarks/yaml-parser-differences

# 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` は両者を統合した確定値 (テストケース定義は `cases.json`)。
記事本文の表の数値・型はすべて `results.json` と一致させること。

## 実測結果の要点 (2026-07-10 測定)

- `value: NO` を boolean `false` に解決するのは **PyYAML だけ**。js-yaml / eemeli yaml /
  ruamel.yaml は文字列 `"NO"` を返す (Norway problem は「YAML の問題」ではなく
  「YAML 1.1 系パーサーの問題」)
- `on` / `yes` も同様に PyYAML のみ boolean
- YAML 1.1 の単文字 `y` は 4 パーサーとも文字列 (仕様にあるが実装は追随していない)
- `010` は PyYAML が 8 進数として `8`、他 3 者は 10 進数 `10`
- `0o10` (YAML 1.2 の 8 進表記) は PyYAML だけ文字列 `"0o10"`、他 3 者は `8`
- `1:30` (60 進数) は PyYAML だけ `90`
- 素の日付 `2026-07-10` は eemeli yaml だけ文字列。js-yaml は JS の `Date`、
  PyYAML / ruamel.yaml は `datetime.date` に変換する (JSON 変換時の型崩れ要因)
- 重複キーは PyYAML だけ last-wins (`{"a": 2}`)、他 3 者はエラー
- merge key `<<` は eemeli yaml だけ既定で解決しない (`"<<"` という名前のキーとして残る。
  `parse(src, { merge: true })` の明示が必要)。他 3 者は既定でマージする
- `.inf` / `~` は 4 パーサーとも一致 (Infinity / null)
