aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-dataloader/v2script/DecisionGrammar.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-dataloader/v2script/DecisionGrammar.hpp')
-rw-r--r--src/openvic-dataloader/v2script/DecisionGrammar.hpp115
1 files changed, 24 insertions, 91 deletions
diff --git a/src/openvic-dataloader/v2script/DecisionGrammar.hpp b/src/openvic-dataloader/v2script/DecisionGrammar.hpp
index 3bd5cba..05cb8cc 100644
--- a/src/openvic-dataloader/v2script/DecisionGrammar.hpp
+++ b/src/openvic-dataloader/v2script/DecisionGrammar.hpp
@@ -1,109 +1,49 @@
#pragma once
-#include <vector>
-
#include <openvic-dataloader/v2script/AbstractSyntaxTree.hpp>
#include <lexy/callback.hpp>
#include <lexy/callback/adapter.hpp>
+#include <lexy/callback/constant.hpp>
#include <lexy/callback/container.hpp>
#include <lexy/dsl.hpp>
+#include <lexy/dsl/brackets.hpp>
#include <lexy/dsl/option.hpp>
+#include <lexy/dsl/position.hpp>
+#include <lexy/dsl/production.hpp>
-#include "AiBehaviorGrammar.hpp"
-#include "SimpleGrammar.hpp"
-#include "TriggerGrammar.hpp"
+#include "v2script/AiBehaviorGrammar.hpp"
+#include "v2script/TriggerGrammar.hpp"
// Decision Grammar Definitions //
namespace ovdl::v2script::grammar {
- //////////////////
- // Macros
- //////////////////
-// Produces <KW_NAME>_rule and <KW_NAME>_p
-#define OVDL_GRAMMAR_KEYWORD_DEFINE(KW_NAME) \
- struct KW_NAME##_rule { \
- static constexpr auto keyword = LEXY_KEYWORD(#KW_NAME, lexy::dsl::inline_<Identifier<StringEscapeOption>>); \
- static constexpr auto rule = keyword >> lexy::dsl::equal_sign; \
- static constexpr auto value = lexy::noop; \
- }; \
- static constexpr auto KW_NAME##_p = lexy::dsl::p<KW_NAME##_rule>
-
-// Produces <KW_NAME>_rule and <KW_NAME>_p and <KW_NAME>_rule::flag and <KW_NAME>_rule::too_many_error
-#define OVDL_GRAMMAR_KEYWORD_FLAG_DEFINE(KW_NAME) \
- struct KW_NAME##_rule { \
- static constexpr auto keyword = LEXY_KEYWORD(#KW_NAME, lexy::dsl::inline_<Identifier<StringEscapeOption>>); \
- static constexpr auto rule = keyword >> lexy::dsl::equal_sign; \
- static constexpr auto value = lexy::noop; \
- static constexpr auto flag = lexy::dsl::context_flag<struct KW_NAME##_context>; \
- struct too_many_error { \
- static constexpr auto name = "expected left side " #KW_NAME " to be found once"; \
- }; \
- }; \
- static constexpr auto KW_NAME##_p = lexy::dsl::p<KW_NAME##_rule> >> (lexy::dsl::must(KW_NAME##_rule::flag.is_reset()).error<KW_NAME##_rule::too_many_error> + KW_NAME##_rule::flag.set())
- //////////////////
- // Macros
- //////////////////
struct DecisionStatement {
- template<auto Production, typename AstNode>
- struct _StringStatement {
- static constexpr auto rule = Production >> (lexy::dsl::p<StringExpression<StringEscapeOption>> | lexy::dsl::p<Identifier<StringEscapeOption>>);
- static constexpr auto value = lexy::forward<ast::NodePtr>;
- };
- template<auto Production, typename AstNode>
- static constexpr auto StringStatement = lexy::dsl::p<_StringStatement<Production, AstNode>>;
+ using potential = fkeyword_rule<"potential", lexy::dsl::p<TriggerBlock>>;
+ using allow = fkeyword_rule<"allow", lexy::dsl::p<TriggerBlock>>;
+ using effect = fkeyword_rule<"effect", lexy::dsl::p<TriggerBlock>>;
+ using ai_will_do = fkeyword_rule<"ai_will_do", lexy::dsl::p<AiBehaviorBlock>>;
- OVDL_GRAMMAR_KEYWORD_FLAG_DEFINE(potential);
- OVDL_GRAMMAR_KEYWORD_FLAG_DEFINE(allow);
- OVDL_GRAMMAR_KEYWORD_FLAG_DEFINE(effect);
- OVDL_GRAMMAR_KEYWORD_FLAG_DEFINE(ai_will_do);
+ using helper = dsl::rule_helper<potential, allow, effect, ai_will_do>;
- static constexpr auto rule = [] {
- constexpr auto create_flags =
- potential_rule::flag.create() +
- allow_rule::flag.create() +
- effect_rule::flag.create() +
- ai_will_do_rule::flag.create();
+ struct List {
+ static constexpr auto rule = dsl::curly_bracketed.opt_list(helper::p | lexy::dsl::p<SAssignStatement<StringEscapeOption>>);
- constexpr auto potential_statement = potential_p >> lexy::dsl::p<TriggerBlock>;
- constexpr auto allow_statement = allow_p >> lexy::dsl::p<TriggerBlock>;
- constexpr auto effect_statement = effect_p >> lexy::dsl::p<TriggerBlock>;
- constexpr auto ai_will_do_statement = ai_will_do_p >> lexy::dsl::p<AiBehaviorBlock>;
+ static constexpr auto value = lexy::as_list<ast::AssignStatementList> >> construct_list<ast::ListValue>;
+ };
- return lexy::dsl::p<Identifier<StringEscapeOption>> >>
- (create_flags + lexy::dsl::equal_sign +
- lexy::dsl::curly_bracketed.list(
- potential_statement |
- allow_statement |
- effect_statement |
- ai_will_do_statement |
- lexy::dsl::p<SimpleAssignmentStatement<StringEscapeOption>>));
- }();
+ static constexpr auto rule =
+ dsl::p<Identifier<StringEscapeOption>> >>
+ (helper::flags + lexy::dsl::equal_sign + lexy::dsl::p<List>);
- static constexpr auto value =
- lexy::as_list<std::vector<ast::NodePtr>> >>
- lexy::callback<ast::NodePtr>(
- [](auto&& name, auto&& list) {
- return ast::make_node_ptr<ast::DecisionNode>(LEXY_MOV(name), LEXY_MOV(list));
- },
- [](auto&& name, lexy::nullopt = {}) {
- return ast::make_node_ptr<ast::DecisionNode>(LEXY_MOV(name));
- });
+ static constexpr auto value = construct<ast::AssignStatement>;
};
struct DecisionList {
static constexpr auto rule =
- LEXY_KEYWORD("political_decisions", lexy::dsl::inline_<Identifier<StringEscapeOption>>) >>
- (lexy::dsl::equal_sign + lexy::dsl::curly_bracketed.opt_list(lexy::dsl::p<DecisionStatement>));
+ ovdl::dsl::keyword<"political_decisions">(lexy::dsl::inline_<Identifier<StringEscapeOption>>) >>
+ (lexy::dsl::equal_sign >> lexy::dsl::curly_bracketed.opt_list(lexy::dsl::p<DecisionStatement>));
- static constexpr auto value =
- lexy::as_list<std::vector<ast::NodePtr>> >>
- lexy::callback<ast::NodePtr>(
- [](auto&& list) {
- return ast::make_node_ptr<ast::DecisionListNode>(LEXY_MOV(list));
- },
- [](lexy::nullopt = {}) {
- return lexy::nullopt {};
- });
+ static constexpr auto value = lexy::as_list<ast::AssignStatementList>;
};
struct DecisionFile {
@@ -111,15 +51,8 @@ namespace ovdl::v2script::grammar {
static constexpr auto whitespace = whitespace_specifier | comment_specifier;
static constexpr auto rule =
- lexy::dsl::terminator(lexy::dsl::eof).list( //
- lexy::dsl::p<DecisionList> | //
- lexy::dsl::p<SimpleAssignmentStatement<StringEscapeOption>>);
+ lexy::dsl::position + lexy::dsl::terminator(lexy::dsl::eof).opt_list(lexy::dsl::p<DecisionList>);
- static constexpr auto value = lexy::as_list<std::vector<ast::NodePtr>> >> lexy::new_<ast::FileNode, ast::NodePtr>;
+ static constexpr auto value = lexy::concat<ast::AssignStatementList> >> construct<ast::FileTree>;
};
-
-#undef OVDL_GRAMMAR_KEYWORD_DEFINE
-#undef OVDL_GRAMMAR_KEYWORD_FLAG_DEFINE
-#undef OVDL_GRAMMAR_KEYWORD_STATEMENT
-#undef OVDL_GRAMMAR_KEYWORD_FLAG_STATEMENT
} \ No newline at end of file