JSON 記述用 YAML 1.2 サブセットのローダ (まとめ)

JSON 用に特化した YAML 1.2 のサブセットを定義してローダを C++11 で記述しました。⇒ https://github.com/tociyuki/libtoml-cxx11 の yaml.hpp と yaml-decoder.cpp各エントリはふるまい記述とコードの組になっています。ふるまいはエントリのままで使って…

JSON 記述用 YAML 1.2 サブセットのローダ (その11)

ローダのエントリ・ポイント wjson::load_yaml 関数は、3 つの引数をとります。入力文字列、出力の JSON ノード、最後は省略可能で入力文字列の pos 番目からロードを開始します。ロード開始位置のデフォルトはゼロで入力文字列の先頭からとりかかります。こ…

JSON 記述用 YAML 1.2 サブセットのローダ (その10)

当初はベア・ドキュメント一つだけを扱い、ドキュメント・エンド・マーカー、ディレクティブ・エンド・マーカーも無視しようとしていたのですが、インデントがゼロの平文スタイル、リテラル・スタイル、フォールデッド・スタイルの末尾にこれらのマークを使…

JSON 記述用 YAML 1.2 サブセットのローダ (その9)

ブロック・コレクションは、平文スタイルと並んで YAML をとっつきやすくしている立役者です。ブロック・コレクションにもシーケンスとマッピングの両方があります。ブロック・シーケンスの要素にブロック・ノードが利用できます。マッピングの値も同様です…

JSON 記述用 YAML 1.2 サブセットのローダ (その8)

YAML のフロー・コレクションは、JSON の配列とオブジェクトの構文をそれぞれ緩めたシーケンスとマッピングの 2 種類に分かれています。これら 2 つに、3つのスカラーであるシングル・クォーテッド・スタイル、ダブル・クォーテッド・スタイル、平文スタイル…

JSON 記述用 YAML 1.2 サブセットのローダ (その7)

YAML の 5 種類のスタイルのスカラーが揃ったので、コレクションにとりかかる前にセパレータを記述します。セパレータは大きく分けて、空白の s-separate と、改行の s-l-comments の 2 つがあります。前者は文脈によっては後者を含みます。両者とも、単なる…

JSON 記述用 YAML 1.2 サブセットのローダ (その6)

フォールデッド・スタイルは、リテラル・スタイルに行の畳み込みを追加したものです。 enum {T_SINGLE_QUOTED, T_DOUBLE_QUOTED, T_LITERAL, T_FOLDED}; //@<T_FOLDED フィルタ@>= case T_FOLDED: res = wjson::c_l_folded (s, spec[i].n, node); ts.ok (res && node.dump () == </t_folded>…

JSON 記述用 YAML 1.2 サブセットのローダ (その5)

