如何用提升精神建立默认值的语法?

spa*_*ent 5 c++ boost-spirit

我正在分析一些格式类似的科学文本

Keyword
{ 1.0  22.2  59.6 'cm' 'yes' }
Run Code Online (Sandbox Code Playgroud)

我是精神新手,在研究了文档后,我可以用精神来解决fixed-format关键字.

但是对于以下格式,我不知道如何构建语法.我的问题是:在我遇到的科学关键字中,某些数据项可以默认为内置默认值.关键字说明指示何时可以应用默认值.将数量设置为默认值有两种方法.首先,通过斜杠'}'提前结束数据记录,将未指定的数量设置为其默认值.其次,通过输入n*可以默认位于'}'之前的选定数量,其中n是要默认的连续数量的数量.例如,3*会使关键字数据中的后三个数量被赋予其默认值.

例如,

Person
{ 'Tom' 188 80 'male' 32 }
Run Code Online (Sandbox Code Playgroud)

说'男'和'32'是默认值,它的等价物可以是:

Person
{ 'Tom' 188 88 2* }
Run Code Online (Sandbox Code Playgroud)

要么

Person
{ 'Tom' 188 88 'male' 1* }
Run Code Online (Sandbox Code Playgroud)

要么

Person
{ 'Tom' 188 88 }
Run Code Online (Sandbox Code Playgroud)

我搜索过去的帖子,给了我一些想法,但我怎么能写出n*的规则?

vin*_*nes 1

首先我能想到的是:

如果您的结构没有太多成员,您可以将 *n 描述为某种语法,即类似:

struct_full = "{" >> a >> b >> c >> "}";
struct_reduced_1 = "{" >> a >> b >> "1*" >> attr(c_default) >> "}"
struct_reduced_2 = "{" >> a >> "2*" >> attr(b_default) >> attr(c_default) >> "}";
struct_reduced_3 = "{" >> "3*" >> attr(a_default) >> attr(b_default) >> attr(c_default) >> "}";
Run Code Online (Sandbox Code Playgroud)

当然,这不是最美丽的方式..