My Project
parser.h
1 //#include "interpolate.h"
2 
3 #include "srell/srell.hpp"
4 
5 #include <filesystem>
6 #include <kblib/poly_obj.h>
7 #include <map>
8 
9 namespace fs = std::filesystem;
10 
11 namespace parser {
12 
13 class TokenStream;
14 
15 namespace AST {
16 
17  struct ASTNode {
18  // virtual void parse(TokenStream& input) = 0;
19 
20  virtual ~ASTNode() = default;
21 
22  static constexpr std::size_t max_derived_size = 64;
23  };
24 
25  template <typename T, typename B = ASTNode>
26  struct List : B {
27  std::vector<T> vals;
28  static_assert(std::is_base_of_v<ASTNode, B>);
29  };
30  template <typename K, typename V, typename B = ASTNode>
31  struct Map : B {
32  std::map<K, V> vals;
33  static_assert(std::is_base_of_v<ASTNode, B>);
34  };
35  template <typename B, typename... Ts>
36  struct BTuple : B {
37  std::tuple<Ts...> vals;
38  static_assert(std::is_base_of_v<ASTNode, B>);
39  };
40  template <typename... Ts>
41  using Tuple = BTuple<ASTNode, Ts...>;
42 
43  struct TExpr : ASTNode {
44  static constexpr std::size_t max_derived_size =
45  sizeof(ASTNode) + sizeof(std::string) + sizeof(std::vector<int>);
46  };
47  struct TLiteral : TExpr {
48  std::string val;
49  };
50  struct TFCall : TExpr {
51  std::string fname;
52  std::vector<kblib::poly_obj<TExpr>> args;
53  };
54  struct TArgRef : TExpr {
55  std::string name;
56  };
57  struct TDots : TArgRef {};
58 
59  struct String : ASTNode {
60  template <typename... Ts>
61  std::tuple<std::optional<Ts>...> refine() const;
62  static constexpr std::size_t max_derived_size =
63  sizeof(ASTNode) + sizeof(std::vector<int>);
64  };
65  struct tname : String {
66  std::string name;
67  int argc;
68  bool variadic;
69  };
70  struct LString final : String {
71  std::string val;
72  };
73  struct IString : String {};
74  struct TString : String {
75  std::vector<std::variant<std::string, TExpr>> contents;
76  };
77 
78  struct replace_stage : ASTNode {};
79  struct regex_action final : ASTNode {
80  srell::regex r;
81  std::string m;
82  };
83  struct regex_stage final : List<regex_action, replace_stage> {};
84  struct state_machine final : replace_stage {};
85 
86  struct Replacement_group final : ASTNode {
87  std::map<std::string, List<kblib::poly_obj<replace_stage>>> actions;
88  };
89  struct Control final : ASTNode {
90  std::map<std::string, std::string> channel_names;
91  std::map<tname, TString> functions;
92  std::vector<Replacement_group> replacements;
93  IString entry_point;
94 
95  // void parse(TokenStream& input) override;
96  };
97 
98  struct Alternative : ASTNode {
99  auto val() const -> String&;
100  std::variant<double, TString> freq;
102  };
103 
104  struct Node {};
105  struct NormalNode final : List<Alternative> {};
106  struct LiteralNode final : Alternative {};
107 
108  struct Datafile final : ASTNode {
109  Control control;
111  };
112 } // namespace AST
113 
114 } // namespace parser
Definition: parser.h:70
Definition: parser.h:31
Definition: parser.h:89
Definition: parser.h:17
Definition: parser.h:73
Definition: parser.h:50
Definition: parser.h:65
Definition: parser.h:104
Definition: parser.h:79
Definition: parser.h:59
Definition: parser.h:47
Definition: parser.h:98
Definition: parser.h:83
Definition: parser.h:54
Definition: parser.h:84
Definition: parser.h:36
Definition: parser.h:108
Definition: parser.h:43
Definition: parser.h:74
Definition: parser.h:57
Definition: parser.h:78
Definition: parser.h:11
Definition: parser.h:106
Definition: parser.h:26
Definition: parser.h:86
Definition: parser.h:105