ダブル・クォーテッド・スタイルは、シングル・クォーテッドを元にバックスラッシュ記法を充実させたものです。フィルタでは、ヌル文字の存在もチェックするため、他のスカラーとは異なり、dump () を使います。 enum {T_SINGLE_QUOTED, T_DOUBLE_QUOTED, T_…

JSON 記述用 YAML 1.2 サブセットのローダ (その4)

平文スタイルのおかげで YAML を手打ちする手間が減ります。平文スタイルはシングル・クォーテッドの両側のシングル・クォートを省いたようなものですが、区切りのインジケータがないので、どこまでが平文スタイルなのかを、先読みを使って判断する必要があ…

JSON 記述用 YAML 1.2 サブセットのローダ (その1)

JSON 用のデータを手軽に記述するには YAML を使えば良さそうだと考えて、 JSON 記述に不要な機能を削った YAML 1.2 サブセットのローダを作ります。 用途に、 設定ファイルの記述、コンテンツのメタ・フロントライナなどを考えています。 JSON のデータ構造…

JSON 記述用 YAML 1.2 サブセットのローダ (その3)

続いてシンプルなのはブロックのリテラルです。 YAML 1.2 仕様ページの Example を元にふるまい記述を作っていきます。 その前に、ふるまい記述に使えるフィルタを追加します。 enum {T_SIGLE_QUOTED, T_LITERAL}; //@<T_LITERAL フィルタ@>= case T_LITERAL: res = wjson::c_l_li</t_literal>…

JSON 記述用 YAML 1.2 サブセットのローダ (その2)

derivs_t クラスを使ってスカラーを書いていきます。最もシンプルなのは、シングル・クォート・スタイルです。このタイプはインデントを考慮しつつ、シングル・クォートで囲まれた範囲を探します。シングル・クォートをスカラー中に含めるには、シングル・ク…

YAML 1.2 メモ

リファレンス The Official YAML Web Site YAML Version 1.2 YAML 1.2 BNF from Specification Web Page HackageDB: YamlReference-0.9.3 PyYAML LibYAML – PyYAML PythonTagScheme – PyYAML PerlTagScheme – PyYAML YAML 1.2 メモのインデックス YAMLドキュ…

YAML 1.2 メモ (11) タグ

タグはスカラー、シーケンス、マッピングのそれぞれのノードにデータ型を指定します。一つのノードにタグ・プロパティを一つ指定でき、ノードに指定できるデータ型は一つだけに限定されています。タグにはグローバル・タグとローカル・タグの2種類があり、前…

YAML 1.2 メモ (10) エイリアス

ノードに標識をつけるのがアンカー・プロパティで、標識のついたノードを再利用するのがエイリアスです。標識はアンカー名と呼ばれます。アンカー名に利用できる文字の制限は緩く、名前に使えない文字はスペース、タブ、改行、フロー・インジケータだけです…

YAML 1.2 メモ (9) フロー・マッピング

フロー・マッピングのペアを区切っているのコンマは、フロー・シーケンスの区切りと同じルールに従い、ペア間にコンマを一つ、最後のペアの後に省略可能なコンマを一つおけます。インデント・レベルの扱いもフロー・シーケンスと同じです。ペアに明示キーと…

YAML 1.2 メモ (8) フロー・シーケンス

YAML のフロー・シーケンスは JSON の配列オブジェクトの上位互換になっています。角括弧で両端を囲み、フロー・ノードを入れ子にできます。フロー・シーケンスの中にブロック・ノードを書くとエラーになります。エントリ間にはカンマを1個置いて区切ります…

YAML 1.2 メモ (7) ブロック・マッピング

マッピングはキーと値のペアを並べたものです。YAML 以外で用いられているキーと値の間にインジケータを挟む形式のものを暗黙キー・エントリと呼びます。YAML ではこれに加えてキー・インジケータと値インジケータのそれぞれで始まる行を交互に並べる形式の…

YAML 1.2 メモ (6) ブロック・シーケンス

ブロック・シーケンスの始まりを示すインジケータはハイフンです。ベア・ドキュメントでは先頭行にいきなりインジケータを置くことができます。それ以外の場合、インジケータの前で改行し、行頭とインジケータの間にインデント・スペースだけを置くことがで…

YAML 1.2 メモ (5) プレイン

YAML では、ノードの種類を先頭の文字で判別します。この種類判別のための文字はインジケータと名づけられていて、予約されています。 '-' : 直後にスペース・タブ・改行があるときに限りブロック・シーケンス。ないときはプレインの開始。 '?' : 直後にスペ…

YAML 1.2 メモ (4) 行の折りたたみ

リテラル以外の4種類のスカラーである、フォールデッド、プレイン、ダブル・クォーテッド、そしてシングル・クォーテッドはすべて複数行に渡る記述ができるようになっています。そのとき、Wiki 記法の段落に似た行の折りたたみがおこなわれます。さらに、フ…

YAML 1.2 メモ (3) リテラル

YAML に文字列の書き方が 5 種類もあるのは、人間が手打ちするときに便利なように配慮してあるのでしょう。配慮はありがたいのかもしれませんけど、YAML の文字列には、リテラルを除いて必ず Wiki 記法の段落記法に似た行折りたたみ機能が働くため、頭にいれ…

YAML 1.2 メモ (2) ドキュメントのインデント・レベル

ちょっとした問題を考えてみます。github がブログアップロードに対応している Jekyll コンテンツ・マネジャでは、YAML フロントライナと呼ばれる方法で、Markdown などで記述したページコンテンツのページ名やカテゴリ、パーマリンクを指定することができま…

YAML 1.2 メモ (1) YAML ドキュメント

YAML 1.2 の仕様 http://www.yaml.org/spec/1.2/spec.html が 2009 年夏に公開されてから 3 年が経過しています。3年もたっているというのに、いまだに構文だけでもフルセットで扱える YAML プロセサは少ないので、手打ちで書くためのメモに意味がはたしてあ…

YAML 1.2 の BNF

YAML 1.2 仕様 http://www.yaml.org/spec/1.2/spec.html から BNF 部分を拾いだしたものを Gist に貼っておきます。⇒ YAML 1.2 BNF from Specification Web Page ― Gist仕様のウェブページをローカルに curl(1) コマンドでゲットしておいたものから、Web::Sc…

UTF-8 エンコーディングの差異まとめ YAML::XS、YAML::Syck、YAML::Old、YAML、YAML::Tiny

Perl の YAML::Any が対象にしている題に並べた 5 つの YAML モジュールの UTF-8 エンコーディング の扱いに、登場した当初から現在にいたるまで差異があり、単純に切り替えて使えないのが現状です。差があるのは仕方がないことで、それぞれの個性と割り切っ…