【发布时间】:2011-03-29 02:13:35
【问题描述】:
我正在尝试在 Boost.Spirit 中编写一个 shell 语言解析器。但是,我不清楚rules 的一些基本语义问题。
查看文档,有rule的成员r.alias()和r.copy()。 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的副本和引用的详细语义,并可能纠正这篇文章中的任何误解?
【问题讨论】:
标签: c++ boost-spirit