Euphoria
tracery.h
Go to the documentation of this file.
1 #pragma once
2 
3 
4 
5 #include <memory>
6 #include <map>
7 
8 
9 namespace eu
10 {
11  struct Random;
12 }
13 
14 
15 namespace eu::core::tracery
16 {
17  struct Result
18  {
19  enum Error
20  {
29  };
30 
32  std::vector<std::string> text;
33 
34  Result(Error t);
35 
36  [[nodiscard]] std::string get_text() const;
37 
38  // todo(Gustav): replace with chaining member function
39  Result& operator<<(const std::string& t);
40  operator bool() const;
41  };
42 
43 
44  std::string to_string(const Result& r);
45 
46 
47  struct GeneratorArgument;
48 
49 
50  struct Node
51  {
52  Node() = default;
53  virtual ~Node();
54 
55  Node(const Node&) = delete;
56  Node(Node&&) = delete;
57  void operator=(const Node&) = delete;
58  void operator=(Node&&) = delete;
59 
60  virtual Result flatten(GeneratorArgument* generator) const = 0;
61  };
62 
63 
64  struct Modifier
65  {
66  Modifier() = default;
67  virtual ~Modifier();
68 
69  Modifier(const Modifier&) = delete;
70  Modifier(Modifier&&) = delete;
71  void operator=(const Modifier&) = delete;
72  void operator=(Modifier&&) = delete;
73 
74  virtual Result apply_modifier(const std::string& input) = 0;
75  };
76 
77 
78  struct Rule
79  {
80  std::vector<std::shared_ptr<Node>> syntax;
81 
82  Rule();
83 
84  Result compile(const std::string& s);
85  void add(std::shared_ptr<Node> p);
86 
87  Result flatten(GeneratorArgument* gen) const;
88  };
89 
90 
91  struct Symbol
92  {
93  std::string key;
94  std::vector<Rule> ruleset;
95 
96  explicit Symbol(const std::string& k);
97 
98  Result add_rule(const std::string& rule);
99  Result flatten(GeneratorArgument* gen) const;
100  };
101 
102 
103  struct Grammar
104  {
105  std::map<std::string, Symbol> rules;
106  std::map<std::string, std::shared_ptr<Modifier>> modifiers;
107 
108 
110 
111  void register_english();
112 
113  [[nodiscard]] Result load_from_string(const std::string& filename, const std::string& data);
114 
115  Grammar& register_modifier(const std::string& name, std::shared_ptr<Modifier> m);
116 
117  [[nodiscard]] Result get_string_from_symbol(const std::string& rule, GeneratorArgument* generator) const;
118  [[nodiscard]] Result apply_modifier(const std::string& name, const std::string& data) const;
119  [[nodiscard]] Result flatten(Random* random, const std::string& rule) const;
120  };
121 
122 }
123 
std::string to_string(const Result &r)
Definition: tracery.cc:191
Definition: assert.h:90
WEL512 Random Number Generator.
Definition: random.h:21
std::map< std::string, Symbol > rules
Definition: tracery.h:105
Grammar & register_modifier(const std::string &name, std::shared_ptr< Modifier > m)
Definition: tracery.cc:647
Result flatten(Random *random, const std::string &rule) const
Definition: tracery.cc:667
std::map< std::string, std::shared_ptr< Modifier > > modifiers
Definition: tracery.h:106
Result get_string_from_symbol(const std::string &rule, GeneratorArgument *generator) const
Definition: tracery.cc:628
Result load_from_string(const std::string &filename, const std::string &data)
Definition: tracery.cc:591
Result apply_modifier(const std::string &name, const std::string &data) const
Definition: tracery.cc:655
void operator=(const Modifier &)=delete
Modifier(Modifier &&)=delete
Modifier(const Modifier &)=delete
virtual Result apply_modifier(const std::string &input)=0
void operator=(Modifier &&)=delete
virtual Result flatten(GeneratorArgument *generator) const =0
void operator=(Node &&)=delete
void operator=(const Node &)=delete
Node(const Node &)=delete
Node(Node &&)=delete
Result & operator<<(const std::string &t)
Definition: tracery.cc:166
std::vector< std::string > text
Definition: tracery.h:32
std::string get_text() const
Definition: tracery.cc:180
std::vector< std::shared_ptr< Node > > syntax
Definition: tracery.h:80
void add(std::shared_ptr< Node > p)
Definition: tracery.cc:381
Result compile(const std::string &s)
Definition: tracery.cc:248
Result flatten(GeneratorArgument *gen) const
Definition: tracery.cc:367
std::vector< Rule > ruleset
Definition: tracery.h:94
Result add_rule(const std::string &rule)
Definition: tracery.cc:393
Symbol(const std::string &k)
Definition: tracery.cc:389
Result flatten(GeneratorArgument *gen) const
Definition: tracery.cc:406
ADD_DEFAULT_FORMATTER(eu::core::tracery::Result, std::string, eu::core::tracery::to_string)