Я пытаюсь написать синтаксический анализатор оболочки в Boost.Spirit. Тем не менее, я не понимаю некоторые основные вопросы, касающиеся семантики rule
s.
Посмотрите на документацию, есть члены r.alias()
и r.copy()
of rule
. IIUC, эти члены должны возвращать ссылку на правило и копию содержимого правила соответственно. Однако четко не указано, что происходит, когда я просто использую правило в определении другого правила. Из моих экспериментов я нашел взаимно рекурсивные правила, которые можно определить:
rule<Iter> r1, r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
который предполагает, что правила берутся по ссылке внутри выражений парсера. Проблема в том, что он делает, когда переменная выходит за пределы области видимости, например:
rule<Iter> r1;
{
rule<Iter> r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
}
... // use r1
В том же примечании будет назначаться правило из выражения синтаксического анализа, содержащего rvalue работы правила типа (r.copy()
тоже будет rvalue типа rule
), не так ли? например.
rule<Iter> f() { return char_('a') << char_('b'); }
rule<Iter> r1 = ... << f();
Может ли кто-нибудь просветить меня по подробной семантике копий и ссылок rule
и, возможно, исправить любые заблуждения в этом сообщении?