Yaml-cpp解析不起作用冒号后空格丢失

Lud*_*cka 2 c++ parsing yaml yaml-cpp

我在yaml-cpp解析器中遇到了问题.当我尝试加载以下定义时:

DsUniversity:
  university_typ: {type: enum, values:[Fachhochschule, Universitat, Berufsakademie]}
  students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error: yaml-cpp: error at line 2, column 39: end of map flow not found
Run Code Online (Sandbox Code Playgroud)

我试图在http://yaml-online-parser.appspot.com/http://yamllint.com/上验证yaml的有效性,并且两个服务都报告yaml有效.

问题是由"values:"定义后缺少空格引起的.当yaml更新为以下格式时:

DsUniversity:
  university_typ: {type: enum, values: [Fachhochschule, Universitat, Berufsakademie]}
  students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

是否有任何方法如何配置/更新/修复yaml-cpp解析器以继续结肠后缺少空格的yamls?

补充:似乎问题是由空char作为分隔符的要求引起的.当我简化测试片段时

DsUniversity:[Fachhochschule, Universitat, Berufsakademie]
Run Code Online (Sandbox Code Playgroud)

yaml-cpp解析器将其读作标量值"DsUniversity:[Fachhochschule,Universitat,Berufsakademie]".当冒号后添加空char时,yaml-cpp正确加载带序列的元素.

Jes*_*der 5

yaml-cpp在这里是正确的,那些在线验证器是不正确的.从YAML 1.2规范:

7.4.2.流映射

通常,YAML坚持将":"映射值指示符与空格分隔.这种限制的好处是":"字符可以在普通标量中使用,只要它后面没有空格.这允许不带引号的URL和时间戳.它也是混淆的潜在来源,因为"a:1"是一个普通的标量而不是一个关键:值对.

...

为了确保JSON兼容性,如果流映射中的键与JSON类似,则YAML允许在":"旁边指定以下值.这不会引起歧义,因为所有类似JSON的键都被指示符包围.但是,由于这大大降低了可读性,YAML处理器应该在输出中将值与":"分开,即使在这种情况下也是如此.

在您的示例中,您处于流映射(意味着包围的地图{}),但您的密钥不是类似JSON的:您只有一个普通的标量(values不带引号).要像JSON一样,密钥需要是单引号或双引号,或者它可以是嵌套的流序列或映射本身.

在您的简化示例中,

DsUniversity:[Fachhochschule, Universitat, Berufsakademie]
Run Code Online (Sandbox Code Playgroud)

yaml-cpp和在线验证器都将它正确地解析为单个标量 - 为了成为一个地图,如你所愿,你需要一个空格:.

为什么YAML需要这个空间?

在简单的普通标量情况下:

a:b
Run Code Online (Sandbox Code Playgroud)

可能是模棱两可的:它可以被读作标量a:b或地图{a: b}.YAML选择将其作为标量读取,以便可以轻松地将URL嵌入到YAML中而无需引用:

http://stackoverflow.com
Run Code Online (Sandbox Code Playgroud)

是一个标量(就像你期望的那样),而不是地图{http: //stackoverflow.com}!

在流上下文中,有一种情况不明确:引用密钥时,例如:

{"a":b}
Run Code Online (Sandbox Code Playgroud)

这称为JSON,因为它类似于JSON,它需要所有标量周围的引号.在这种情况下,YAML知道密钥在结束引用处结束,因此可以确保该值立即开始.

明确允许此行为,因为JSON本身允许这样的事情

{"a":"b"}
Run Code Online (Sandbox Code Playgroud)

由于YAML 1.2是JSON的严格超集,因此在YAML中必须是合法的.