hobbes
a language, embedded compiler, and runtime for efficient dynamic expression evaluation, data storage and analysis
dfa.H
Go to the documentation of this file.
1 /*
2  * dfa : constructs a DFA for pattern match translation
3  */
4 
5 #ifndef HOBBES_LANG_PAT_DFA_HPP_INCLUDED
6 #define HOBBES_LANG_PAT_DFA_HPP_INCLUDED
7 
9 #include <hobbes/util/str.H>
11 #include <unordered_map>
12 #include <set>
13 
14 namespace hobbes {
15 
16 typedef size_t stateidx_t;
17 typedef std::set<stateidx_t> stateidxset;
18 
19 typedef std::pair<std::string, MonoTypePtr> PrimFArg;
20 typedef std::vector<PrimFArg> PrimFArgs;
21 
22 // the various states of pattern matching
23 class MState {
24 public:
25  virtual std::string stamp() = 0;
26 
27  // how many times is this state referenced?
28  // (if 0, we can cull the state, if >1 we may want to fold the state into a function)
29  size_t refs;
30 
31  // does this state represent the start of a primitive match?
32  // if so, we may be able to translate it to an efficient low-level matching function directly
34  PrimFArgs primFArgs;
35 
36  // improves performance of case-analysis over instances (to avoid 'dynamic_cast')
37 public:
38  int case_id() const;
39 protected:
40  MState(int cid);
41 private:
42  int cid;
43 };
44 
45 template <typename Case>
46  class MStateCase : public MState {
47  public:
48  MStateCase();
49  };
50 
51 class LoadVars : public MStateCase<LoadVars> {
52 public:
53  typedef std::pair<std::string, ExprPtr> Def;
54  typedef std::vector<Def> Defs;
55 
56  LoadVars(const Defs&, stateidx_t);
57  const Defs& defs() const;
58  stateidx_t nextState() const;
59 
60  std::string stamp();
61 
62  static const int type_case_id = 0;
63 private:
64  Defs ds;
65  stateidx_t next;
66 };
67 
68 class SwitchVal : public MStateCase<SwitchVal> {
69 public:
70  typedef std::pair<PrimitivePtr, stateidx_t> Jump;
71  typedef std::vector<Jump> Jumps;
72 
73  SwitchVal(const std::string&, const Jumps&, stateidx_t);
74  const std::string& switchVar() const;
75  const Jumps& jumps() const;
76  stateidx_t defaultState() const;
77 
78  std::string stamp();
79 
80  static const int type_case_id = 1;
81 private:
82  std::string var;
83  Jumps jmps;
84  stateidx_t def;
85 };
86 
87 class SwitchVariant : public MStateCase<SwitchVariant> {
88 public:
89  typedef std::pair<std::string, stateidx_t> CtorJump;
90  typedef std::vector<CtorJump> CtorJumps;
91 
92  SwitchVariant(const std::string&, const CtorJumps&, stateidx_t);
93  const std::string& switchVar() const;
94  const CtorJumps& jumps() const;
95  stateidx_t defaultState() const;
96 
97  std::string stamp();
98 
99  static const int type_case_id = 2;
100 private:
101  std::string var;
102  CtorJumps jmps;
103  stateidx_t def;
104 };
105 
106 class FinishExpr : public MStateCase<FinishExpr> {
107 public:
108  FinishExpr(const ExprPtr&);
109 
110  const ExprPtr& expr() const;
111 
112  std::string stamp();
113 
114  static const int type_case_id = 3;
115 private:
117 };
118 
119 extern stateidx_t nullState;
120 
121 template <typename Case>
123  }
124 
125 typedef std::shared_ptr<MState> MStatePtr;
126 typedef std::vector<MStatePtr> MStates;
127 
128 // destruction-side for high-level pattern representations
129 template <typename T>
130  struct switchMState {
131  virtual T with(const LoadVars*) const = 0;
132  virtual T with(const SwitchVal*) const = 0;
133  virtual T with(const SwitchVariant*) const = 0;
134  virtual T with(const FinishExpr*) const = 0;
135  };
136 
137 template <typename T>
138  T switchOf(const MState& s, const switchMState<T>& f) {
139  switch (s.case_id()) {
140  case LoadVars::type_case_id:
141  return f.with((const LoadVars*)&s);
142  case SwitchVal::type_case_id:
143  return f.with((const SwitchVal*)&s);
144  case SwitchVariant::type_case_id:
145  return f.with((const SwitchVariant*)&s);
146  case FinishExpr::type_case_id:
147  return f.with((const FinishExpr*)&s);
148  default:
149  throw std::runtime_error("Internal error, cannot switch on unknown match state");
150  }
151  }
152 
153 template <typename T>
154  T switchOf(const MStatePtr& s, const switchMState<T>& f) {
155  return switchOf(*s, f);
156  }
157 
158 // DFA construction from annotated/normalized pattern match tables
159 typedef std::unordered_map<std::string, stateidx_t> StatesIdx;
160 
161 typedef std::unordered_map<std::string, ExprPtr> VarNames; // memoize usage of variable names
162 typedef std::map<size_t, ExprPtr> ArrayElem;
163 typedef std::unordered_map<std::string, ArrayElem> VarArrayElem; // memoize array 'element' access in match variables
164 typedef std::unordered_map<std::string, ExprPtr> VarArrayLen; // memoize array 'size' access in match variables
165 typedef std::unordered_map<std::string, ExprPtr> StructField;
166 typedef std::unordered_map<std::string, StructField> VarStructField; // memoize struct field access in match variables
167 
168 typedef std::pair<std::string, ExprPtr> FoldedState;
169 typedef std::vector<FoldedState> FoldedStates; // local functions for states that should be lifted out
170 typedef std::unordered_map<stateidx_t, ExprPtr> FoldedStateCalls; // call expressions into states that have been folded into local functions
171 
172 typedef std::unordered_map<PatternRows, stateidx_t, hobbes::genHash<PatternRows>> TableCfgStates; // map distinct pattern table configs to their corresponding states (avoid reconstructing the whole state description)
173 
174 typedef std::unordered_map<Expr*, size_t> ExprIdxs; // map back from result expressions to row IDs
175 
176 struct MDFA {
177  // the lexical extent of the whole match in the original source program
179 
180  // dfa state
181  MStates states;
182  StatesIdx statesIdx;
183  TableCfgStates tableCfgStates;
184  ExprIdxs exprIdxs;
185  bool inPrimSel;
186 
188  cc* c;
189 
190  // memo expressions
191  VarNames varExps;
192  VarArrayElem elementExps;
193  VarArrayLen sizeExps;
194  VarStructField fieldExps;
195 
196  // fold states with multiple references into local functions
197  FoldedStates foldedStates;
198  FoldedStateCalls foldedStateCalls;
199 };
200 
201 stateidx_t makeDFA(MDFA*, const PatternRows&, const LexicalAnnotation&);
202 stateidx_t makeDFAState(MDFA* dfa, const PatternRows& ps);
203 
205 
206 }
207 
208 #endif
209 
std::pair< PrimitivePtr, stateidx_t > Jump
Definition: dfa.H:70
Definition: dfa.H:23
bool inPrimSel
Definition: dfa.H:185
PrimFArgs primFArgs
Definition: dfa.H:34
std::string var
Definition: dfa.H:82
std::unordered_map< std::string, ExprPtr > VarArrayLen
Definition: dfa.H:164
CtorJumps jmps
Definition: dfa.H:102
std::unordered_map< std::string, ExprPtr > VarNames
Definition: dfa.H:161
std::unordered_map< std::string, ArrayElem > VarArrayElem
Definition: dfa.H:163
VarNames varExps
Definition: dfa.H:191
std::shared_ptr< MState > MStatePtr
Definition: dfa.H:125
ExprPtr exp
Definition: dfa.H:116
std::set< stateidx_t > stateidxset
Definition: dfa.H:17
VarArrayElem elementExps
Definition: dfa.H:192
stateidx_t makeDFA(MDFA *, const PatternRows &, const LexicalAnnotation &)
Definition: dfa.C:1005
MStates states
Definition: dfa.H:181
std::pair< std::string, stateidx_t > CtorJump
Definition: dfa.H:89
str::set rootVars
Definition: dfa.H:187
std::pair< std::string, ExprPtr > FoldedState
Definition: dfa.H:168
std::vector< CtorJump > CtorJumps
Definition: dfa.H:90
std::vector< MStatePtr > MStates
Definition: dfa.H:126
std::unordered_map< Expr *, size_t > ExprIdxs
Definition: dfa.H:174
Definition: expr.H:507
std::unordered_map< std::string, ExprPtr > StructField
Definition: dfa.H:165
Definition: dfa.H:130
std::map< size_t, ExprPtr > ArrayElem
Definition: dfa.H:162
Definition: boot.H:7
VarStructField fieldExps
Definition: dfa.H:194
std::unordered_map< std::string, StructField > VarStructField
Definition: dfa.H:166
FoldedStates foldedStates
Definition: dfa.H:197
FoldedStateCalls foldedStateCalls
Definition: dfa.H:198
Definition: dfa.H:51
virtual std::string stamp()=0
std::pair< std::string, ExprPtr > Def
Definition: dfa.H:53
MStateCase()
Definition: dfa.H:122
std::vector< FoldedState > FoldedStates
Definition: dfa.H:169
std::unordered_map< std::string, stateidx_t > StatesIdx
Definition: dfa.H:159
Definition: dfa.H:46
std::vector< PrimFArg > PrimFArgs
Definition: dfa.H:20
ExprPtr liftDFAExpr(cc *, const PatternRows &, const LexicalAnnotation &)
Definition: dfa.C:1204
Definition: dfa.H:68
stateidx_t def
Definition: dfa.H:84
std::vector< Jump > Jumps
Definition: dfa.H:71
Definition: dfa.H:176
size_t refs
Definition: dfa.H:29
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
stateidx_t makeDFAState(MDFA *dfa, const PatternRows &ps)
Definition: dfa.C:943
bool isPrimMatchRoot
Definition: dfa.H:33
T switchOf(const MStatePtr &s, const switchMState< T > &f)
Definition: dfa.H:154
Jumps jmps
Definition: dfa.H:83
ExprIdxs exprIdxs
Definition: dfa.H:184
Definition: cc.H:64
Definition: lannotation.H:22
std::unordered_map< stateidx_t, ExprPtr > FoldedStateCalls
Definition: dfa.H:170
stateidx_t next
Definition: dfa.H:65
int cid
Definition: dfa.H:42
int case_id() const
Definition: dfa.C:18
std::set< std::string > set
Definition: str.H:241
size_t stateidx_t
Definition: dfa.H:16
Defs ds
Definition: dfa.H:64
std::string var
Definition: dfa.H:101
std::unordered_map< PatternRows, stateidx_t, hobbes::genHash< PatternRows > > TableCfgStates
Definition: dfa.H:172
MState(int cid)
Definition: dfa.C:17
VarArrayLen sizeExps
Definition: dfa.H:193
Definition: dfa.H:106
std::vector< Def > Defs
Definition: dfa.H:54
stateidx_t def
Definition: dfa.H:103
cc * c
Definition: dfa.H:188
virtual T with(const LoadVars *) const =0
TableCfgStates tableCfgStates
Definition: dfa.H:183
LexicalAnnotation rootLA
Definition: dfa.H:178
StatesIdx statesIdx
Definition: dfa.H:182
Definition: dfa.H:87
std::vector< PatternRow > PatternRows
Definition: pattern.H:31
stateidx_t nullState
Definition: dfa.C:14
std::pair< std::string, MonoTypePtr > PrimFArg
Definition: dfa.H:19