2011-07-20 151 views
2

雖然有YAML文檔時,我發現我的價值之一是越來越解析爲與snakeyaml的字符串:YAML科學記數法語法

-8e-05

我發現ROS,它使用YAML -cpp寫yamls使用以下代碼來寫一個數組

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.1 yaml規範是否允許snakeyaml實現。

回答

4

根據YAML 1.2應該將輸出解析爲!!float,但YAML 1.1中原本是!!str;正如@psr所說,這是爲了匹配JSON規範。

YAML 1.2規範給出JSON schema和一個擴展"core schema"。在兩種情況下,!!float正則表達式是:

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

其允許可選的小數。 (核心模式增加了對無窮大和非數字的支持。)

YAML 1.1規範沒有直接指定這種類型的標籤分辨率,但它爲每種類型提供了幾個相關的頁面。所述!!float page列出了正則表達式:

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

(以及版本基-60,無窮大,而不是一個數)。 這似乎要求小數。

從1.9版本開始,它已在SnakeYAML中修復(請參閱http://code.google.com/p/snakeyaml/issues/detail?id=130)。

+0

謝謝Jesse,這正是我一直在尋找的。通過修改snakeyaml的輸出,我能夠很輕鬆地解決這個問題,因爲我對數據類型有了更多的瞭解,但是我認爲如果可以的話,我會盡力幫忙。感謝您的回覆。 – Sandy

+0

該問題已在SnakeYAML中修復:http://code.google.com/p/snakeyaml/issues/detail?id=130 – Andrey

+0

@Andrey,謝謝! - 我更新了答案 –

0

YAML是JSON的超集,如果你看看http://www.json.org/它在頁面底部有一個BNF等價圖,它顯示瞭如何解析數字的定義。 -8e-05符合該定義,因此snakeyami將它解析爲字符串是不正確的。