В настоящее время я работаю над анализатором выражений на основе Spirit, который должен разрешать в конце (в далеком будущем) выражения, такие как
"a*b*c"
"10+20*x.y.z"
"a.b.c[ a.b ][ e.c( d.e()*4 )].e.f( (a.b+23)*d, -23*b.e(a.b.c) ).x.y"
дикое сочетание доступа к элементам, подписок массивов, вызова функций и выражений
[] -> subscription
() -> function call or expression bracket
. member chaining
в настоящее время я борюсь с пропуском пробелов в цепочке членов
"a . b . c"
недопустимо в моем мире - но анализируется из-за возможности пропуска пробелов
try онлайн моя уменьшенная выборка: https://wandbox.org/permlink/o5kcYtUQEfKZqJgw
Проблема в строке 23:
qi::rule<std::string::iterator, qi::blank_type, utree()> identifier_chain
= identifier >> *('.' >> identifier);
Я не могу использовать qi :: lexeme вокруг правила, я ' Я получу ошибку, которая не может быть преобразована в Skipper, но это сработает, если я скопирую свое полное правило идентификатора в правило identifier_chain
qi::rule<std::string::iterator, qi::blank_type, utree()> identifer_chain
= qi::lexeme[qi::ascii::alpha >> *(qi::ascii::alnum | '_')
>> *('.' >> qi::ascii::alpha >> *(qi::ascii::alnum | '_'))];
, но это кажется излишним, и я думаю, что копирование вызовет у меня проблемы в будущем когда синтаксический анализатор растет
любая идея, как использовать лексему или что-то еще, чтобы сохранить мой '.' подключается без пробелов, так что подписка заканчивается и цепочка членов сильно соединена
].a
a.b
, это единственное место в моем парсере, где пропуск пространства не нужен, в остальном идеально подходит для уменьшения кода парсера
Спасибо за любую помощь / подсказки