我正在尝试在 Boost.Spirit 中编写一个 shell 语言解析器。但是,我不清楚有关rule
s 语义的一些基本问题。
查看文档,有成员r.alias()
和r.copy()
. rule
IIUC,这些成员应分别返回对规则的引用和规则内容的副本。但是,当我只是在另一个规则的定义中使用该规则时,并没有明确说明会发生什么。从我的实验中,我发现相互递归的规则可以定义为:
rule<Iter> r1, r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
这表明规则是在解析器表达式中通过引用来获取的。问题是,当变量超出范围时它会做什么,例如:
rule<Iter> r1;
{
rule<Iter> r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
}
... // use r1
同样,从包含规则类型右值的解析表达式中分配规则是否有效(r.copy()
也将是类型的右值rule
,不是吗)?例如。
rule<Iter> f() { return char_('a') << char_('b'); }
rule<Iter> r1 = ... << f();
任何人都可以告诉我rule
's 副本和引用的详细语义,并可能纠正这篇文章中的任何误解吗?