Мне нужно проверить текст на двойные символы. Например, «1 + 1 * 2» должно быть в порядке, но «1 ** 2 + 3» или «—1 + 4 * 3» не должны. Рассмотрим часть примера Spirit Calc.
expression =
term[_val=_1]
>> *( ('+' >> term[_val+=_1])
| ('-' >> term[_val-=_1])
);
term =
factor[_val=_1]
>> *( ('*' >> factor[_val*=_1])
| ('/' >> factor[_val/=_1])
);
factor =
double_[_val=_1]
| '(' >> expression[_val=_1] >> ')'
| ('-' >> factor[_val=_1])
| ('+' >> factor[_val=_1]);
Фраза_parse возвращает истину с такими выражениями, как «1 +++ 1» или «1 ** — 1». Я пытался использовать повтор, как это:
term =
factor[_val=_1]
>> *( (repeat(0)[char_('*')] >> factor[_val*=_1])
| ('/' >> factor[_val/=_1])
);
Но это не помогает. Что я скучаю?
Благодарю.
РЕДАКТИРОВАТЬ: нашел ответ. Следует сравнивать строковые итераторы после фразу_parse, но не выводим фразу_parse.
Нашел ответ. Следует сравнивать строковые итераторы после фразу_parse, но не выводим фразу_parse.
В этом случае ‘1 +++++ 1’ правильно обрабатывается, так как фактор рекурсивно принимает + (вероятно, предназначен для унарного +/-).
Разделите это
factor = ('-' >> value[_val=-_1])
| ('+' >> value[_val= _1])
| value [_val = _1];
value = double_ | '(' >> expression >> ')'