【发布时间】:2021-04-06 05:58:41
【问题描述】:
只是一个示例来澄清问题..(这是伪代码)
经典方式:为每条路径制定规则。所以从“开始”开始,选择outer_rule1 或outer_rule2,然后从那里进入inner_rule1 和inner_rule2。您可以清楚地看到内部规则几乎相等。例如。关于语法的事情,其中特殊分隔的行是由符号“:”给出的,曾经由“;”给出
inner_rule1 = a >> b >> ":"
inner_rule2 = a >> b >> ";"
outer_rule1 = "X" >> inner_rule1
outer_rule2 = "Z" >> inner_rule2
start=outer_rule1 | outer_rule2
您可以通过将分隔符放在顶层来解决这个问题
inner_rule1 = a >> b
inner_rule2 = a >> b
outer_rule1 = "X" >> inner_rule1 >> ":"
outer_rule2 = "Z" >> inner_rule2 >> ";"
start=outer_rule1 | outer_rule2
但是如果内部规则更复杂,分隔符也可以在嵌套规则中使用,现在使用相同的规则但交换分隔符变得很棘手......
complex_inner1= w >> ";"
complex_inner2= r >> ":"
inner_rule1 = a >> +complex_inner1
inner_rule2 = a >> +complex_inner2
outer_rule1 = "X" >> inner_rule1
outer_rule2 = "Z" >> inner_rule2
start=outer_rule1 | outer_rule2
问题是如何制作这样的东西,在这种情况下,例如使用自定义操作,但我们知道自定义操作不是最佳选择,尤其是在使用回溯时。
complex_inner1= w >> separator
complex_inner2= r >> separator
inner_rule1 = a[separator=";"] >> +complex_inner1
inner_rule2 = a[separator=":"] >> +complex_inner2
outer_rule1 = "X" >> inner_rule1
outer_rule2 = "Z" >> inner_rule2
start=outer_rule1 | outer_rule2
【问题讨论】:
标签: c++ boost-spirit