2

yamlドキュメントを操作しているときに、値の1つがsnakeyamlを使用して文字列として解析されていることがわかりました。

-8e-05

yaml-cppを使用してyamlsを書き込むrosは、次のコードを使用して配列を記述していることがわかりました

out << YAML::BeginSeq;
for (int i = 0; i < m.rows*m.cols; ++i)
  out << m.data[i];
out << YAML::EndSeq;

ただし、上記のc ++コード(camera_calibrationパッケージのros "parse_yml.cpp"からコピー)は-8e-05を作成し、snakeyamlはそれを文字列として解析します。

では、誰が正しいのでしょうか。バグレポートがあるべきでしょうか。もしそうなら誰に?1.2 yaml仕様ではオプションの小数が許可されているようですが、1.1yaml仕様でどのsnakeyamlが実装できるかがわかりませんでした。

4

2 に答える 2

4

出力は!!floatYAML1.2に従って解析する必要がありますが、元々は!!strYAML1.1でした。@psrが言うように、これはJSON仕様と一致するためです。

YAML 1.2仕様では、JSONスキーマと拡張機能である「コアスキーマ」が提供されます。どちらの場合も、!!float正規表現は次のとおりです。

[-+]? ( \. [0-9]+ | [0-9]+ ( \. [0-9]* )? ) ( [eE] [-+]? [0-9]+ )?

これにより、オプションの小数が可能になります。(コアスキーマは、無限大と非数のサポートを追加します。)

YAML 1.1仕様では、このタイプのタグ解決を直接指定していませんが、タイプごとにいくつかの関連ページが提供されていました。この!!floatページには、正規表現が一覧表示されています。

[-+]?([0-9][0-9_]*)?\.[0-9.]*([eE][-+][0-9]+)?

(および基数60、無限大、および非数のバージョン)。これには小数が必要なようです。

これは、バージョン1.9以降、SnakeYAML(http://code.google.com/p/snakeyaml/issues/detail?id=130を参照)で修正されています。

于 2011-07-21T01:22:05.187 に答える
0

YAMLはJSONのスーパーセットであり、http: //www.json.org/を見ると、ページの下部にBNFに相当する図があり、数値の解析方法の定義が示されています。-8e-05はその定義に適合しているため、snakeyamiは文字列として正しく解析していません。

于 2011-07-20T22:32:17.300 に答える