Я пытаюсь написать (частичный) парсер CSS с помощью Boost.Spirit X3.
У меня (очень) базовая настройка работает:
const auto declaration_block_def = '{' >> +declaration >> '}';
const auto declaration_def = property >> ':' >> value >> ';';
const auto property_def = +(char_ - ":");
const auto value_def = +(char_ - ";");
Здесь value
- это простой анализатор строк, а property
таблица символов всех имен свойств CSS для перечисления, в котором перечислены все свойства. Но теперь мне интересно, не смог бы я каким-то образом закодировать все возможные пары ключ-значение строго типизированным способом? Конкретно, я бы использовал symbols<enum_type>
с соответствующими записями таблицы символов для каждого свойства, у которого есть фиксированное число возможностей, и какое-то пользовательское правило для более сложных свойств, таких как цвета.
Дело в том, что правило declaration
должно иметь определенный атрибут, а в CSS блок объявления может содержать любое количество элементов со своим собственным типом «атрибута». В конце я хотел бы получить структуру, которую я передал бы BOOST_FUSION_ADAPT_STRUCT в следующем виде:
enum class align_content : std::uint8_t;
enum class align_items : std::uint8_t;
enum class align_self : std::uint8_t;
struct declaration_block
{
css::align_content align_content{};
css::align_items align_items{};
css::align_self align_self{};
};
Который затем будет правильно инициализировать по умолчанию любые неопределенные элементы.
Я вижу несколько проблем с X3, которые я не знаю, как решить:
- Строго типизированный атрибут правила, как указано выше
- Адаптированная для fusion структура ожидает, что все члены будут проанализированы, что исключает мое представление о том, что мой простой подход действительно работает.
Я нашел то, что похоже на реализацию Boost.Spirit.Qi 2 , но, поскольку X3 настолько отличается, и их конечный результат кажется неясным, я не могу найти никакой помощи в этом .. .