Данный семантический актор
template<typename ValueType>
class divide
{
public:
divide(ValueType value) : divisor{value} {}
template<typename ContextType>
void operator()(ContextType& context) const
{
_val(context) /= divisor;
}
private:
const ValueType divisor;
};
похоже, я улавливаю тот факт, что наличие семантических действий препятствует синтезу атрибутов (или распространению?), т.е.
const auto norm = x3::rule<struct _, double>{"norm"}
= x3::double_[normalize{100.}];
дает мне значение 0.
Поэтому я попытался заставить распространение атрибута с помощью %=
const auto norm_rule = x3::rule<struct _, double>{"norm"}
%= x3::double_[normalize{100.}];
Это дает мне ожидаемое проанализированное значение, деленное на 100.
Затем я обнаружил, что у x3::rule
есть третий аргумент шаблона, bool force_attribute
, и заметил, что
const auto norm_rule = x3::rule<struct _, double, true>{"norm"}
= x3::double_[divide{100.}];
Имеет желаемый результат в виде значения, деленного на 100.
Поэкспериментировав дальше, я обнаружил, что вместо этого могу определить divide::operator()
следующим образом:
void operator()(ContextType& context)
{
_attr(context) = _val(context) / divisor;
}
Последний, кажется, сильно связывает / осуждает семантический актор на верхний уровень правила, поскольку он действует на атрибут _attr
первого правила вместо значения _val
синтаксического анализатора, к которому он прикреплен.
Правильно ли я сделаю вывод, что
%=
это то же самое, что задать для третьегоx3::rule
параметра шаблонаforce_attribute
значение true?- Этот тип семантических действий обработки значений должен работать исключительно с
_val
, чтобы они работали с присоединенным синтаксическим анализатором вместо первогоrule
, встречающегося в иерархии?
Я понимаю, что эти вопросы могут показаться несвязанными, но они действительно связаны, поскольку я пытаюсь обработать проанализированное число (float) и преобразовать его в uint8 несколькими способами. Чтобы быть полностью полным: у меня есть рабочий код (числовой код здесь и то, что я создаю / разбираю здесь), но это кажется излишне сложным (из-за вышеизложенного мне кажется, что мне нужно правило для преобразования типа / значения, что кажется глупым.
_attr
и_val
. Первый должен быть результатом присоединенного парсера, а второй - атрибутом правила. По крайней мере, я могу понять собственное замешательство. Я оставлю вопрос как есть, пока я не разберусь с этим, я боюсь, что его изменение сделает его хуже, чем сейчас. - person rubenvb   schedule 29.12.2018