11 class syntax_primitive;
86 std::u32string m_value;
174 std::u32string m_name;
175 std::vector<component_value> m_value;
182 char32_t m_associated_token = 0;
183 std::vector<component_value> m_value;
188 using value_type = std::variant<
232 std::unique_ptr<function> m_value;
246 std::unique_ptr<simple_block> m_value;
250 using value_type = std::variant<
288 : m_value(container_sb(value))
292 explicit component_value(syntax_primitive
const& value);
294 template <
typename T>
295 explicit component_value(T
const& value)
302 component_value& operator=(component_value
const&) =
default;
306 switch (m_value.index())
339 bool has_value()
const {
return m_value.index() != 0; }
341 template <
typename T>
344 if constexpr (std::is_same_v<T, function>)
346 assert(std::holds_alternative<container_fn>(m_value));
347 return *std::get_if<container_fn>(&m_value)->m_value;
349 else if constexpr (std::is_same_v<T, simple_block>)
351 assert(std::holds_alternative<container_sb>(m_value));
352 return *std::get_if<container_sb>(&m_value)->m_value;
356 assert(std::holds_alternative<T>(m_value));
357 return *std::get_if<T>(&m_value);
361 template <
typename T>
364 if constexpr (std::is_same_v<T, function>)
366 assert(std::holds_alternative<container_fn>(m_value));
367 return *std::get_if<container_fn>(&m_value)->m_value;
369 else if constexpr (std::is_same_v<T, simple_block>)
371 assert(std::holds_alternative<container_sb>(m_value));
372 return *std::get_if<container_sb>(&m_value)->m_value;
376 assert(std::holds_alternative<T>(m_value));
377 return *std::get_if<T>(&m_value);
418 , m_prelude(rhs.m_prelude)
421 if (rhs.m_block) m_block = std::make_unique<simple_block>(*rhs.m_block.get());
429 m_prelude = rhs.m_prelude;
430 m_block = std::make_unique<simple_block>(*rhs.m_block);
439 std::u32string m_name;
440 std::vector<component_value> m_prelude;
441 std::unique_ptr<simple_block> m_block;
460 std::vector<component_value> m_prelude;
475 std::u32string m_name;
476 std::vector<component_value> m_value;
477 bool m_important_flag =
false;
484 using value_type = std::variant<
525 template <
typename T>
537 switch (m_value.index())
579 bool has_value()
const {
return m_value.index() != 0; }
581 template <
typename T>
584 assert(std::holds_alternative<T>(m_value));
585 return *std::get_if<T>(&m_value);
588 template <
typename T>
591 assert(std::holds_alternative<T>(m_value));
592 return *std::get_if<T>(&m_value);
604 using container = std::vector<syntax_primitive>;
606 using const_iterator =
typename container::const_iterator;
618 operator bool()
const;
620 bool operator !()
const;
622 std::size_t size()
const;
624 const_iterator begin()
const;
626 const_iterator end()
const;
638 void advance(const_iterator it);
640 bool skip_whitespace();
643 const_iterator m_first;
644 const_iterator m_last;