#pragma once #include #include #include #include #include #include "openvic-dataloader/NodeLocation.hpp" #include "SimpleGrammar.hpp" #include "TriggerGrammar.hpp" #include "detail/dsl.hpp" namespace ovdl::v2script::grammar { constexpr auto modifier_keyword = LEXY_KEYWORD("modifier", id); constexpr auto factor_keyword = LEXY_KEYWORD("factor", id); struct FactorStatement { static constexpr auto rule = lexy::dsl::position(factor_keyword) >> (lexy::dsl::equal_sign + lexy::dsl::p>); static constexpr auto value = dsl::callback( [](ast::ParseState& state, NodeLocation loc, ast::IdentifierValue* value) { auto* factor = state.ast().create(loc, state.ast().intern("factor")); return state.ast().create(loc, factor, value); }); }; struct ModifierList { struct expected_factor { static constexpr auto name = "expected factor in modifier"; }; static constexpr auto rule = [] { auto factor_flag = lexy::dsl::context_flag; auto element = (lexy::dsl::p >> factor_flag.set()) | lexy::dsl::p; return dsl::curly_bracketed.list(factor_flag.create() + element) >> lexy::dsl::must(factor_flag.is_reset()).error; }(); static constexpr auto value = lexy::as_list >> construct_list; }; struct ModifierStatement { static constexpr auto rule = lexy::dsl::position(modifier_keyword) >> lexy::dsl::equal_sign >> lexy::dsl::p; static constexpr auto value = dsl::callback( [](ast::ParseState& state, NodeLocation loc, ast::ListValue* list) { auto* factor = state.ast().create(loc, state.ast().intern("modifier")); return state.ast().create(loc, factor, list); }); }; }