Учитывая семантический актер
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 несколькими способами.Чтобы быть полностью законченным: у меня есть рабочий код (числовой материал здесь и фактическая вещь, которую я создаю / анализ здесь ), но он кажется излишне сложным (из-за вышеизложенного он кажетсяМне нужно правило для преобразования типа / значения, которое кажется глупым.